目录

一、整合环境搭建

1、准备所需JAR包

(1)Spring框架所需的JAR包

(2)MyBatis框架所需的JAR包

(3)MyBatis与Spring整合的中间JAR

(4)数据库驱动JAR(MySQL) 

(5)数据源所需JAR(DBCP)

2、编写配置文件

(1)创建项目,引入JAR包  

(2)编写db.properties 

(3)编写Spring配置文件applicationContext.xml

(4)编写MyBatis配置文件mybatis-config.xml 

 (5)引入log4j.properties

二、传统DAO方式的开发整合

1.实现持久层

2.实现DAO层

3.整合测试

一、整合环境搭建

1、准备所需JAR包

要实现MyBatis与Spring的整合,很明显需要这两个框架的JAR包,但是只使用这两个框架中所提供的JAR包是不够的,还需要其他的JAR包来配合使用,整合时所需准备的JAR包具体如下

下载jar包的仓库链接:https://mvnrepository.com/

(1)Spring框架所需的JAR包

springboot mybatis监控insert是被最后一次操作_eclipse

(2)MyBatis框架所需的JAR包

springboot mybatis监控insert是被最后一次操作_java_02

(3)MyBatis与Spring整合的中间JAR

  • mybatis-spring-1.3.1.jar

(4)数据库驱动JAR(MySQL) 

  • mysql-connector-java-5.1.40-bin.jar

(5)数据源所需JAR(DBCP)

  • commons-dbcp2-2.1.1.jar
  • commons-pool2-2.4.2.jar

2、编写配置文件

(1)创建项目,引入JAR包  

在Eclipse中,创建一个名称为chapter10的Web项目,将上一小节中所准备的全部JAR包添加到项目的lib目录中,并发布到类路径下。

(2)编写db.properties 

jdbc.driver=com.mysql.jdbc.Driver
 jdbc.url=jdbc:mysql://localhost:3306/mybatis
 jdbc.username=root
 jdbc.password=root
 jdbc.maxTotal=30
 jdbc.maxIdle=10
 jdbc.initialSize=5

(3)编写Spring配置文件applicationContext.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"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:tx="http://www.springframework.org/schema/tx"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd         http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
     <!-- 读取数据库配置属性文件db.properties -->
    <context:property-placeholder location="classpath:db.properties"/>


<!--配置数据源,意思就是要连接一个什么样的数据库  -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     <!-- 1.1数据库的驱动 -->
     <property name="driverClassName" value="${jdbc.driver}"></property>
     <!-- 1.2数据库的url-->
     <property name="url" value="${jdbc.url}"></property>
     <!-- 1.3数据库的用户名-->
     <property name="username" value="${jdbc.username}"></property>
     <!-- 1.4数据库的密码-->
     <property name="password" value="${jdbc.password}"></property>
     <!--最大连接数-->
     <property name="maxTotal" value="${jdbc.maxTotal}"/>
     <!--最大空闲连接-->
     <property name="maxIdle" value="$ {jdbc.maxIdle}"/>
     <!--初始化连接数―->
     <property name="initialsize" value="${jdbc.initialsize}" />
         </bean>       <!--  事务管理器,依赖于数据源-->
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
         <property name="dataSource" ref="dataSource"></property>
        </bean>
        
        <!-- 注册事务管理驱动,也叫开启事务注解 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
        
        <!-- 配置mybatis工厂 -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
                <!-- 注入数据源,也是给SqlSessionFactoryBean类的属性赋值 -->
                <property name="dataSource" ref="dataSource"></property>
                <!-- 指定mybatis的核心配置文件的位置 -->
                <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        </bean></beans>

首先定义了读取 properties文件的配置,然后配置了数据源,接下来配置了事务管理器并开启了事务注解,最后配置了MyBatis 工厂来与Spring 整合。其中,MyBatis工厂的作用就是构建 SqlSessionFactory,它是通过 mybatis-spring 包中提供的 org.mybatis.spring.SqlSessionFactoryBean类来配置的。通常,在配置时需要提供两个参数:一个是数据源,另一个是MyBatis 的配置文件路径。这样Spring 的 loC容器就会在初始化id 为sqlSessionFactory的 Bean时解析 MyBatis 的配置文件,并与数据源一同保存到 Spring 的 Bean中。

(4)编写MyBatis配置文件mybatis-config.xml 

<?xml version="1.0" encpding="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.itheima.po"/></typeAliases>
     <!--配置Mapper的位置-->
     <mappers>
         ...
     </mappers>
 </configuration>

 (5)引入log4j.properties

# Global logging configuration
 log4j.rootLogger=ERROR, stdout
 # MyBatis logging configuration...
 log4j.logger.com.itheima=DEBUG
 # Console output...
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

二、传统DAO方式的开发整合

上一小节已经完成了对MyBatis 与 Spring 整合环境的搭建工作,可以说完成了这些配置后,就已经完成了这两个框架大部分的整合工作。接下来,本小节将通过传统DAO层开发的方式,来演示这两个框架实际的整合使用。
采用传统DAO开发方式进行MyBatis 与 Spring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过SqlSessionFactory 创建 SqlSession。为此,我们可以使用mybatis-spring包中所提供的SqlSessionTemplate类SqlSessionDaoSupport类来实现此功能。这两个类的描述如下。

  • SqlSessionTemplate:是mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的。它还管理SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
  • SqlSessionDaoSupport:是一个抽象支持类,它继承了DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqlSession。

了解了传统DAO开发方式整合可以使用的两个类后,下面以 SqlSessionDaoSupport类的使用为例,讲解传统的DAO开发方式整合的实现,其具体步骤如下。

1.实现持久层

(1)在src目录下,创建一个com.itheima.po包,并在包中创建持久化类Customer,在Customer类中定义相关属性和方法

public class Customer {
     //主键id
     private Integer id;
     //客户名称
     private String username;
     //客户职业
     private String jobs;
     //客户电话
     private String phone;
     public Integer getId() {
         return id;
     }
     public void setId(Integer id) {
         this.id = id;
     }
     public String getUsername() {
         return username;
     }
     public void setUsername(String username) {
         this.username = username;
     }
     public String getJobs() {
         return jobs;
     }
     public void setJobs(String jobs) {
         this.jobs = jobs;
     }
     public String getPhone() {
         return phone;
     }
     public void setPhone(String phone) {
         this.phone = phone;
     }
     @Override
     public String toString() {
         return "Customer [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
     }
 }

(2)在 com.itheima.po包中,创建映射文件 CustomerMapper.xml,在该文件中编写根据id查询客户信息的映射语句

<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <!--namespace名称空间实际上是当前的xml的包路径  -->
 <mapper namespace="com.itheima.po.CustomerMapper">    <select id="findCustomerById" parameterType="Integer" resultType="customer">
         select  * from t_customer where id = #{id}
     </select>
 </mapper>

(3)在 MyBatis 的配置文件mybatis-config.xml中,配置映射文件 CustomerMapper.xml的位置,具体如下。

<mappers>
          <mapper resource="com/itheima/po/CustomerMapper.xml"/>
 </mappers>

2.实现DAO层

(1)在src目录下,创建一个com.itheima.dao包,并在包中创建接口CustomerDao,在接口中编写一个通过id查询客户的方法findCustomerByld()

public interface CustomerDao {
     //通过id查询客户
     Customer findCustomerById(Integer id);
 }

(2)在 src目录下,创建一个com.itheima.dao.impl包,并在包中创建 CustomerDao接口的实现类CustomerDaolmpl

public class CustomerDaoImpl extends SqlSessionDaoSupport implements CustomerDao{
    //通过Id查询客户
     public Customer findCustomerById(Integer id) {
         return this.getSqlSession().selectOne("com.itheima.po.CustomerMapper.findCustomerById",id);
     }}

CustomerDaolmpl类继承了SqlSessionDaoSupport类,并实现了CustomerDao接口。其中,SqlSessionDaoSupport类在使用时需要一个 SqlSessionFactory 或一个SqlSessionTemplate对象,所以需要通过Spring给SqlSessionDaoSupport类的子类对象注入一个SqlSessionFactory或 SqlSessionTemplate。这样,在子类中就能通过调用SqlSessionDaoSupport类的getSqlSession()方法来获取SqlSession对象,并使用SqlSession对象中的方法了。

(3)在Spring 的配置文件 applicationContext.xml中,编写实例化CustomerDaolmpl的配置,代码如下所示。

<!--实例化Dao -->
<bean id="customerDao" class="com.itheima.dao.impl.CustomerDaoImpl">
     <!--注入SqlsessionFactory对象实例-->
     <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>

上述代码创建了一个id 为customerDao的 Bean,并将SqlSessionFactory对象注入到了该Bean的实例化对象中。

3.整合测试

在src目录下,创建一个com.itheima.test包,在包中创建测试类DaoTest,并在类中编写测试方法findCustomerByldDaoTest()

package com.itheima.test;
 import org.junit. Test;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationcontext;
 import com.itheima.dao.CustomerDao;
 import com.itheima.po.customer;
 /**
 *DAO 测试类
 */
 public class DaoTest {
     @Test
     public void findCustomerByIdDaoTest (){
         ApplicationContext act =
             new ClassPathxmlApplicationContext ("applicationContext.xml" );
     //根据容器中Bean的id来获取指定的Bean
     CustomerDao customerDao =
         (CustomerDao) act.getBean("customerDao");
     Customer customer =customerDao.findCustomerById(1);
     System.out.println(customer);
     }
 }

在上述方法中,我们采用的是根据容器中Bean的 id来获取指定Bean的方式。有些读者在通过其他一些参考资料学习时,可能还会看到另一种获取 Bean的方式,即根据类的类型来获取Bean的实例。如果要采用这种方式,只需将CustomerDao customerDao =
        (CustomerDao) act.getBean("customerDao");代码替换成如下。
 CustomerDao customerDao = act.getBean (CustomerDao.class);
这样在获取Bean的实例时,就不再需要进行强制类型转换了
使用JUnit4执行上述方法后,控制台的输出结果如图所示。

springboot mybatis监控insert是被最后一次操作_eclipse_03


从图可以看出,通过CustomerDao实例的findCustomerByld()方法已经查询出了id为1的客户信息,这也就说明了MyBatis 与 Spring整合成功。