整合Mybatis

  1. 导入依赖
    1. mysql
      <!--spring操作数据库需要一个Spring-jdbc-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.8.RELEASE</version>
      </dependency>
      
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
      </dependency>
      
    2. junit
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
      </dependency>
      
    3. mybatis
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
      </dependency>
      
    4. spring
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
      </dependency>
      
    5. aop
      <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.6</version>
      </dependency>
      
    6. Spring-mybatis
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.5</version>
      </dependency>
      
    7. 整合
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
        <scope>test</scope>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.21</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.5</version>
      </dependency>
      <!-- Spring-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.8.RELEASE</version>
      </dependency>
      <!--spring操作数据库需要一个Spring-jdbc-->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.2.8.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.6</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.0.5</version>
      </dependency>
      
  2. 编写配置文件

  3. 测试

1. 回忆Mybatis

  1. 编写实体类
  2. 编写核心配置文件
  3. 编写接口
  4. 编写Mapper.xml
  5. 测试

2. Mybatis-Spring

首先要说:

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,

它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序

如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源,如果创建一个池,用池来管理Connection,这样就可以重复使用Connection。

有了池我们就不用自己来创建Connection,而是通过池来获取Connection对象。

当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

这里我们常用的连接池有两种,分别是:DBCP连接池和C3P0连接池

UserMapper mapper = sqlSession.getMapper(UserMapper.class);
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
UserMapper mapper = context.getBean("userMapper", UserMapper.class);    

//关于这里为什么用UserMapper接口而不是实现类,因为我们是面向接口编程,用接口来上转型
  • 整理思路:
    1. 首先,相比较原来单独mybatis,使用Spring是为了节省我们新建对象的麻烦,那么为了省去这些麻烦,比如SqlSessionFactory,读取配置文件,创建Sqlssion等,我们需要将他们配置到Spring的配置文件里

    2. Spring配置文件首先需要两个东西,第一个是DataSouece,spring操作数据库需要一个Spring-jdbc包,这一步的目的是将原来mybatis核心配置文件里的环境配置挪到这里

      <!--DateSource:使用Spring的数据源替换Mybatis的配置   c3p0,dbcp druid
       这里使用Spring提供的jDBC
      -->
      <bean id="dataSouece" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
       <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
       <property name="url"
                 value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT"/>
       <property name="username" value="root"/>
       <property name="password" value="zhaosiyu123"/>
      </bean>
      
    3. 第二个东西,是SqlSessionFactory,使用SqlSessionFactoryBean包,这里来绑定上方的数据源以及mybatis的核心配置文件,以及Mapper映射器,也可以在这里绑定
      <!--SqlSessionFactory-->
      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSouece"/>
           <!--绑定Mybatis的配置文件-->
       <property name="configLocation" value="classpath:mybatis-config.xml"/>
       <property name="mapperLocations" value="classpath:com/zhaox/mapper/*.xml"/>
      </bean>
      
    4. 有了SqlSessionFactory,我们接下来就需要创建SqlSession,SqlSession在Spring里是一个SqlSessionTemplate对象,他没有set方法,所以只能用构造函数注入,参数就是SqlSessionFactory,相当于原来mybatis里sqlSessionFactory.openSession();这一步。
      <!--就是我们使用的SqlSessionTemplate-->
      <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
       <!--只能使用构造器注入,因为他没有Set方法-->
       <constructor-arg index="0" ref="sqlSessionFactory"/>
      </bean>
      
    5. 在原来进行测试的时候,我们还是需要新建mapper类,因此在Spring里我们就需要新建一个专门用来操作mapper的类,也就是mapper实现类。我们通过在实现类里设置一个SqlSessionTemplate属性,并设置set方法,方便我们在bean里注册(初始化时为其赋值)
      public class UserMapperImpl implements UserMapper {
       //我们的所有操作原来都使用SqlSession来来执行,现在都使用SqlSessionTemplate
       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. 万事俱备,只欠东风,准备测试类直接调用方法就可以了

  • 简化操作:

    1. DateSource,SqlSessionFactory(设置,别名优化最好留在Mybatis)
    2. 使用XXXXTemplate:创建SqlSession(以后会遇到,Redis,Thyme等)
    3. 将Mybatis的配置和工具类里SqlSessionFactory的一些操作全部丢给Spring,让Spring得到一个整合的SqlSessionTemplate,在这个类里之前的全部动作都被整合
    4. 创建一个接口实现类,这个类里有之前的SqlSessionTemplate,还需要一个Set方法方便注入,这样可以直接得到SqlSessionTemplate
    5. 获得Mapper,使用Mapper直接使用方法
  • Mybatis与Mybatis-Spring的区别:
    1. 后者可以将Mybatis 的配置文件完全挪走
    2. 后者可以完全不需要新建对象,只需要再Spring中配置bean就可以了
    3. 但是这就需要我们新建一个实现类,因为原来我们调用得到的mapeer是一个接口类型,而Spring是不支持创建一个接口bean的!所以我们需要创建一个实现类,封装mapper的操作,然后再由Spring注册这个实现类,通过实现类来进行方法的调用

3. Mybatis-Spring(使用SqlSessionDaoSupport)

在上面的整合中,我们需要在实现类里注入一个SqlsessionTemplate,这有一些麻烦,这里我们可以让实现类继承一个类SqlSessionDaoSupport。

继承之后我们可以直接使用这个父类的方法得到SqlSession,当然sqlSessionFactory也是需要注入的

<bean id="userMapper2" class="com.zhaox.mapper.UserMapperImpl2">
    <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

这样我们就不需要SqlsessionTemplate来获得SqlSession了。


醉后不知天在水,满船清梦压星河