5.1 整合环境搭建
5.1.1 准备jar包
-
Spring
aopalliance-1.0.jar
aspectjweaver-1.8.10.jar
spring-aop-4.3.6.RELEASE.jar
spring-aspects-4.3.6.RELEASE.jar
spring-beans-4.3.6.RELEASE.jar
spring-context-4,3.6.RELEASE.jar
spring-core-4.3.6.RELEASE.jar
spring-expression-4.3.6.RELEASE.jar
spring-jdbc-4.3.6.RELEASE.jar
spring-tx-4.3.6.RELEASE.jar
-
MyBatis
ant-1.9.6.jar
ant-launcher-1.9.6.jar
asm-5.1.jar
cglib-3.2.4.jar
commons-logging-1.2.jar
javassist-3.21.0-GA.jar
log4j-1.2.17.jar
log4j-api-2.3ar
log4j-core-2.3.jar
mybatis-3.4.2.jar
ognl-3.1.12.jar
slf4j-api-1.7.22.jar
slf4j-log4j12-1.7.22.jar
-
整合所需中间jar包
MyBatis-Spring-1.3.1.jar -
数据库驱动jar包
mysql-connector-java-5.1.7-bin.jar -
数据源所需JAR
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.2.jar
5.1.2 编写配置文件
创建工程,添加jar包。
示例5-1
创建db.properties、Spring配置文件、MyBatis配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root
jdbc.maxTotal=30
jdbc.maxIdle=10
jdbc.initialSize=5
<?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
">
<!-- 1.连接数据库-->
<!-- 读取db.properties-->
<context:property-placeholder location="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>
<!-- 事务管理器,依赖数据源-->
<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="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
</beans>
<?xml version="1.0" encoding="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.ssm.po"/>
</typeAliases>
<!-- 配置mapper-->
<mappers>
</mappers>
</configuration>
5.2 整合
5.2.1 传统DAO开发整合
需要编写dao接口以及接口实现类,向dao实现类中注入SqlSessionFactory,在方法体内通过SqlSessionFactory创建SqlSession。
SqlSessionTemplate:Mybatis-Spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的。它还管理SqlSession的生命周期,包含必要的关闭、提交和回滚操作。
SqlSessionDaoSupport:一个抽象支持类,它继承了DaoSupport类,主要是作为DAO的基类来使用。可以通过SqlSessionDaoSupport类的getSqlSession()方法来获取所需的SqlSession。
示例5-2
1.实现持久层
- 创建com.ssm.po包,创建User
package com.ssm.po;
public class User {
private Integer id;
private String username;
private String jobs;
private String phone;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", jobs='" + jobs + '\'' +
", phone='" + 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;
}
}
- 创建映射文件UserMapper.xml
<?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">
<mapper namespace="com.ssm.po.User">
<select id="findUserById" parameterType="Interger" resultType="User">
select * from t_user where id=#{id}
</select>
</mapper>
在MyBatis中配置
<mappers>
<mapper resource="com/ssm/mapper/UserMapper.xml"
</mappers>
2.实现DAO层
- 创建com.ssm.dao,创建接口UserDao,编写方法
package com.ssm.dao;
import com.ssm.po.User;
public interface UserDao {
public User findUserById(Integer id);
}
- 创建com.ssm.dao.Impl,创建接口实现类
package com.ssm.dao.impl;
import com.ssm.dao.UserDao;
import com.ssm.po.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
public User findUserById(Integer id) {
return this.getSqlSession().selectOne("com.ssm.mapper.UserMapper.findUserById",id);
}
}
- 在applicationContext.xml中实例化UserDaoImpl
<bean id="userDao" class="com.ssm.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
3.整合测试
创建com.ssm.test包,编写测试类
package com.ssm.test;
import com.ssm.dao.UserDao;
import com.ssm.po.User;
import org.apache.ibatis.session.SqlSession;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class findUserByIdDaoTest {
public static void main(String[] args){
// 初始化Spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过容器获取实例
UserDao userDao= (UserDao) applicationContext.getBean("userDao");
// 调用方法
User user=userDao.findUserById(1);
System.out.println(user);
}
}
5.2.2 mapper接口方式的开发整合
1.基于MapperFactoryBean的整合
mapperInterface:用于指定接口。
SqlSessionFactory:用于指定SqlSessionFactory。
SqlSessionTemplate:用于指定SqlSessionTemplate。若与SqlSessionFactory同时设定,则只会启用SqlsessionTemplate
示例 5-3
- mapper下创建接口
package com.ssm.mapper;
import com.ssm.po.User;
public interface UserMapper {
public User findUserById(Integer id);
}
- 引入MyBatis配置
- 在Spring中创建id为userMapper的bean
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.ssm.mapper.UserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
- 编写测试类
package com.ssm.test;
import com.ssm.mapper.UserMapper;
import com.ssm.po.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class findUserByIdMapperTest {
public static void main(String[] args){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
UserMapper userMapper= (UserMapper) applicationContext.getBean("userMapper");
User user=userMapper.findUserById(1);
System.out.println(user);
}
}
虽然使用Mapper接口编程的方式很简单,但是在具体使用时还是需要遵循以下规范。
(1)Mapper接口的名称和对应的Mapper.xml映射文件的名称必须一致。
(2)Mapper.xml文件中的namespace与Mapper接口的类路径相同(即接口文件和映射文件需要放在同一个包中)。
(3)Mapper接口中的方法名和Mapper.xml中定义的每个执行语句的id相同。
(4)Mapper接口中方法的输入参数类型要和Mapper.xml中定义的每个SQL的parameterType的类型相同。
(5)Mapper接口方法的输出参数类型要和Mapper.xml中定义的每个SQL的resultType的类型相同。只要遵循了这些开发规范,MyBatis就可以自动生成Mapper接口实现类的代理对象,从而简化开发。
2. 基于MapperScannerConfigurer的整合
basePackage:指定映射接口文件所在的包路径,当需要扫描多个包时可以使用分号或逗号作为分隔符。指定包路径后,会扫描该包及其子包中的所有文件。
annotationClass:指定要扫描的注解名称,只有被注解标识的类才会被配置为映射器。
sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称。
sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean名称。若定义此属性,则sqlSessionFactoryBeanName将不起作用。
markerInterface:指定创建映射器的接口。