1 整合环境的搭建
1.1 所需JAR包(手动拷贝方式)
1.1.1 Spring所需要的JAR包
1.1.2 MyBatis所需要的JAR包
1.1.3 MyBatis和Spring整合的中间JAR
- mybatis-spring-1.3.1.jar
1.1.4 数据库驱动JAR(MySQL)
- mysql-connector-java-5.1.40-bin.jar
1.1.5 数据源所需JAR(DBCP)
- commons-dbcp2-2.1.1.jar
- commons-pool2-2.4.1.jar
1.2 Maven添加依赖
在pom.xml文件中添加如下依赖(都可以在maven官网找到):
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- 使用properties属性来定义类库版本,下同 -->
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
1.2.1 properties属性
可以在pom.xml文件中添加<properties>
属性,用于定义类库版本。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<junit.version>4.12</junit.version>
<spring.version>5.2.5.RELEASE</spring.version>
<mybatis.version>3.5.4</mybatis.version>
<mybatis.spring.version>2.0.4</mybatis.spring.version>
<mysql.version>5.1.48</mysql.version>
<commons-dbcp.version>2.7.0</commons-dbcp.version>
</properties>
2 编写配置文件
2.1 创建项目,引入JAR包
在Eclipse中,创建一个Web项目,添加Spring和MyBatis的依赖。pom.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.edu.ujn</groupId>
<artifactId>ch10</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>ch10</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<junit.version>4.12</junit.version>
<spring.version>5.2.5.RELEASE</spring.version>
<mybatis.version>3.5.4</mybatis.version>
<mybatis.spring.version>2.0.4</mybatis.spring.version>
<mysql.version>5.1.48</mysql.version>
<commons-dbcp.version>2.7.0</commons-dbcp.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis.spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>${commons-dbcp.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven
defaults (may be moved to parent pom) -->
<plugins>
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
<plugin>
<artifactId>maven-site-plugin</artifactId>
<version>3.7.1</version>
</plugin>
<plugin>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.0.0</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.2 编写db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=
2.3 编写spring-mybatis.xml
将Spring和MyBatis的配置文件合并在一起,当然,分开也是可以的,在这里我们合在一起进行配置。
<?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/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
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="cn.edu.ujn" />
<!--读取db.properties -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--数据库驱动 -->
<property name="driverClassName" value="${jdbc.driver}" />
<!--连接数据库的url -->
<property name="url" value="${jdbc.url}" />
<!--连接数据库的用户名 -->
<property name="username" value="${jdbc.username}" />
<!--连接数据库的密码 -->
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 事务管理器,依赖于数据源 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--开启事务注解 -->
<tx:annotation-driven
transaction-manager="transactionManager" />
<!--配置MyBatis工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源 -->
<property name="dataSource" ref="dataSource" />
<!--指定核心配置文件位置 -->
<property name="typeAliasesPackage" value="cn.edu.ujn.ch10.dao" />
<!-- 自动扫描dao目录, 省掉mapper-resource里的手工配置 -->
<property name="mapperLocations" value="classpath:cn/edu/ujn/ch10/dao/*.xml" />
</bean>
<!-- 自动扫描的形式来配置MyBatis中的映射器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.edu.ujn.ch10.dao" />
<property name="sqlSessionFactoryBeanName"
value="sqlSessionFactory" />
</bean>
</beans>
2.4 引入log4j.properties
2.5 扩展
2.5.1 数据库连接池
2.5.1.1 dbcp2
Apache旗下的连接池,配置如下:
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class:"org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxTotal" value="${jdbc.maxTotal}" />
<property name="maxIdle" value="${jdbc.maxIdle}" />
<property name="initialSize" value="${jdbc.initialSize}" />
</bean>
同时,db.properties也需要增加几个配置(示例):
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8
jdbc.username=root
jdbc.password=
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5
2.5.1.2 阿里巴巴Druid连接池
配置起来的参数是比较多的。这里展示部分参数:
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!--初始化连接大小-->
<property name="initialSize" value="0" />
<!--连接池最大使用连接数量-->
<property name="'maxActive" value-="20" />
<!--连接池最小空闲-->
<property name="mindle" value="0">
<!--这里省略了一些参数-->
</bean>
在使用阿里巴巴的连接池的时候不要忘记在pom.xml文件中添加上相关的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.15</version>
</dependency>
3 传统DAO方式的开发整合
采用传统DAO开发方式进行MyBatis与Spring框架的整合时,可以使用mybatis-spring包中所提供的SqlSessionTemplate类或者SqlSessionDaoSupport类来实现。
- SqlSessionTemplate:是mybatis-spring的核心类,负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的。它还会管理SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
- SqlSessionDaoSupport:是一个抽象支持类,它继承了DaoSupport类,主要是作为DAO的基类来使用的。可以通过SqlSessionSupport类的getSqlSession()方法来获取所需要的SqlSession。
在这里,我们介绍一下实现类CustomerDaoImpl继承SqlSessionDaoSupport的实现,示例如下:
package cn.edu.ujn.ch10.dao;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class CustomerDaoImpl extends SqlSessionDaoSupport implements ICustomerDao {
// 依赖注入
@Autowired
@Override
// 复写父类的setter方法
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
// TODO Auto-generated method stub
super.setSqlSessionFactory(sqlSessionFactory);
}
@Override
public void add(Customer customer) {
// TODO Auto-generated method stub
// 下面两种插入的方法其实效果是等效的
//第一种使用statement
int update = this.getSqlSession().update("cn.edu.ujn.ch10.dao.CustomerMapper.insert", customer);
System.out.println("----添加了" + update + "条数据。");
//第二种使用Mapper接口
CustomerMapper mapper = this.getSqlSession().getMapper(CustomerMapper.class);
int insert = mapper.insert(customer);
System.out.println("----mapper增加了" + insert + "条数据");
}
}
JUnit测试代码如下:
package cn.edu.ujn.ch10;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.edu.ujn.ch10.dao.Customer;
import cn.edu.ujn.ch10.dao.ICustomerDao;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-mybatis.xml")
public class CustomerDaoImplTest {
@Autowired
private ICustomerDao customerDaoImpl;
@Test
public void addTest() {
Customer customer = new Customer();
customer.setUsername("6");
customer.setJobs("学生");
customer.setPhone("666");
this.customerDaoImpl.add(customer);
System.out.println("添加成功!");
}
4 Mapper接口方式的开发整合
在MtBatis+Spring的项目中,虽然使用传统的DAO开发方式可以实现所需要的功能,但是采用这种方式在实现类中会出现大量重复的代码,在方法中也需要指定映射文件中执行语句的id ,并且不能保证编写时id的正确性(在运行的时候才会知道)。这样,便可以使用另一种方式,即使用Mapper接口编程。使用这种方式就需要一个很重要的类:MapperFactoryBean。
4.1 基于MapperFactoryBean的整合
MapperFactoryBean是MyBatis-Spring团队提供的一个用于根据Mapper接口生成Mapper对象的类,该类在Spring配置文件中使用时可以配置如下参数:
- mapperInterface:用于指定接口
- SqlSessionFactory:用于指定SqlSessionFactory
- SqlSessionTemplate:用于指定SqlSessionTemplate。如果和SqlSessionFactory同时设定,则只会启用SqlSessionTemplate。
4.2 Mapper接口使用规范
虽然使用简单,但也存在一些使用规范:
- Mapper接口的名称和对应的Mapper.xml映射文件的名称必须相同
- Mapper.xml文件中的namespace与Mapper接口的类路径相同
- Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同
- Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个sql的parameterType的类型相同
- Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个sql的resultType的类型相同
4.3 基于MapperScannerConfigurer的整合
在实际中,DAO层包含的很多接口,如果我们每一个接口都在Spring的配置文件中配置,不但会增加工作量,还会使得Spring配置文件非常臃肿。采用自动扫描的形式来配置MyBatis中的映射器,即使用MapperScannerConfigurer类。
4.3.1 可配置的属性
- basePackage:指定映射接口文件所在的包路径,当需要扫描多个包的时候可以使用分号或者逗号作为分隔符。指定包路径后,会扫描该包及其子包中的所有文件。
- annotationClass:指定了要扫描的注解名称之后,只有被注解标识的类才会被配置为映射器
- sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称
- sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean名称,如果定义了此属性,则sqlSessionFactoryBeanName将不起作用
- markerInterface:指定创建映射器的接口
4.3.2 配置方式
只需要在Spring的配置文件中添加如下代码:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="cn.edu.ujn.ch10.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
通常情况下,MapperScannerConfigurer在使用的时候只需要通过basePackage属性来指定需要扫描的包即可,Spring会自动地通过包中的接口来生成映射器。这使得开发人员可以在编写很少的代码的情况下,完成对映射器的配置,从而提高开发效率。
4.3.3 测试示例
JUnit测试,直接注入CustomerMapper就可以了:
package cn.edu.ujn.ch10;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import cn.edu.ujn.ch10.dao.Customer;
import cn.edu.ujn.ch10.dao.CustomerMapper;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-mybatis.xml")
public class CustomerDaoImplTest {
@Autowired
private CustomerMapper customerMapper;
@Test
public void insertTset() {
Customer customer = new Customer();
customer.setUsername("11");
customer.setJobs("学生");
customer.setPhone("888888");
int insert = this.customerMapper.insert(customer);
System.out.println("成功添加" + insert + "条数据");
}
}
声明:
若本人发布的作品涉及版权或存在其他问题,请联系我删除。
谢谢浏览!