一、整合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. FM:西南民大朱英等-肠道菌群研究促进了朱鹮的迁地保护
  2. Cell:人体细菌到究竟有多少,再作报告必引此文
  3. winform 让他间隔一段时间 执行事件 且只执行一次_Redis 事件机制详解
  4. LINUX常用命令(基础)
  5. ubuntu下virtualbox使用u盘
  6. Go使用swagger:方法说明+案例说明
  7. oracle数据库的诊断目标位置,刚安装的数据库卸载 指定数据库的诊断目标位置不存在...
  8. suse查看mysql内存使用情况_MySQL 慢查询日志(Slow Query Log)
  9. 我见过太多PhD,精神崩溃、心态失衡、身体垮掉、一事无成
  10. 【Elasticsearch】使用自适应副本选择改进弹性搜索的响应延迟
  11. 【Kafka】Kafka IllegalArgumentException: Could not find a ‘KafkaClient‘ entry in the JAAS configuratio
  12. 用简单直白的方式讲解A星寻路算法原理
  13. 多线程之阻塞队列ArrayBlockingQueue,BlockingQueue
  14. 百度(高德、GG歌)离线地图开发环境搭建【离线地图开发源代码】
  15. Android UserManager.isUserAGoat() 的正确用例?
  16. SCP批量拷贝指定文件
  17. 信息论与编码-python实现三种编码(香农编码,费诺编码,赫夫曼编码)
  18. 【附源码】计算机毕业设计java在线教学系统设计与实现
  19. uniapp微信小程序瀑布流布局
  20. 外文翻译原文附在后面_外文翻译与外文原文(参考格式).doc

热门文章

  1. Xamarin.Forms 仿照京东搜索记录控件
  2. 条件控制语句 以及 循环语句
  3. 11-Container With Most Water
  4. 代码大全旁边的一本书--感受《UNIX编程艺术》
  5. java循环速度比较_List的二种循环速度比较
  6. 拓端tecdat:R语言GARCH建模常用软件包比较、拟合标准普尔SP 500指数波动率时间序列和预测可视化
  7. 拓端tecdat|在UBUNTU虚拟机上安装R软件包
  8. 拓端tecdat|如何用R语言绘制生成正态分布图表
  9. 【大数据部落】基于LDA主题模型聚类的商品评论文本挖掘
  10. (8)机器学习_混淆矩阵(分类模型评估)