Spring学习(三)Spring 整合MyBatis、声明式事务
一、整合MyBatis
搭建测试环境
实体类User
package com.zyh.pojo;import lombok.Data;
import lombok.ToString;@Data
@ToString
public class User {private int id;private String name;private String pwd;
}
接口UserMapper
package com.zyh.mapper;import com.zyh.pojo.User;import java.util.List;public interface UserMapper {public List<User> selectUser();
}
编写:UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zyh.mapper.UserMapper"><select id="selectUser" resultType="User">select * from mybatis.user;</select>
</mapper>
编写MyBatis核心配置文件:mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><properties resource="db.properties"/><typeAliases><package name="com.zyh.pojo"/></typeAliases>
</configuration>
编写Spring配置文件application.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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"></beans>
Spring整合MyBatis步骤:
1、编写数据源配置
<!--DataSource:使用Spring的DataSource代替Mybatis中的配置--><bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url"value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=true&characterEnicoding=utf8"/><property name="username" value="root"/><property name="password" value="11235813"/></bean>
2、编写SqlSessionFactory和SqlSessionTemplate 的Bean对象
<!--sqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="datasource"/><!--绑定MyBatis配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><!--读取mapper包下的所有xml文件--><property name="mapperLocations" value="classpath:com/zyh/mapper/*.xml"/></bean><!--sqlSessionTemplate--><bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"><!--我们查看源码发现SqlSessionTemplate类并没有set方法,所以使用构造器注入sqlSessionFactory--><constructor-arg index="0" ref="sqlSessionFactory"/></bean>
3、给接口添加实现类
package com.zyh.mapper;import com.zyh.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;import java.util.List;
//我们所有的数据库操作都在sqlsessionTemplate执行
public class UserMapperImpl implements UserMapper {private SqlSessionTemplate sqlSession;public void setSqlSession(SqlSessionTemplate sqlSession) {this.sqlSession = sqlSession;}public List<User> selectUser() {UserMapper mapper = sqlSession.getMapper(UserMapper.class);return mapper.selectUser();}
}
4、将自己写的实现类,注入到Spring中
<!--将实现类注册到Spring--><bean id="userMapper" class="com.zyh.mapper.UserMapperImpl"><property name="sqlSession" ref="sqlSession"/></bean>
5、测试
import com.zyh.mapper.UserMapper;
import com.zyh.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.List;public class MyTest {@Testpublic void test1() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserMapper userMapper = (UserMapper) context.getBean("userMapper");List<User> users = userMapper.selectUser();for (User user : users) {System.out.println(user);}}
}
执行结果:
简化版MyBatis-Spring
环境和上面的案例一样,但不用我们sqlSessionTemplate 的Bean对象了。
创建一个新的UserMapper实现类,继承SqlSessionDaoSupport
类。我们可以再类中直接getSession()
获取一个Session。
package com.zyh.mapper;import com.zyh.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;import java.util.List;public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {public List<User> selectUser() {return getSqlSession().getMapper(UserMapper.class).selectUser();}
}
将实现类注册到Spring,查看源码发现这个set方法需要一个sqlSessionFactory
的对象,所以给它的属性添加一个sqlSessionFactory
的引用。
<!--DataSource:使用Spring的DataSource代替Mybatis中的配置--><bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url"value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=true&characterEnicoding=utf8"/><property name="username" value="root"/><property name="password" value="11235813"/></bean><!--sqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="datasource"/><!--绑定MyBatis配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><!--读取mapper包下的所有xml文件--><property name="mapperLocations" value="classpath:com/zyh/mapper/*.xml"/></bean><!--注册实现类到Spring中--><bean id="UserMapper2" class="com.zyh.mapper.UserMapperImpl2"><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>
测试:
import com.zyh.mapper.UserMapper;
import com.zyh.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.List;public class MyTest {@Testpublic void test1() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserMapper userMapper = (UserMapper) context.getBean("userMapper2");List<User> users = userMapper.selectUser();for (User user : users) {System.out.println(user);}}
}
执行结果:
二、声明式事务
1、事务简介
把一组业务当成一个业务来做;要么都成功,要么都失败!事务在项目开发中,十分的重要,涉及到数据的一致性问题!
2、事务的ACID原则
- 原子性: 确保事务要么都成功,要么都是失败!事务是不可分割的!
- 一致性: 保证数据在事务的执行周期内不会发生变化!
- 隔离性: 多个事务访问同一个数据库时,一个事务不能被另一个事务影响,多个并发访问的事务需要隔离。
- 持久性: 事务一旦被提交,就不可能再回滚!
3、Spring中的事务管理
- 声明式事务: 通过AOP的方式去实现
- 编程式事务: 需要在代码中手动实现!
4、为什么需要事务?
- 如果我们不开启事务,可能就会存在数据提交不一致的情况
- 如果我们不在Spring中去配置声明式事务,就需要我们在代码中手动配置事务!
- 事务在项目开发中是非常重要的,涉及到数据的一致性和完整性,所以我们必须重视!
5、测试事务
搭建环境:
实体类:
package com.zyh.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private int id;private String name;private String pwd;
}
接口:
package com.zyh.mapper;import com.zyh.pojo.User;import java.util.List;public interface UserMapper {//查询所有的用户public List<User> selectUser();//添加一个用户public int insertUser(User user);//删除一个用户、public int deleteUser(int id);
}
接口的实现类:
package com.zyh.mapper;import com.zyh.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;import java.util.List;public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {//我们在这里查询用户的时候,会新增一个用户并删除。public List<User> selectUser() {User user = new User(5, "xiaohu", "123456");insertUser(user);deleteUser(5);return getSqlSession().getMapper(UserMapper.class).selectUser();}public int insertUser(User user){return getSqlSession().getMapper(UserMapper.class).insertUser(user);}public int deleteUser(int id) {return getSqlSession().getMapper(UserMapper.class).deleteUser(id);}
}
接口的.xml
配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zyh.mapper.UserMapper"><select id="selectUser" resultType="User">select * from mybatis.user;</select><insert id="insertUser" parameterType="User">insert mybatis.user(id,name,pwd) values (#{id},#{name},#{pwd});</insert><delete id="deleteUser" parameterType="int">-- 注意:这里我们为了测试事务,故意写错SQL语句deletes mybatis.user where id = #{id};</delete>
</mapper>
测试:
@Testpublic void test2() {ApplicationContext context = new ClassPathXmlApplicationContext("appplicationContext.xml");UserMapper userMapper2 = context.getBean("userMapper2", UserMapper.class);List<User> users = userMapper2.selectUser();for (User user : users) {System.out.println(user);}}
执行结果:
我们可以看到SQL语句有错程序别报错。再看一下我们的数据库中的数据。
我们的程序报错但插入语句去执行成功了,这就是我们为什么要学习事务的原因。
下面我们配置开启事务
在spring配置文件中开启事务
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttps://www.springframework.org/schema/tx/spring-tx.xsd"><!--编写数据源DataSource--><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url"value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=true&characterEnicoding=utf8"/><property name="username" value="root"/><property name="password" value="11235813"/></bean><!--编写sqlSessionFactory--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--绑定数据源--><property name="dataSource" ref="dataSource"/><!--绑定Mybatis配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/><!--读取mapper下的所有接口的.xml文件--><property name="mapperLocations" value="classpath:com/zyh/mapper/*.xml"/></bean><!--编写SqlSessionTemplate--><bean id="sqlsession" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory"/></bean><!--注册接口的实现类Bean对象--><bean id="userMapper" class="com.zyh.mapper.UserMapperImpl"><property name="sqlSession" ref="sqlsession"/></bean><bean id="userMapper2" class="com.zyh.mapper.UserMapperImpl2"><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean><!--配置声明式事务,需要导入事务的约束文件--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--配置事务通知--><!--结合AOP实现事务的织入--><tx:advice id="txAdvice" transaction-manager="transactionManager"><!--给方法配置事务--><tx:attributes><!--配置事务的传播特性 REQUIRED 默认的--><tx:method name="insert" propagation="REQUIRED"/><tx:method name="delete" propagation="REQUIRED"/><tx:method name="update" propagation="REQUIRED"/><tx:method name="select" read-only="true"/><tx:method name="*" propagation="REQUIRED"/></tx:attributes></tx:advice><!--配置事务AOP的切入--><aop:config><aop:pointcut id="txPoint" expression="execution(* com.zyh.mapper.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="txPoint"/></aop:config></beans>
下面我们新增五号用户,删除四号用户试一下:记得把UserMapper.xml中的SQL删除语句修改正确
package com.zyh.mapper;import com.zyh.pojo.User;
import org.mybatis.spring.support.SqlSessionDaoSupport;import java.util.List;public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {public List<User> selectUser() {User user = new User(5, "xiaohu", "123456");insertUser(user);deleteUser(4);return getSqlSession().getMapper(UserMapper.class).selectUser();}public int insertUser(User user){return getSqlSession().getMapper(UserMapper.class).insertUser(user);}public int deleteUser(int id) {return getSqlSession().getMapper(UserMapper.class).deleteUser(id);}
}
测试:
@Testpublic void test2() {ApplicationContext context = new ClassPathXmlApplicationContext("appplicationContext.xml");UserMapper userMapper2 = context.getBean("userMapper2", UserMapper.class);List<User> users = userMapper2.selectUser();for (User user : users) {System.out.println(user);}}
执行结果:
Spring学习(三)Spring 整合MyBatis、声明式事务相关推荐
- Spring-09 整合mybatis声明式事务
声明式事务 回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单 ...
- 《Spring系列》第15章 声明式事务(一) 基础使用
一.ACID特性 ⑴ 原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库 ...
- SpringMVC、MyBatis声明式事务管理
2019独角兽企业重金招聘Python工程师标准>>> 采用的基本搭建环境:SpringMVC.MyBatis.MySQL.tomcat Spring事务管理分解了传 ...
- Spring学习12之整合Mybatis
前言 Spring两大核心,IOC,AOP. 一.整合Mybatis 1.编写数据源配置 2.sqlSessionFactory 3.sqlSessionTemplate 4.需要给接口加实现类 5. ...
- SSJ集成整合、声明式事务管理
一.三大框架介绍 1.sssj -->springmvc spring springjdbc(第一个项目) 2.早期:ssh (struts2 spring hibernate) 用的比较多 , ...
- Spring声明式事务配置管理方法
/*2011年8月28日 10:03:30 by Rush */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...
- Spring声明式事务管理的配置详解
环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...
- 详解 Spring 声明式事务
一.引言 Spring的事务机制包括声明式事务和编程式事务. 编程式事务管理:Spring推荐使用 TransactionTemplate,实际开发中使用声明式事务较多. 声明式事务管理:将我们从复杂 ...
- spring 注解开启声明式事务
spring开启声明式事务: 导入依赖: pom.xml <dependencies><!-- https://mvnrepository.com/artifact/org.spri ...
- 事务声明声明式事务和编程式事务区别
事务声明声明式事务和编程式事务区别 1.编程式事务: 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理.管理使用TransactionTemplate或者直接使用底层的Pla ...
最新文章
- Java项目:酒店管理系统(java+Springboot+Mybatis+Beetl+Layui)
- java script 教程_Java Script入门
- jQuery版本的网页开关灯、jQuery版本网页开关灯的另一种写法
- docker基础应用
- 前端学习(875):dom事件流理论
- std::set作为一个有序集合
- [数据库]-----记一次mysql分库的操作(冷热分离)
- netapp存储常用命令
- c# http请求执行超时,解决办法(给某个方法设定超时时间)
- 数学建模之相关分析分类与总结
- 非线性动力方程中的解析法和数值法(解析解和数值解)
- 黑客长期摇号不中黑掉北京小客车摇号网
- 印象笔记 Markdown使用指南
- 60天造个火箭给你玩玩,你想要不?
- JB的产品之旅-产品经理是干嘛的?
- matlab竖向正负柱状图,echarts竖向正负柱状图【如何用EXCEL做正负柱状图?请高手指点,谢谢】...
- 如何在IntelliJ IDEA中添加JDK?
- WCP 新版本中多了几个新的导出函数
- CTFShow re2 (RC4
- 堆栈内存两张图理解-来自珠峰猛男周啸天