新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/27 9:32:14来源:尧图网络
spring数据库编程实现基于注解方式的声明式事务
本文主要实现基于注解方式的声明式事务所用工具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(转账成功);}}五、测试
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

烧录程序版本管理实战:防止芯片烧错固件的关键策略 2026/9/27 10:23:57

烧录程序版本管理实战:防止芯片烧错固件的关键策略

烧录程序版本管理这件事,我做了十几年嵌入式,踩过的坑比很多新手写过的代码都多。程序写错了改一改就行,芯片烧错了版本,轻则功能不符重则整板报废,而且往往是在批量产线上出问题,一发现就是几百片返工。我…

阅读更多 →
开源硬件项目怎么找?别只刷GitHub,这四类真实渠道更高效 2026/9/27 10:23:57

开源硬件项目怎么找?别只刷GitHub,这四类真实渠道更高效

1. 开源硬件不是“找代码”而是“找生态”:为什么90%的人搜不到真正可用的智能家居项目我第一次想给家里加个自定义温控面板时,花了整整三天在GitHub上翻项目。关键词打了十几种组合:“smart home hardware open source”“esp32 home automa…

阅读更多 →
工业控制器分级存储方案:EEPROM、NOR Flash与SD卡分工实践 2026/9/27 10:23:49

工业控制器分级存储方案:EEPROM、NOR Flash与SD卡分工实践

做工业控制器这些年,最让我头疼的不是算法,不是通信,而是“数据到底存在哪儿”。设备要保存的参数、固件、FPGA 配置文件、运行日志、历史曲线,数据性质完全不同——有的几天才改一次,有的每秒都在写,有的丢…

阅读更多 →
KubeVela vNext 多租户设计解析:KEP-2.14 中的 TenantDefinition 与 Tenant 平台原语 2026/9/27 10:23:49

KubeVela vNext 多租户设计解析:KEP-2.14 中的 TenantDefinition 与 Tenant 平台原语

云原生DevOps运维微服务 【免费下载链接】kubevela The Modern Application Platform. 项目地址: https://gitcode.com/gh_mirrors/ku/kubevela 点击查看 免费下载 KEP-2.14 是 KubeVela vNext Roadmap(design/vela-core/keps/README.md)中的…

阅读更多 →
嵌入式驱动从“能跑”到“不崩”:量产级工程化实战指南 2026/9/27 10:23:49

嵌入式驱动从“能跑”到“不崩”:量产级工程化实战指南

我见过太多这样的场景:嵌入式驱动开发出来的demo驱动在试验板上跑得稳稳的,功能正常、数据正确,开发人员自信满满地交出去,结果样机一到客户手里,要么几天崩一次,要么高低温环境一跑就死机,要么…

阅读更多 →
预处理、编译、汇编、链接 2026/9/27 10:23:49

预处理、编译、汇编、链接

1.翻译环境和运行环境在 ANSI C 的任何⼀种实现中,存在两个不同的环境。第一种是翻译环境,在这个环境中,源代码被转换为可执行的机器指令(二进制指令);第二种是执行环境,它用于实际执行代码。1.…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉