一、MyBatis与Spring的整合
思路:
spring的特点就是对系统的一个调度管理。我们可以使用spring的声明式的方式或者注解方式来以单例的方式管理sqlSessionFactory。
spring整合mybatis,通过生成的代理对象来使用SqlSessionFactory创建SqlSession。或者将mapper交由spring进行管理。
首先引入spring和MyBatis各自的jar包引入spring与MyBatis整合的包
配置spring中的配置文件applicationContext.xml
1. 配置管理sqlSessionFactory
2. 配置管理数据源
3. 配置管理mapper对象
二、通过上次的MyBatis项目我们改变成整合spring和MyBatis
首先是实体类:Admin:
package com.dqsy.sm.entity;
public class Admin {
private int deptId;
private String name;
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Admin [deptId=" + deptId + ", name=" + name + "]";
}
}
package com.dqsy.sm.entity;
import java.math.BigDecimal;
public class Employee implements java.io.Serializable{
/**
* 添加序列化,防止在高并发的时候出现错误,无法查找
*/
private static final long serialVersionUID = 1L;
private int empId;
private String empName;
private String gender;
private String email;
private BigDecimal salary;
private String jobTitle;
private int deptId;
private Department dept;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public String getJobTitle() {
return jobTitle;
}
public void setJobTitle(String jobTitle) {
this.jobTitle = jobTitle;
}
public int getDeptId() {
return deptId;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public Department getDept() {
return dept;
}
public void setDept(Department dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Employee [empId=" + empId + ", empName=" + empName + ", gender=" + gender + ", email=" + email
+ ", salary=" + salary + ", jobTitle=" + jobTitle + ", deptId=" + deptId + ", dept=" + dept + "]";
}
}
package com.dqsy.sm.entity;
import java.util.List;
public class Department implements java.io.Serializable{
/**
* 添加序列化
*/
private static final long serialVersionUID = 1L;
private int deptId;
private String deptName;
private List<Employee> emps;
public int getDeptId() {
return deptId;
}
public List<Employee> getEmps() {
return emps;
}
public void setEmps(List<Employee> emps) {
this.emps = emps;
}
public void setDeptId(int deptId) {
this.deptId = deptId;
}
public String getDeptName() {
return deptName;
}
public void setDeptName(String deptName) {
this.deptName = deptName;
}
@Override
public String toString() {
return "Department [deptId=" + deptId + ", deptName=" + deptName + ", emps=" + emps + "]";
}
}
package com.dqsy.sm.mapper;
import com.dqsy.sm.entity.Department;
public interface DepartmentMapper {
public Department getDepartmentById(int deptId);
}
package com.dqsy.sm.mapper;
import com.dqsy.sm.entity.Employee;
public interface EmployeeMapper {
public Employee getEmployeeByIdLazyLoad(int empId);
}
<?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.dqsy.sm.mapper.AdminMapper">
<insert id="addAdmin" keyProperty="admin" >
<selectKey keyProperty="deptId" keyColumn="dept_id" resultType="int" order="AFTER">
select last_insert_id() as deptId
</selectKey>
insert into admin(name) values(#{name})
</insert>
</mapper>
<?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.dqsy.sm.mapper.DepartmentMapper">
<!--
cache的基本参数
eviction:绘存的回收策略,默认为LRU
LRU:移除近期最少用的对象
FIFO:first in first out 先进先出
SOFT:软引用,移除基于垃圾回收状态和软件引用对象
WEAK:弱引用,更积极的移除基于垃圾回收状态和软件引用对象
flushIntercal:刷新缓存,单位是毫秒,默认不自动刷新,可以为任意正整数,在增删改时会刷新
size:缓存对象数目,默认是1024次查询结果.
reakOnly:只读,默认是false
-->
<cache eviction="LRU" size="1024" flushInterval="60000" readOnly="true" ></cache>
<select id="getDepartmentById" parameterType="int" resultType="department" useCache="false">
select dept_id,dept_name from department where dept_id=#{deptId}
</select>
</mapper>
<?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.dqsy.sm.mapper.EmployeeMapper">
<!-- sql片段 -->
<sql id="sql_collection">
emp_id,emp_name,gender,email,salary,job_title,dept_id
</sql>
<resultMap type="employee" id="empLazyLoadResultMap">
<id column="emp_id" property="empId"/>
<result column="emp_name" property="empName"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
<result column="salary" property="salary"/>
<result column="job_title" property="jobTitle"/>
<association property="dept" javaType="department"
select="com.dqsy.sm.mapper.DepartmentMapper.getDepartmentById" column="dept_id">
</association>
</resultMap>
<select id="getEmployeeByIdLazyLoad" parameterType="int" resultMap="empLazyLoadResultMap">
select
<include refid="sql_collection"></include>
from employee where emp_id=#{empId}
</select>
</mapper>
在建立service层:package com.dqsy.sm.service;
import java.util.List;
import com.dqsy.sm.entity.Employee;
public interface EmployeeService {
/**
* 根据员工ID查员工信息
*/
public Employee getEmpByIdLazyLoad(int empId);
/**
* 根据部门ID查员工信息
*/
public List<Employee> getEmpsBydeptIdLazyLoad(int deptId);
}
创建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:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
<!-- 配置包扫描 -->
<context:component-scan base-package="com.dqsy.sm"></context:component-scan>
<!-- 导入外部资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 注册Spring自带的管理数据库连接的数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!-- 数据库连接的四要素 -->
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!-- 注册事务管理器 -->
<bean id="txMgr" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置MyBatis的sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
<!-- 单独为每个Mapper接口配置一个代理 -->
<bean id="employeeMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.dqsy.sm.mapper.EmployeeMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
<bean id="departmentMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="com.dqsy.sm.mapper.DepartmentMapper"></property>
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
</beans>
mybatis-config.xml的配置文件中的环境就不用配置了,因为applicationContext.xml已经配置了,所以不用配置了<?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>
<properties resource="jdbc.properties"></properties>
<!-- 开启驼峰命名法规则,create_time 就等于createTime -->
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启延迟加载 -->
<!-- 延迟加载总开关 -->
<setting name="lazyLoadingEnabled" value="true"/>
<!-- 开启需要加载开关 -->
<setting name="aggressiveLazyLoading" value="false"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 设置别名 -->
<typeAliases>
<!-- 单个别名设置 -->
<!-- <typeAlias type="com.dqsy.mybatis.entity.User" alias="user"/> -->
<!-- 批量设置别名 -->
<package name="com.dqsy.sm.entity"/>
</typeAliases>
<mappers>
<!-- 第一种方式 resource -->
<!-- <mapper resource="com/dqsy/mybatis/mapper/UserMapper.xml" /> -->
<!-- 第二种方式 class -->
<!--<mapper class="com.dqsy.mybatis.mapper.UserMapper"/> -->
<!-- 第三种方式 pacgages -->
<package name="com/dqsy/sm/mapper"/>
</mappers>
</configuration>
编写测试文件:测试结果: