Spring-狂神(7. 整合MyBatis)学习笔记

文章目录

  • 1. 步骤
  • 2. MyBatis-Spring学习
  • 3. 整合实现一
  • 4. 整合实现二
  • 5. 总结

1. 步骤

  1. 配置 POM 文件
  • junit

    <dependency>
       <groupId>junitgroupId>
       <artifactId>junitartifactId>
       <version>4.12version>
    dependency>
    
  • mybatis

    <dependency>
       <groupId>org.mybatisgroupId>
       <artifactId>mybatisartifactId>
       <version>3.5.2version>
    dependency>
    
  • mysql-connector-java

    <dependency>
       <groupId>mysqlgroupId>
       <artifactId>mysql-connector-javaartifactId>
       <version>5.1.47version>
    dependency>
    
  • spring相关

    <dependency>
       <groupId>org.springframeworkgroupId>
       <artifactId>spring-webmvcartifactId>
       <version>5.1.10.RELEASEversion>
    dependency>
    <dependency>
       <groupId>org.springframeworkgroupId>
       <artifactId>spring-jdbcartifactId>
       <version>5.1.10.RELEASEversion>
    dependency>
    
  • aspectJ AOP 织入器

    
    <dependency>
       <groupId>org.aspectjgroupId>
       <artifactId>aspectjweaverartifactId>
       <version>1.9.4version>
    dependency>
    
  • mybatis-spring整合包

    <dependency>
       <groupId>org.mybatisgroupId>
       <artifactId>mybatis-springartifactId>
       <version>2.0.2version>
    dependency>
    
  • 配置Maven静态资源过滤问题!

    <build>
       <resources>
           <resource>
               <directory>src/main/javadirectory>
               <includes>
                   <include>**/*.propertiesinclude>
                   <include>**/*.xmlinclude>
               includes>
               <filtering>truefiltering>
           resource>
       resources>
    build>
    
  1. 编写配置文件
  2. 代码实现

2. MyBatis-Spring学习

  1. 什么是 MyBatis-Spring?
    MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中
  2. 知识基础
    1. 使用 Maven 作为构建工具,需要在 pom.xml 中加入依赖
    2. 要和 Spring 一起使用 MyBatis,需要在 Spring 应用上下文中定义至少两样东西:一个 SqlSessionFactory 和至少一个数据映射器类
    3. 在 MyBatis-Spring 中,可使用SqlSessionFactoryBean来创建 SqlSessionFactory。要配置这个工厂 bean,只需要把下面代码放在 Spring 的 XML 配置文件中
    	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	 <property name="dataSource" ref="dataSource" />
    	bean>
    
    1. 注意:SqlSessionFactory需要一个 DataSource(数据源)。这可以是任意的 DataSource,只需要和配置其它 Spring 数据库连接一样配置它就可以了。
    2. MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来创建 SqlSessionFactory
    3. 在 MyBatis 中,你可以使用 SqlSessionFactory 来创建 SqlSession。一旦你获得一个 session 之后,你可以使用它来执行映射了的语句,提交或回滚连接,最后,当不再需要它的时候,你可以关闭 session
    4. SqlSessionFactory有一个唯一的必要属性:用于 JDBC 的 DataSource。这可以是任意的 DataSource 对象,它的配置方法和其它 Spring 数据库连接是一样的
    5. 一个常用的属性是 configLocation,它用来指定 MyBatis 的 XML 配置文件路径。它在需要修改 MyBatis 的基础配置非常有用。通常,基础配置指的是 < settings> 或 < typeAliases>元素
    6. 需要注意的是,这个配置文件并不需要是一个完整的 MyBatis 配置。确切地说,任何环境配置(environments),数据源(DataSource)和 MyBatis 的事务管理器(transactionManager)都会被忽略。SqlSessionFactoryBean 会创建它自有的 MyBatis 环境配置(Environment),并按要求设置自定义环境的值
    7. SqlSessionTemplate 是 MyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替你代码中已经在使用的 SqlSession
    8. 模板可以参与到 Spring 的事务管理中,并且由于其是线程安全的,可以供多个映射器类使用,你应该总是用 SqlSessionTemplate 来替换 MyBatis 默认的 DefaultSqlSession 实现。在同一应用程序中的不同类之间混杂使用可能会引起数据一致性的问题
    9. 可以使用 SqlSessionFactory 作为构造方法的参数来创建 SqlSessionTemplate 对象
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
     <constructor-arg index="0" ref="sqlSessionFactory" />
    bean>
    
    1. 现在,这个 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...;
    }
    }
    
    1. 注入 SqlSessionTemplate:
    <bean id="userDao" class="org.mybatis.spring.sample.dao.UserDaoImpl">
     <property name="sqlSession" ref="sqlSession" />
    bean>
    

3. 整合实现一

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

    
    <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. 配置数据源 dataSource

    
    <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&useUnicode=true&characterEncoding=utf8"/>
       <property name="username" value="root"/>
       <property name="password" value="123456"/>
    bean>
    
  3. 配置 SqlSessionFactory,关联MyBatis

    
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource"/>
       
       <property name="configLocation" value="classpath:mybatis-config.xml"/>
       <property name="mapperLocations" value="classpath:com/kuang/dao/*.xml"/>
    bean>
    
  4. 注册 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. 将上面写的实现类,注入 Spring 中

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

       @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);
      }
    

    结果成功输出!现在我们的Mybatis配置文件的状态

    
    
    <configuration>
       <typeAliases>
           <package name="com.pojo"/>
       typeAliases>
    configuration>
    
    

4. 整合实现二

  • mybatis-spring1.2.3版以上的才有:
    dao继承Support类 , 直接利用 getSqlSession() 获得 , 然后直接注入SqlSessionFactory . 比起方式1 , 不需要管理SqlSessionTemplate , 而且对事务的支持更加友好 . 可跟踪源码查看

测试

  1. 将我们上面写的UserDaoImpl修改一下

    public class UserDaoImpl extends SqlSessionDaoSupport implements UserMapper {
       public List<User> selectUser() {
            //SqlSession sqlSession = getSqlSession();
            //UserMapper mapper = sqlSession.getMapper(UserMapper.class);
            //return mapper.getAllUsers();
            // 上述代码,链式编程为:
            return getSqlSession().getMapper(UserMapper.class).getAllUsers();
    
      }
    }
    
  2. 修改bean的配置

    <bean id="userDao" class="com.dao.UserDaoImpl">
       <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    bean>
    
  3. 删除 Spring-config 中的 sqlSession 配置

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

    @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);
    }
    

5. 总结

整合到spring以后可以完全不要mybatis的配置文件,除了这些方式可以实现整合之外,还可以使用注解来实现

你可能感兴趣的:(Spring,spring)