Spring整合mybatis使用xml配置事务
自己准备开始教授Java相关的技术,Spring框架是必须让学生学习的框架之一。里面有一个事务相关的
配置,以前刚学习Spring框架的时候有接触过,只是过了很多年,很多东西都已经淡忘。再来回忆一下
如何使用Spring框架配置事务。
使用到的maven坐标如下:
<dependencies>
<!-- mybatis的依赖支持 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<!-- mysql 驱动依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.27</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.27</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.18</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
</dependency>
</dependencies>
导入的jar包主要有mybatis,mysql驱动,spring相关的jar包,还有mysql连接池的jar包等等。
然后创建一个简单的工程,整个项目的结构大致如下,
测试类里面的代码为:
public class TestApplication {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
CatService catService =(CatService ) ctx.getBean("catService");
catService.updateCat("西西",1);
System.out.println("执行完毕!");
}
}
主要作用是加载Spring的配置类的xml文件,然后获取service类,最后调用service里面的方法来更新数据。
service实现类中的代码为:
public class CatServiceImpl implements CatService {
private CatDao catDao;
public void setCatDao(CatDao catDao) {
this.catDao = catDao;
}
@Override
public int updateCat(String catName, int id) {
int result = this.catDao.updateCat(catName, id);
int temp = 10 / 0;
result = this.catDao.deleteCat(id + 1);
return result;
}
}
这里面主要就是注入一个CatDao接口,注意这里必须有setCatDao方法,不然程序也会报错。这个类中只
写了一个方法updateCat,方法中第一步操作是根据ID更新名称;第二步操作是手动产生一个异常,方式为
使用10/0即可,用来测试事务是否正确回滚;第三步就是根据ID逻辑删除一条数据。
dao接口中的代码为:
public interface CatDao {
int updateCat(@Param("catName") String catName, @Param("id")int id);
int deleteCat(@Param("id")int id);
}
一个修改的方法,一个删除的方法。
CatDao.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">
<mapper namespace="com.cat.dao.CatDao">
<update id="updateCat">
update cat set cat_name = #{catName, jdbcType = VARCHAR}
where
id = #{id, jdbcType=INTEGER}
</update>
<update id="deleteCat" parameterType="int">
update cat set is_delete = 1
where
id = #{id, jdbcType = INTEGER}
</update>
</mapper>
一个是修改的方法,一个是逻辑删除的方法。
application.properties配置文件中的配置信息为,主要是数据库连接信息.
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test
name=root
password=root
applicationContext.xml配置文件中的信息为.
<!--引入资源文件-->
<context:property-placeholder location="classpath*:*.properties"/>
<!--创建 druid 连接池对象,dataSource-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" >
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${password}"/>
</bean>
<!--创建了 sessionFactory对象,用来代替 mybatis中的连接数据库-->
<bean class="org.mybatis.spring.SqlSessionFactoryBean" >
<property name="dataSource" ref="dataSource" />
</bean>
<!--映射试下类,mapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--扫描 dao包中的 映射文件,并且 将每个映射文件实例化了一个对象 对相名就是 文件名,开头字母小写-->
<property name="basePackage" value="com.cat.dao"/>
</bean>
<!--业务层-->
<bean id="catService" class="com.cat.service.impl.CatServiceImpl" >
<property name="catDao" ref="catDao"/>
</bean>
<!-- spring 提供的事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务增强 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 事务属性 -->
<tx:attributes>
<tx:method name="*"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<!--增删改 -->
<tx:method name="insert*" timeout="5000" rollback-for="java.lang.Exception"/>
<tx:method name="add*" timeout="5000"/>
<tx:method name="update*" timeout="5000"/>
<tx:method name="delete*" timeout="5000"/>
</tx:attributes>
</tx:advice>
<aop:config>
<!-- 错误配置方式 -->
<!--<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.service.impl.CatServiceImpl.*.*(..))"/>-->
<!-- 正确配置方式 -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.cat.service.impl.CatServiceImpl.*(..))"/>
</aop:config>
遇到的问题一:dao接口和xml文件不在同一个目录下!因此程序在执行的时候,就会报错,
Exception in thread "main" org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.cat.dao.CatDao.updateCat
导致这个问题的原因是,自己在创建xml的包路径时,是直接复制、粘贴com.cat.dao,导致创建的
包名错误。找到项目的根目录查看,如下
因此创建包名的时候,最好是一级一级的创建,直接复制、粘贴就可能会出现问题。
上面的是正确的包名,下面的是错误的包名,凭肉眼看是很难发现错误的,因此在创建
包名的时候一定要注意!
遇到的问题二:CatServiceImpl中注入CatDao的时候,catDao没有手动添加setCatDao方法
时,就会报如下的错误,大致意思就是说没有有效的catDao的set方法。
Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'catDao' of bean class [com.cat.service.impl.CatServiceImpl]: Bean property 'catDao' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
解决方式:添加CatDao成员变量的set方法即可。
遇到的问题三:
dao接口里面的代码
public interface CatDao {
int updateCat(@Param("catName") String catName, @Param("id")int id);
int deleteCat(@Param("id")int id);
}
xml里面的代码
<update id="updateCat" parameterType="string">
update cat set cat_name = #{catName, jdbcType = VARCHAR}
where
id = #{id, jdbcType=INTEGER}
</update>
由于在xml里面设置了parameterType=”string”,因此传入的参数必须为string类型。而自己传入的是
int类型,所以又报一个新的错误如下:
Error setting non null for parameter #2 with JdbcType INTEGER . Try setting a different JdbcType for this parameter or a different configuration property. Cause: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
解决方式为:去除掉这个设置即可parameterType=”string”,就可以传递任意类型的参数。
遇到的问题四:
切入点的配置方式错误,com.cat.service.impl.CatServiceImpl.*.*(..)这个路径是自己从一篇博文中拷贝的,没有做修改最终导致路径错误
<aop:config>
<!-- 错误配置方式 -->
<!--<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.cat.service.impl.CatServiceImpl.*.*(..))"/>-->
<!-- 正确配置方式 -->
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.cat.service.impl.CatServiceImpl.*(..))"/>
</aop:config>
解决方式:配置为正确的路径 com.cat.service.impl.CatServiceImpl.*(..)即可.区别就在于.*.*还是.*
测试
测试前的数据库数据为
报错信息如下,10 / 0出现错误:
再次查看数据库数据,数据没改变,事务生效。
参考博文
https://www.cnblogs.com/juyss/p/13786370.html
Spring整合mybatis使用xml配置事务的更多相关文章
- spring整合mybatis是如何配置事务的?
作者:郭无心链接:https://www.zhihu.com/question/30206875/answer/84675373来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- SpringBoot系列-整合Mybatis(XML配置方式)
目录 一.什么是 MyBatis? 二.整合方式 三.实战 四.测试 本文介绍下SpringBoot整合Mybatis(XML配置方式)的过程. 一.什么是 MyBatis? MyBatis 是一款优 ...
- SpringBoot 整合 Mybatis + Mysql——XML配置方式
一.介绍 SpringBoot有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate,本文主要讨论集成Mybatis方式. SpringBoot整合Mybatis也有两 ...
- SpringBoot整合MyBatis之xml配置
现在业界比较流行的数据操作层框架 MyBatis,下面就讲解下 Springboot 如何整合 MyBatis,这里使用的是xml配置SQL而不是用注解.主要是 SQL 和业务代码应该隔离,方便和 D ...
- spring整合mybatis二种配置
第一种: <!-- 配置sqlsession --> <bean id="sqlsessionFactory" class="org.mybatis.s ...
- spring整合mybatis,ioc容器及声明式事务配置
步骤: 1.创建jdbc.properties文件,用来管理存放连接数据库的相关信息 jdbc.properties:jdbc.user=root jdbc.password=123456 jdbc. ...
- spring整合mybatis(hibernate)配置
一.Spring整合配置Mybatis spring整合mybatis可以不需要mybatis-config.xml配置文件,直接通过spring配置文件一步到位.一般需要具备如下几个基本配置. 1. ...
- spring基础:什么是框架,框架优势,spring优势,耦合内聚,什么是Ioc,IOC配置,set注入,第三方资源配置,综合案例spring整合mybatis实现
知识点梳理 课堂讲义 1)Spring简介 1.1)什么是框架 源自于建筑学,隶属土木工程,后发展到软件工程领域 软件工程中框架的特点: 经过验证 具有一定功能 半成品 1.2)框架的优势 提高开发效 ...
- spring整合mybatis错误:class path resource [config/spring/springmvc.xml] cannot be opened because it does not exist
spring 整合Mybatis 运行环境:jdk1.7.0_17+tomcat 7 + spring:3.2.0 +mybatis:3.2.7+ eclipse 错误:class path reso ...
- spring 整合 mybatis 中数据源的几种配置方式
因为spring 整合mybatis的过程中, 有好几种整合方式,尤其是数据源那块,经常看到不一样的配置方式,总感觉有点乱,所以今天有空总结下. 一.采用org.mybatis.spring.mapp ...
随机推荐
- 【主流技术】15 分钟掌握 Redis 的安装部署和基本特性
目录 前言 一.Redis 概述 1.1Redis 是什么? 1.2Redis 能做什么? 1.3基础知识 二.Redis 安装与基本命令 2.1Windows 安装 方式一 方式二 2.2Linux ...
- 蘑菇街大三Java后端暑期实习面经
「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.准备 Java 面试,首选 JavaGuide! 分享一位热心读者分享的实习面经给博客园的小伙伴们看看. 一面 1.自我 ...
- C/C++ 关于继承与多态笔记
继承的基本语法: 继承的目的就是用于提高代码的可用性,减少代码的重复内容,高效开发. #include <iostream> using namespace std; class Base ...
- ClickHouse(24)ClickHouse集成mongodb表引擎详细解析
目录 MongoDB 创建一张表 用法示例 资料分享 系列文章 clickhouse系列文章 MongoDB MongoDB 引擎是只读表引擎,允许从远程 MongoDB 集合中读取数据(SELECT ...
- 【奶奶看了都会】ChatGPT3.5接入企业微信,可连续对话
1.连续对话效果 小伙伴们,这周ChatGPT放出大招,开放了GPT3.5的API.说简单点,就是提供了和ChatGPT页面对话一样模型的接口.而之前接的ChatGPT接口都是3.0,并不是真正的Ch ...
- Java并发(十四)----悲观互斥与乐观重试
1. 悲观互斥 互斥实际是悲观锁的思想 例如,有下面取款的需求 interface Account { // 获取余额 Integer getBalance(); // 取款 ...
- 图(树)的深度优先遍历dfs
图的深度优先遍历 深度优先,即对于一个图或者树来说,在遍历时优先考虑图或者树的单一路径的深度.示意图如下 即深度优先搜索的核心就是对一个路径一直向下搜索,当搜索到头时就回溯到前一状态再寻找别的路 深搜 ...
- .NET Core开发实战(第26课:工程结构概览:定义应用分层及依赖关系)--学习笔记
26 | 工程结构概览:定义应用分层及依赖关系 从这一节开始进入微服务实战部分 这一节主要讲解工程的结构和应用的分层 在应用的分层这里定义了四个层次: 1.领域模型层 2.基础设施层 3.应用层 4. ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第12章)
第 12 章 设计汇总 微服务开发并不是要学习 C#.Java 或者 Go 编程--而是要学习如何开发应用以适应并充分利用弹性伸缩环境的优势,它们对托管环境没有偏好,并能瞬间启停 换句话说,我们要学习 ...
- JS leetcode 杨辉三角Ⅱ 题解分析
壹 ❀ 引 今天是的题目来自leetcode的119. 杨辉三角 II,还记得几天前,我第一次遇到118. 杨辉三角,一段代码调试半天写不出来,这次遇到升级版终于开开心心快快乐乐轻松解题,题目描述如下 ...