目录
一、整合环境搭建
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包
(2)MyBatis框架所需的JAR包
(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执行上述方法后,控制台的输出结果如图所示。
从图可以看出,通过CustomerDao实例的findCustomerByld()方法已经查询出了id为1的客户信息,这也就说明了MyBatis 与 Spring整合成功。