最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

天天滚动:Spring整合mybatis使用xml配置事务

来源:博客园

自己准备开始教授Java相关的技术,Spring框架是必须让学生学习的框架之一。里面有一个事务的配置

以前刚学习Spring框架的时候有接触过,不过已经过了很多年,很多东西都已经忘记。现在再来回忆一下


(相关资料图)

如何使用Spring框架类配置事务。

使用到的maven坐标如下:

<dependencies><dependency><groupId>org.mybatisgroupId><artifactId>mybatisartifactId><version>3.5.6version>dependency><dependency><groupId>mysqlgroupId><artifactId>mysql-connector-javaartifactId><version>8.0.33version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-contextartifactId><version>5.3.27version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-jdbcartifactId><version>5.3.27version>dependency><dependency><groupId>org.mybatisgroupId><artifactId>mybatis-springartifactId><version>1.3.3version>dependency><dependency><groupId>com.alibabagroupId><artifactId>druidartifactId><version>1.2.18version>dependency><dependency><groupId>org.aspectjgroupId><artifactId>aspectjweaverartifactId><version>1.9.7version>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;}@Overridepublic 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"?>mapperPUBLIC"-//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}whereid = #{id, jdbcType=INTEGER}update><update id="deleteCat" parameterType="int">update cat set is_delete = 1whereid = #{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"/><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><bean class="org.mybatis.spring.SqlSessionFactoryBean" ><property name="dataSource" ref="dataSource" />bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.cat.dao"/>bean><bean id="catService" class="com.cat.service.impl.CatServiceImpl" ><property name="catDao" ref="catDao"/>bean>

<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.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}whereid = #{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.*.*(..)这个路径是自己从一篇博文中拷贝的,没有做修改最终导致路径错误

解决方式:配置为正确的路径 com.cat.service.impl.CatServiceImpl.*(..)即可.区别就在于.*.*还是.*

测试

测试前的数据库数据为

报错信息如下,10 / 0出现错误:

再次查看数据库数据,数据没改变,事务生效。

参考博文

https://www.cnblogs.com/juyss/p/13786370.html

关键词: