实现Spring和MyBatis整合
要在Spring中使用MyBatis,需要在Spring的配置文件中定义一些类
- SqlSessionFactoryBean
为整合应用提供SqlSession对象资源
- SqlSessionTemplate
负责管理MyBatis的SqlSession,调用SQL映射语句,实现对数据库的访问
- MapperFactoryBean
根据指定Mapper接口生成Bean实例
- MapperScannerConfigurer
根据指定包批量扫描Mapper接口并生成实例
二、为业务层添加声明式事务管理
配置声明式事务:
1、导入tx和aop命名空间
2、定义事务管理器Bean,并为其注入数据源Bean
3、通过<tx:advice>配置事务增强,绑定事务管理器并针对不同方法定义事务规则
4、配置切面,将事务增强与方法切入点组合
<!--声明式事务-->
<tx:advice id="interceptor" transaction-manager="transactionManager">
<tx:attributes>
<!--在什么方法上加上事务-->
<tx:method name="select*" propagation="SUPPORTS" isolation="DEFAULT"/>
<tx:method name="update*" propagation="REQUIRED" isolation="DEFAULT" />
<tx:method name="insert*" propagation="REQUIRED" isolation="DEFAULT"/>
<tx:method name="delete*" propagation="REQUIRED" isolation="DEFAULT" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pointcut" expression="execution(* org.example.service.*.*(..))"/>
<aop:advisor advice-ref="interceptor" pointcut-ref="pointcut"></aop:advisor>
</aop:config>事务属性:
1、propagation:事务传播机制
- REQUIRED(默认值)
- REQUIRES_NEW、MANDATORY、NESTED
- SUPPORTS
- NOT_SUPPORTED、NEVER
2、isolation:事务隔离等级
- DEFAULT(默认值)
- READ_COMMITTED
- READ_UNCOMMITTED
- REPEATABLE_READ
- SERIALIZABLE\

3、timeout:事务超时时间,允许事务运行的最长时间,以秒为单位。默认值为-1,表示不超时
4、read-only:事务是否为只读,默认值为false
5、rollback-for:设定能够触发回滚的异常类型
- Spring默认只在抛出runtime exception时才标识事务回滚
- 可以通过全限定类名指定需要回滚事务的异常,多个类名用逗号隔开
6、no-rollback-for:设定不触发回滚的异常类型
- Spring默认checked Exception不会触发事务回滚
- 可以通过全限定类名指定不需要回滚事务的异常,多个类名用逗号隔开
三、用户的增删改查例子
导入相关的依赖包
pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-orm -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>5.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-dbcp/commons-dbcp -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-model</artifactId>
<version>2.0.9</version>
<scope>test</scope>
</dependency>
</dependencies>配置文件
mybatisConfig.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>
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<typeAliases>
<package name="org.example.bean"/>
</typeAliases>
</configuration>applicationContext2.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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<!--导入db.properties log4j.properties-->
<context:property-placeholder location="classpath*:db.properties" system-properties-mode="NEVER"/>
<context:property-placeholder location="classpath*:log4j.properties"/>
<!--配置数据源-->
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
<property name="driverClassName" value="${driver}"></property>
<property name="username" value="${username}"></property>
<property name="password" value="${password}"></property>
<property name="url" value="${url}"></property>
</bean>
<!--sqlSession-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" id="sessionFactory">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatisConfig.xml"></property>
</bean>
<!--扫描mapper文件-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="org.example.dao"></property>
</bean>
<context:component-scan base-package="org.example.service"/>
<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--开启事务注解-->
<tx:annotation-driven/>
</beans>
User实体类
package org.example.bean;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class User implements Serializable{
private Integer id; //id
private String userCode; //用户编码
private String userName; //用户名称
private String userPassword; //用户密码
private Integer gender; //性别
private Date birthday; //出生日期
private String phone; //电话
private String address; //地址
private Integer userRole; //用户角色
private Integer createdBy; //创建者
private Date creationDate; //创建时间
private Integer modifyBy; //更新者
private Date modifyDate; //更新时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getUserRole() {
return userRole;
}
public void setUserRole(Integer userRole) {
this.userRole = userRole;
}
public Integer getCreatedBy() {
return createdBy;
}
public void setCreatedBy(Integer createdBy) {
this.createdBy = createdBy;
}
public Date getCreationDate() {
return creationDate;
}
public void setCreationDate(Date creationDate) {
this.creationDate = creationDate;
}
public Integer getModifyBy() {
return modifyBy;
}
public void setModifyBy(Integer modifyBy) {
this.modifyBy = modifyBy;
}
public Date getModifyDate() {
return modifyDate;
}
public void setModifyDate(Date modifyDate) {
this.modifyDate = modifyDate;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", userCode='" + userCode + '\'' +
", userName='" + userName + '\'' +
", userPassword='" + userPassword + '\'' +
", gender=" + gender +
", birthday=" + birthday +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
", userRole=" + userRole +
", createdBy=" + createdBy +
", creationDate=" + creationDate +
", modifyBy=" + modifyBy +
", modifyDate=" + modifyDate +
'}';
}
}
UserDao接口
package org.example.dao;
import org.apache.ibatis.annotations.Mapper;
import org.example.bean.User;
import java.util.List;
@Mapper
public interface UserDao {
/**查询用户**/
public List<User> selectUser();
/**根据用户id删除用户**/
public void deleteUserById(String id);
/**增加用户**/
public void insertUser(User user);
/**修改用户**/
public void updateUserById(User user);
}
UserDao.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">
<!--namespace 命名空间-->
<mapper namespace="org.example.dao.UserDao">
<resultMap id="myUser" type="org.example.bean.User">
<id column="id" property="id"></id>
<result column="userCode" property="userCode"></result>
<result column="userName" property="userName"></result>
<result column="phone" property="phone"></result>
<result column="gender" property="gender"></result>
<result column="birthday" property="birthday"></result>
<result column="userRole" property="userRole"></result>
</resultMap>
<!--查询用户-->
<select id="selectUser" resultType="org.example.bean.User">
select * from smbms_user
</select>
<!--删除用户-->
<delete id="deleteUserById">
delete from smbms_user
where id =#{id}
</delete>
<!--增加用户-->
<insert id="insertUser" parameterType="org.example.bean.User">
insert into smbms_user
(userCode,userName,userPassword,gender,phone,address,userRole)
values (#{userCode},#{userName},#{userPassword},#{gender},#{phone},#{address},#{userRole})
</insert>
<!--修改用户-->
<update id="updateUserById" parameterType="org.example.bean.User">
update smbms_user
set userName = #{userName}
where id = #{id}
</update>
</mapper>IUserService接口
package org.example.service;
import org.example.bean.User;
import java.util.List;
public interface IUserService {
/**查询用户**/
public List<User> selectUserlist();
/**删除用户**/
public void deleteUserById(String id);
/**新增用户
* @return**/
public User insertUser(User user);
/**修改用户**/
public void updateUser(User user);
}
UserServiceImpl实现类
package org.example.service;
import org.example.bean.User;
import org.example.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service("userService")
@Transactional
public class UserServiceImpl implements IUserService {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
/**
* @author chenliduan
* @description 查询用户
* @params [user]
* @Return java.util.List<org.example.bean.User>
* @date 2020/11/11 0011 11:22
**/
@Override
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = true)
public List<User> selectUserlist() {
return userDao.selectUser();
}
/**
* @author chenliduan
* @description 删除用户
* @params [id]
* @Return void
* @date 2020/11/11 0011 12:19
**/
@Override
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
public void deleteUserById(String id) {
userDao.deleteUserById(id);
}
/**
* @author chenliduan
* @description 新增用户
* @params []
* @Return void
* @date 2020/11/11 0011 15:20
*
* @return*/
@Override
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
public User insertUser(User user) {
userDao.insertUser(user);
return null;
}
/**
* @author chenliduan
* @description 修改用户
* @params []
* @Return void
* @date 2020/11/11 0011 15:20
**/
@Override
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
public void updateUser(User user) {
userDao.updateUserById(user);
}
}
AppTest测试类
package org.example;
import org.example.bean.User;
import org.example.service.IUserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.sql.Date;
import java.util.List;
/**
* Unit test for simple App.
*/
public class AppTest {
/**
* @author chenliduan
* @description 查询用户 Rigorous Test :-)
* @params []
* @Return void
* @date 2020/11/11 0011 11:30
**/
@Test
public void selectUserlist(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
IUserService bean = applicationContext.getBean(IUserService.class);
List<User> users = bean.selectUserlist();
System.out.println(users);
}
/**
* @author chenliduan
* @description 删除用户
* @params []
* @Return void
* @date 2020/11/11 0011 12:19
**/
@Test
public void deleteUserById(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
IUserService bean = applicationContext.getBean(IUserService.class);
bean.deleteUserById("30");
}
/**
* @author chenliduan
* @description 增加用户
* @params
* @Return
* @date 2020/11/11 0011 15:23
**/
@Test
public void insertUser(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
IUserService bean = applicationContext.getBean(IUserService.class);
User user =new User();
user.setUserCode("chenxiaoduan");
user.setUserName("陈小端");
user.setUserPassword("123456");
user.setGender(2);
user.setAddress("广州市");
user.setUserRole(3);
bean.insertUser(user);
}
/**
* @author chenliduan
* @description 修改用户
* @params
* @Return
* @date 2020/11/11 0011 15:23
**/
@Test
public void updateUserById(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext2.xml");
IUserService bean = applicationContext.getBean(IUserService.class);
User user = new User();
user.setUserName("hhh");
user.setId(36);
bean.updateUser(user);
}
}
版权声明:本文为weixin_41781654原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。