首页/新闻资讯/正文详情

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

发布时间:2026/9/27 9:32:18 来源:云帆数科 栏目:资讯中心
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(转账成功);}}五、测试

相关推荐

wordpress3.8中文标签建站报价揭秘
wordpress3.8中文标签建站报价揭秘

wordpress3.8中文标签建站报价揭秘 备案流程一头雾水?很多老板在拿到建站报价单后,第一反应不是看价格,而是盯着那几行关于“ICP备案”的条款发呆。你以为付了钱,网站就能立马上线?错。在中国大陆,没有备案的域名无法解析到国内服务器,… · 2026/9/27 9:32:12

Spring AOP—基于注解的AOP实现
Spring AOP—基于注解的AOP实现

本文工具: IDEA2020.1 maven3.6.3 本文源代码如下: (1)百度网盘 通过网盘分享的文件:Spring AOP—基于注解的AOP实现.zip 链接: https://pan.baidu.com/s/1SoXPzI__RafafuOCMegD_Q?pwd4smh 提取码: 4smh &#xff… · 2026/9/27 9:32:12

本地大模型硬件真相:从 MoE、CPU/GPU/NPU 到 32GB Mac mini 实战调优
本地大模型硬件真相:从 MoE、CPU/GPU/NPU 到 32GB Mac mini 实战调优

用 CPU 跑大模型的人,几乎都会经历一种奇妙的“冰火两重天”: 当你用一台 8 核 CPU 跑混合专家模型(MoE,例如总参数 30B、单字激活约 3B 的 Qwen3-30B-A3B,Q4 量化约 18GB)时,一旦模型开始生成回… · 2026/9/27 9:32:06

JESD204B高速数据采集实战:IP核配置、MicroBlaze初始化与调试避坑指南
JESD204B高速数据采集实战:IP核配置、MicroBlaze初始化与调试避坑指南

1. 为什么JESD204会成为高速数据采集的必经之路搞FPGA开发到一定阶段,你迟早会撞上JESD204这个协议。我第一次接触它是在一个高速ADC采集项目里,当时用的还是LVDS并行接口,16对差分线拉得密密麻麻,PCB走线等长绕得我头皮发麻。后来… · 2026/9/27 10:20:30

清远网站开发图解步骤:3招搞定黑挂马与SEO排名
清远网站开发图解步骤:3招搞定黑挂马与SEO排名

清远网站开发图解步骤:3招搞定黑挂马与SEO排名 昨天刚帮清远一家做陶瓷出口的老板处理完紧急事故。他的网站突然打不开,浏览器弹出红色警告,页面底部赫然出现几个赌博和色情链接的乱码。他急得直拍桌子:“我明明开了防火墙,怎么还被黑挂了马?现在流… · 2026/9/27 10:20:24

检出的缺陷为何仍流入下道工序?质量防错与追溯实战
检出的缺陷为何仍流入下道工序?质量防错与追溯实战

1. 一道让所有质量人夜不能寐的送命题“检出来的缺陷,为什么还是流到了下一道工序?”这句话我第一次听到,是在车间里被生产主管当面质问。当时我负责的那条装配线,终检工位明明已经贴了红色不合格标签,结果第二天客户投… · 2026/9/27 10:20:06

JESD204B/C协议实战:从IP核配置到MicroBlaze初始化的高速ADC/DAC链路调试指南
JESD204B/C协议实战:从IP核配置到MicroBlaze初始化的高速ADC/DAC链路调试指南

1. 从"协议看不懂"到"数据跑起来":JESD204到底在解决什么问题如果你手上有块高速ADC或者DAC的板子,采样率动辄几百MSPS甚至上GSPS,那你大概率绕不开JESD204这个协议。我刚开始接触的时候也是一头雾水——明明有并行LVDS接… · 2026/9/27 10:20:00

G-Helper 完整指南:如何免费替代 Armoury Crate 控制华硕笔记本
G-Helper 完整指南:如何免费替代 Armoury Crate 控制华硕笔记本

G-Helper 完整指南:如何免费替代 Armoury Crate 控制华硕笔记本 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Ze… · 2026/9/27 10:20:00

《Docker 镜像、容器、仓库一张图讲清楚》
《Docker 镜像、容器、仓库一张图讲清楚》

Docker 镜像、容器、仓库一张图讲清楚 很多初学者刚接触 Docker 时,会被三个词绕晕:镜像(Image)、容器(Container)、仓库(Registry/Repository)。 它们看起来都和“装东西”有关&… · 2026/9/27 10:19:35

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码