Spring与MyBatis的整合、编写配置文件和两种整合方式

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 + "条数据");
	}
}


声明:
若本人发布的作品涉及版权或存在其他问题,请联系我删除。
谢谢浏览!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值