资讯动态

spring数据库编程实现基于注解方式的声明式事务

发布时间:2026/9/27 9:32:14 来源:尧图企业网站定制
本文主要实现基于注解方式的声明式事务所用工具IDEA:2020.2maven:3.6.3Win10如何配置Java JDK环境请点击这里。添加链接描述Win10如何配置Maven环境请点击这里。IDEA如何配置JDK,请点击这里。IDEA如何配置Maven请点击这里。源代码下载:(1) 百度网盘通过网盘分享的文件demo9_基于注解方式的声明式事务.zip链接: https://pan.baidu.com/s/1QxGfPKwSuLgjWQU5LWpe7Q?pwdjdur 提取码: jdur2夸克网盘我用夸克网盘给你分享了「demo9_基于注解方式的声明式事务.zip」点击链接或复制整段内容打开「夸克APP」即可获取。/229a3b6fdD链接https://pan.quark.cn/s/632689dd5861?pwdkuhe提取码kuhe一、创建数据库打开navicat执行下面这个sql,创建一个数据库和一个数据表CREATEDATABASEspring;USEspring;DROPTABLEIFEXISTSaccount;CREATETABLEaccount(idint(11)NOTNULLAUTO_INCREMENT,usernamevarchar(50)DEFAULTNULL,balancedoubleDEFAULTNULL,PRIMARYKEY(id))ENGINEInnoDBAUTO_INCREMENT5DEFAULTCHARSETutf8;insertintoaccount(id,username,balance)values(1,zhangsan,100),(3,lisi,500),(4,wangwu,300);执行以后的结果如下二、项目搭建打开IDEA点击“File—New—Project”我们 选择“Maven”项目然后点击“Next”改一下项目名称然后点击“Finish”创建完项目默认如下打开POM文件添加相关依赖注意要先配置好maven不然下载不了依赖?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.example/groupIdartifactIddemo9/artifactIdversion1.0-SNAPSHOT/versiondependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion5.2.8.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-beans/artifactIdversion5.2.8.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion5.2.8.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.8.RELEASE/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-expression/artifactIdversion5.2.8.RELEASE/version/dependencydependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version/dependency!-- jdbc包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.2.10.RELEASE/version/dependency!-- spring-tx包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-tx/artifactIdversion5.2.10.RELEASE/version/dependency!-- MySQL数据库驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.11/versionscoperuntime/scope/dependency!-- aspectjweaver依赖 --dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.6/versionscoperuntime/scope/dependency!-- aopalliance依赖包 --dependencygroupIdaopalliance/groupIdartifactIdaopalliance/artifactIdversion1.0/version/dependency/dependencies/project如果maven依赖加载没问题我们就开始创建项目结构。右击java文件夹选择New—Package然后分别创建Dao、Entity、Impl这三个文件夹com.demo9.Entity com.demo9.Dao com.demo9.Impl三、编写项目代码1.编写实体类右击Entity文件夹选择New—Java Class实体类名称为AccountAccount类代码参考如下packagecom.demo9.Entity;publicclassAccount{privateIntegerid;// 账户idprivateStringusername;// 用户名privateDoublebalance;// 账户余额publicIntegergetId(){returnid;}publicvoidsetId(Integerid){this.idid;}publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.usernameusername;}publicDoublegetBalance(){returnbalance;}publicvoidsetBalance(Doublebalance){this.balancebalance;}publicStringtoString(){returnAccount [idid, usernameusername, balancebalance];}}2.编写dao层右击Dao文件夹名称为AccountDao注意类型是Interface那么代码参考如下package com.demo9.Dao;import com.demo9.Entity.Account;import java.util.List;publicinterfaceAccountDao{// 添加publicintaddAccount(Accountaccount);// 更新publicintupdateAccount(Accountaccount);// 删除publicintdeleteAccount(intid);// 通过id查询publicAccountfindAccountById(intid);// 查询所有账户publicListAccountfindAllAccount();// 转账publicvoidtransfer(StringoutUser,StringinUser,Doublemoney);}3.创建Impl层右击Impl文件夹选择New—Java Class在输入名称处选择 AccountDaoImpl代码参考如下packagecom.demo9.Impl;importcom.demo9.Dao.AccountDao;importcom.demo9.Entity.Account;importorg.springframework.jdbc.core.BeanPropertyRowMapper;importorg.springframework.jdbc.core.JdbcTemplate;importorg.springframework.jdbc.core.RowMapper;importorg.springframework.transaction.annotation.Isolation;importorg.springframework.transaction.annotation.Propagation;importorg.springframework.transaction.annotation.Transactional;importjava.util.List;publicclassAccountDaoImplimplementsAccountDao{// 定义JdbcTemplate属性及其setter方法privateJdbcTemplatejdbcTemplate;publicvoidsetJdbcTemplate(JdbcTemplatejdbcTemplate){this.jdbcTemplatejdbcTemplate;}// 添加账户publicintaddAccount(Accountaccount){// 定义SQLStringsqlinsert into account(username,balance) value(?,?);// 定义数组来存放SQL语句中的参数Object[]objnewObject[]{account.getUsername(),account.getBalance()};// 执行添加操作返回的是受SQL语句影响的记录条数intnumthis.jdbcTemplate.update(sql,obj);returnnum;}// 更新账户publicintupdateAccount(Accountaccount){// 定义SQLStringsqlupdate account set username?,balance? where id ?;// 定义数组来存放SQL语句中的参数Object[]paramsnewObject[]{account.getUsername(),account.getBalance(),account.getId()};// 执行更新操作返回的是受SQL语句影响的记录条数intnumthis.jdbcTemplate.update(sql,params);returnnum;}// 删除账户publicintdeleteAccount(intid){// 定义SQLStringsqldelete from account where id ? ;// 执行删除操作返回的是受SQL语句影响的记录条数intnumthis.jdbcTemplate.update(sql,id);returnnum;}// 通过id查询单个账户信息publicAccountfindAccountById(intid){//定义SQL语句Stringsqlselect * from account where id ?;// 创建一个新的BeanPropertyRowMapper对象RowMapperAccountrowMappernewBeanPropertyRowMapperAccount(Account.class);// 将id绑定到SQL语句中并通过RowMapper返回一个Object类型的单行记录returnthis.jdbcTemplate.queryForObject(sql,rowMapper,id);}//查询所有账户信息publicListAccountfindAllAccount(){// 定义SQL语句Stringsqlselect * from account;// 创建一个新的BeanPropertyRowMapper对象RowMapperAccountrowMappernewBeanPropertyRowMapperAccount(Account.class);// 执行静态的SQL查询并通过RowMapper返回结果returnthis.jdbcTemplate.query(sql,rowMapper);}/** * 转账 * inUser收款人 * outUser汇款人 * money收款金额 */Transactional(propagationPropagation.REQUIRED,isolationIsolation.DEFAULT,readOnlyfalse)publicvoidtransfer(StringoutUser,StringinUser,Doublemoney){// 收款时收款用户的余额现有余额所汇金额this.jdbcTemplate.update(update account set balance balance ? where username ?,money,inUser);// 模拟系统运行时的突发性问题inti1/0;// 汇款时汇款用户的余额现有余额-所汇金额this.jdbcTemplate.update(update account set balance balance-? where username ?,money,outUser);}}4.编写配置文件右击resources文件夹选择New—File文件名称写applicationContext-annotation.xml创建好的文件代码参考如下注意把数据库密码修改成自己的。?xml version1.0 encodingUTF-8?beansxmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd!-- 1.配置数据源 --beaniddataSourceclassorg.springframework.jdbc.datasource.DriverManagerDataSource!--数据库驱动 --propertynamedriverClassNamevaluecom.mysql.jdbc.Driver/!--连接数据库的url --propertynameurlvaluejdbc:mysql://localhost/spring?useUnicodetrueamp;characterEncodingutf-8amp;serverTimezoneAsia/Shanghai/!--连接数据库的用户名 --propertynameusernamevalueroot/!--连接数据库的密码 --propertynamepasswordvalue123456//bean!-- 2.配置JDBC模板 --beanidjdbcTemplateclassorg.springframework.jdbc.core.JdbcTemplate!-- 默认必须使用数据源 --propertynamedataSourcerefdataSource//bean!--3.定义id为accountDao的Bean --beanidaccountDaoclasscom.demo9.Impl.AccountDaoImpl!-- 将jdbcTemplate注入到AccountDao实例中 --propertynamejdbcTemplaterefjdbcTemplate//bean!-- 4.事务管理器依赖于数据源 --beanidtransactionManagerclassorg.springframework.jdbc.datasource.DataSourceTransactionManagerpropertynamedataSourcerefdataSource//bean!-- 5.注册事务管理器驱动 --tx:annotation-driventransaction-managertransactionManager//beans四、编写测试代码右击java文件夹选择New—Java Class然后名称为AnnotationTest代码参考如下import com.demo9.Dao.AccountDao;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;publicclassAnnotationTest{publicstaticvoidmain(String[]args){ApplicationContextapplicationContextnewClassPathXmlApplicationContext(applicationContext-annotation.xml);// 获取AccountDao实例AccountDaoaccountDao(AccountDao)applicationContext.getBean(accountDao);// 调用实例中的转账方法accountDao.transfer(lisi,zhangsan,100.0);// 输出提示信息System.out.println(转账成功);}}五、测试

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑