Loading

Spring全解-08-整合Mybatis

整合Mybatis

pom.xml里导入相关jar包,添加静态资源过滤

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
</dependency>
<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.5.2</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.47</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjweaver</artifactId>
   <version>1.9.4</version>
</dependency>
<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis-spring</artifactId>
   <version>2.0.2</version>
</dependency>
<build>
   <resources>
       <resource>
           <directory>src/main/java</directory>
           <includes>
               <include>**/*.properties</include>
               <include>**/*.xml</include>
           </includes>
           <filtering>true</filtering>
       </resource>
   </resources>
</build>

要和Spring一起使用Mybatis,需要在Spring应用上下文中定义至少两样东西:

1.SqlSessionFactory

2.数据映射器类

在Spring中使用SqlSessionFactoryBean来创建SqlSessionFactory

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
 <property name="dataSource" ref="dataSource" />
</bean>

SqlSessionFactory需要一个DataSource(数据源),这可以是任意的,只需要和配置其它Spring数据库连接一样配置它就可以了。

在之前的Mybatis中,是通过SqlSessionFactoryBuild来创建SqlSessionFactory的,但是在Spring中是使用SqlSessionFactoryBean来创建的。

在Mybatis中,你可以使用SqlSeseionFactory来创建SqlSession。一旦以获得一个session后,你可以使用它来执行映射了的语句,提交或者回滚,最后不需要的时候,关闭资源。

SqlSessionFactory有一个唯一的必要属性,那就是用于JDBC的DataSource。这可以是任意的DataSource对象,它的配置方法和其他Spring数据库是一样的。

一个常用的属性是configLocation,它用来指定Mybatis的xml配置文件路径。

SqlSessionTemplate是Mybatis-Spring的核心。作为SqlSession的一个实现,这意味着可以使用它无缝代替代码中已经在使用的SqlSession。

可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象。使用构造器方式进行注入。

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
 <constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

现在,这个 bean 就可以直接注入到你的 DAO bean 中了。你需要在你的 bean 中添加一个 SqlSession 属性,就像下面这样:

public class UserDaoImpl implements UserDao {

 private SqlSession sqlSession;

 public void setSqlSession(SqlSession sqlSession) {
   this.sqlSession = sqlSession;
}

 public User getUser(String userId) {
   return sqlSession.getMapper...;
}
}

按下面这样,注入 SqlSessionTemplate:

<bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
 <property name="sqlSession" ref="sqlSession" />
</bean>

 

整合

有两种整合方式,区别在于一个是通过SqlSessionTemplate来生成SqlSession,另一个是直接通过继承Spring里的类SqlSessionDaoSupport直接调用里面的方法来得到SqlSession

第一种方式:通过SqlSessionTemplate来生成SqlSession

1.引入Spring配置文件beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

2.配置数据源替换mybatis数据源

<!--配置数据源:数据源有非常多,可以使用第三方的,也可使使用Spring的-->
<bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
   <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
   <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
   <property name="username" value="root"/>
   <property name="password" value="123456"/>
</bean>

3.配置SqlSessionFactory,关联Mybatis

configLocation关联mybatis-config.xml

mapperLocation关联mapper.xml文件

<!--配置SqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <!--关联Mybatis-->
   <property name="configLocation" value="classpath:mybatis-config.xml"/>
   <property name="mapperLocations" value="classpath:com/li/dao/*.xml"/>
</bean>

4.注册SqlSessionTemplate,关联SqlSessionFactory

<!--注册sqlSessionTemplate , 关联sqlSessionFactory-->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
   <!--利用构造器注入-->
   <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean> 

5.增加Dao接口的实现类,私有化SqlSessionTemplate

public class UserDaoImpl implements UserMapper {

   //sqlSession不用我们自己创建了,Spring来管理
   private SqlSessionTemplate sqlSession;

   public void setSqlSession(SqlSessionTemplate sqlSession) {
       this.sqlSession = sqlSession;
  }

   public List<User> selectUser() {
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       return mapper.selectUser();
  }
   
}

6.注册bean

<bean id="userDao" class="com.li.dao.UserDaoImpl">
   <property name="sqlSession" ref="sqlSession"/>
</bean>

7.测试

   @Test
   public void test2(){
       ApplicationContext context = newClassPathXmlApplicationContext("beans.xml");
       UserMapper mapper = (UserMapper) context.getBean("userDao");
       List<User> user = mapper.selectUser();
       System.out.println(user);
  }

Mybatis配置文件的状态

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
       PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <typeAliases>
       <package name="com.li.pojo"/>
   </typeAliases>
</configuration>

 

第二种方式:通过继承Spring里的类SqlSessionDaoSupport直接调用里面的方法来得到SqlSession

dao继承Support类,直接利用 getSqlSession()获得,然后直接注入SqlSessionFactory。比起方式1 ,不需要管理SqlSessionTemplate,而且对事务的支持更加友好,可跟踪源码查看。

public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
   public List<User> selectUser() {
       UserMapper mapper = getSqlSession().getMapper(UserMapper.class);
       return mapper.selectUser();
  }
}
<bean id="userDao" class="com.li.dao.UserDaoImpl">
   <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
@Test
public void test2(){
   ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
   UserMapper mapper = (UserMapper) context.getBean("userDao");
   List<User> user = mapper.selectUser();
   System.out.println(user);
}

两者的区别,即继承类可以直接注入SqlSessionFactory,注入SqlSessionTemplate的一步被封装起来了。

posted @ 2021-06-24 10:37  你比从前快乐;  阅读(58)  评论(0编辑  收藏  举报