一、整合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&amp;useSSL=true&amp;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&amp;useSSL=true&amp;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&amp;useSSL=true&amp;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、声明式事务相关推荐

  1. Spring-09 整合mybatis声明式事务

    声明式事务 回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎!事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单 ...

  2. 《Spring系列》第15章 声明式事务(一) 基础使用

    一.ACID特性 ⑴ 原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库 ...

  3. SpringMVC、MyBatis声明式事务管理

    2019独角兽企业重金招聘Python工程师标准>>> 采用的基本搭建环境:SpringMVC.MyBatis.MySQL.tomcat         Spring事务管理分解了传 ...

  4. Spring学习12之整合Mybatis

    前言 Spring两大核心,IOC,AOP. 一.整合Mybatis 1.编写数据源配置 2.sqlSessionFactory 3.sqlSessionTemplate 4.需要给接口加实现类 5. ...

  5. SSJ集成整合、声明式事务管理

    一.三大框架介绍 1.sssj -->springmvc spring springjdbc(第一个项目) 2.早期:ssh (struts2 spring hibernate) 用的比较多 , ...

  6. Spring声明式事务配置管理方法

    /*2011年8月28日 10:03:30 by Rush  */ 环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加 ...

  7. Spring声明式事务管理的配置详解

    环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...

  8. 详解 Spring 声明式事务

    一.引言 Spring的事务机制包括声明式事务和编程式事务. 编程式事务管理:Spring推荐使用 TransactionTemplate,实际开发中使用声明式事务较多. 声明式事务管理:将我们从复杂 ...

  9. spring 注解开启声明式事务

    spring开启声明式事务: 导入依赖: pom.xml <dependencies><!-- https://mvnrepository.com/artifact/org.spri ...

  10. 事务声明声明式事务和编程式事务区别

    事务声明声明式事务和编程式事务区别 1.编程式事务: 所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理.管理使用TransactionTemplate或者直接使用底层的Pla ...

最新文章

  1. Java项目:酒店管理系统(java+Springboot+Mybatis+Beetl+Layui)
  2. java script 教程_Java Script入门
  3. jQuery版本的网页开关灯、jQuery版本网页开关灯的另一种写法
  4. docker基础应用
  5. 前端学习(875):dom事件流理论
  6. std::set作为一个有序集合
  7. [数据库]-----记一次mysql分库的操作(冷热分离)
  8. netapp存储常用命令
  9. c# http请求执行超时,解决办法(给某个方法设定超时时间)
  10. 数学建模之相关分析分类与总结
  11. 非线性动力方程中的解析法和数值法(解析解和数值解)
  12. 黑客长期摇号不中黑掉北京小客车摇号网
  13. 印象笔记 Markdown使用指南
  14. 60天造个火箭给你玩玩,你想要不?
  15. JB的产品之旅-产品经理是干嘛的?
  16. matlab竖向正负柱状图,echarts竖向正负柱状图【如何用EXCEL做正负柱状图?请高手指点,谢谢】...
  17. 如何在IntelliJ IDEA中添加JDK?
  18. WCP 新版本中多了几个新的导出函数
  19. CTFShow re2 (RC4
  20. 堆栈内存两张图理解-来自珠峰猛男周啸天

热门文章

  1. bzoj 1503: [NOI2004]郁闷的出纳员 (splay)
  2. js中的instanceof运算符
  3. python框架之Flask(4)-上下文管理
  4. 值得推荐的C/C++框架和库(转)
  5. Linux基本信息查看命令
  6. 解决IE6不支持fixed
  7. sqlserver2000中字符串类型的日期如何比较大小
  8. 中缀表达式转换为后缀表达式算法
  9. 机器学习之KNN 算法
  10. mfc中句柄与指针的区别