spring04事务

jdbcTemplate使用

    <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.0.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version></dependency><!--        spring里面自带了一个连接池,, 也可以用druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.12</version></dependency></dependencies>
@Configuration
@PropertySource("classpath:db.properties")
@Data
public class JavaConfig {@Value("${db.username}")private String username;@Value("${db.password}")private String password;@Value("${db.url}")private String url;@Beanpublic DataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setUsername(username);ds.setUrl(url);ds.setPassword(password);return ds;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource){return new JdbcTemplate(dataSource);}}
public class Demo {public static void main(String[] args) {AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);JdbcTemplate jdbcTemplate = ctx.getBean(JdbcTemplate.class);//        // ddl 创建一张表,修改一个表的结构 data definition language  表定义操作
//        jdbcTemplate.execute();
//        // 批处理,调用这个方法
//        jdbcTemplate.batchUpdate();
//        // 增删改
//        jdbcTemplate.update();
//        jdbcTemplate.query();
//        jdbcTemplate.queryForList();// ddl  data  definition language
//        jdbcTemplate.execute();// 批处理
//        jdbcTemplate.batchUpdate()
//        jdbcTemplate.queryForList()
//        jdbcTemplate.query()//        add(jdbcTemplate);
//        update(jdbcTemplate);
//        delete(jdbcTemplate);
//        query2(jdbcTemplate);
//        query3(jdbcTemplate);
//        query4(jdbcTemplate);
//        query5(jdbcTemplate);query6(jdbcTemplate);}private static  void add(JdbcTemplate jdbcTemplate){int row = jdbcTemplate.update("insert into user(name,address) values (?,?)", "cc", "chengdu");System.out.println("row = " + row);}private static void update(JdbcTemplate jdbcTemplate){int row = jdbcTemplate.update("update user set address = ? where id=? ", "beijing", 1);System.out.println("row = " + row);}private static void delete(JdbcTemplate jdbcTemplate){int row = jdbcTemplate.update("delete from user where  id =?", 4);System.out.println("row = " + row);}public static void query(JdbcTemplate jdbcTemplate){jdbcTemplate.query("select * from user where address = ?", new RowCallbackHandler() {@Overridepublic void processRow(ResultSet rs) throws SQLException {// 外面声明一个list}},"chengdu");}public static void query2(JdbcTemplate jdbcTemplate){List<User> list = jdbcTemplate.query("select * from user where address = ?", new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setAddress(rs.getString("address"));return user;}}, "chengdu");System.out.println(Arrays.toString(list.toArray()));}public static void query3(JdbcTemplate jdbcTemplate){// 自动将查询结果  映射到对象上,,, 前提是查询的结果的列名称必须和实体的属性名称保持一致// 属性对不上,使用RowMapper自己去做一一映射List<User> list = jdbcTemplate.query("select * from user where address = ?", new BeanPropertyRowMapper<>(User.class), "chengdu");System.out.println(Arrays.toString(list.toArray()));}public static void query4(JdbcTemplate jdbcTemplate){// 查询一个用户User user = jdbcTemplate.queryForObject("select * from user where id = ?", new BeanPropertyRowMapper<>(User.class), 1);System.out.println("user = " + user);}public static void query5(JdbcTemplate jdbcTemplate){// 第二个参数,,设置普通对象,,,查询结果只能返回一列String name = jdbcTemplate.queryForObject("select name from user where id = ?", String.class, 1);System.out.println("name = " + name);}public static void query6(JdbcTemplate jdbcTemplate){// queryForList只能有一列,不能有多列List<String> users = jdbcTemplate.queryForList("select name from user", String.class);System.out.println(Arrays.toString(users.toArray()));}
}

传统的jdbcTemplate都是用 ?做占位符,, ,,也可以不使用?而是使用变量名称来传递参数。。使用NamedParameterJdbcTemplate…避免问号的顺序搞反了,

    @Beanpublic NamedParameterJdbcTemplate namedParameterJdbcTemplate(){return new NamedParameterJdbcTemplate(dataSource());}
 AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(JavaConfig.class);NamedParameterJdbcTemplate jdbcTemplate = ctx.getBean(NamedParameterJdbcTemplate.class);Map<String, Object> map = new HashMap<>();map.put("id",2);map.put("address","chengdu");List<User> list = jdbcTemplate.query("select * from user where id>:id and address = :address", map, new BeanPropertyRowMapper<>(User.class));System.out.println(Arrays.toString(list.toArray()));

事务

事务的四大特性

acid

  • atomicity : 原子性,,, 一个事务中的所有操作,要么全部完成,要么全部不完成
  • consistency : 一致性 ,,, 事务开始之前和事务结束之后,数据库的完整性没有被破坏
  • isolation : 隔离性,, 多个事务执行,会隔离,,事务隔离等级:读未提交,读已提交,可重复读,串行化
  • durability : 持久性,,,事务结束之后,对数据的修改是永久的
spring中的事务
编程式事务:

使用TransactionManager,, 先传入数据源配置一个TransactionManager,

   /*** 事务管理器* @return*/@BeanPlatformTransactionManager platformTransactionManager(){return new DataSourceTransactionManager(dataSource());}

transaction.getTransaction() 获取一个事务,,
transaction.commit() : 提交事务
transaction.rollback() : 回滚事务

  public void transfer(String from,String to,Double money){DefaultTransactionDefinition definition = new DefaultTransactionDefinition();TransactionStatus status = transactionManager.getTransaction(definition);try {accountDao.minusMoney(from,money);
//            int i = 1/0;accountDao.addMoney(to,money);// 提交事务transactionManager.commit(status);} catch (Exception e) {System.out.println(e.getMessage());// 回滚事务transactionManager.rollback(status);}}}

也可以用 transactionTemplate ,, spring利用aop的思想,把很多重复的东西封装了,比如jdbcTeamplate,transactionTemplate

    @BeanTransactionTemplate transactionTemplate(){// 传入一个 transactionManagerreturn new TransactionTemplate(platformTransactionManager());}
    public void transfer(String from,String to,Double money){transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {accountDao.minusMoney(from,money);int i = 1/0;accountDao.addMoney(to,money);}});}

编程式事务一般不用,因为还是有侵入的代码,事务和业务的代码混在一起

声明式事务

声明式事务本质上是aop,,需要配置tx:advice ,,事务的通知,,也就是需要被增强的方法名字,,,
aop将这个通知配置进去。。。
声明式事务底层就是aop,需要添加包:

     <dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>6.0.4</version></dependency>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"><context:component-scan base-package="com.cj.ts02"/><context:property-placeholder location="db.properties"/><bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource"><property name="url" value="${db.url}"/><property name="username" value="${db.username}"/><property name="password" value="${db.password}"/></bean><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"><property name="dataSource" ref="dataSource"/></bean><bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager"><property name="dataSource" ref="dataSource"/></bean><!--    声明式事务,本质还是aop-->
<!--    要增强的方法--><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes>
<!--            配置事务的属性,哪些方法要加事务,可以使用通配符 --><tx:method name="transfer"/>
<!--            <tx:method name="add*"/>--></tx:attributes></tx:advice><!--    aop配置,,,   相当于把这个transfer方法动态代理了,,--><aop:config><aop:pointcut id="pc" expression="execution(* com.cj.ts02.AccountService.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/></aop:config>
</beans>

java代码实现事务:使用EnableTransactionManager 开启事务,,开启了之后,,就能直接使用@Transactional注解去标识,哪个方法要有事务

@Configuration
@ComponentScan(basePackages = "com.cj.ts02")
@PropertySource("classpath:db.properties")
// 开启事务注解,, 开了之后只需要在方法上添加 @Transactional 即可
@EnableTransactionManagement
public class JavaConfig {@Value("${db.url}")private String url;@Value("${db.username}")private String username;@Value("${db.password}")private String password;@Beanpublic JdbcTemplate jdbcTemplate(){JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());return jdbcTemplate;}@BeanDataSource dataSource(){DruidDataSource ds = new DruidDataSource();ds.setUsername(username);ds.setPassword(password);ds.setUrl(url);return ds;}/*** 事务管理器* @return*/@BeanPlatformTransactionManager platformTransactionManager(){return new DataSourceTransactionManager(dataSource());}
}

java和xml结合使用,,, 在xml中可以使用<tx:annotation-driven/> : 这个配置表示启用事务注解,,相当于@EnableTransactionManager


在spring中加事务的方式都一样,,,spring中将事务的实现都抽象出来了,有一套抽象的解决方案,,,框架只需要实现接口,就能使用spring中的事务

TransactionManager : 事务管理器
TransactionDefinition : 事务的定义
TransactionStatus : 事务的状态

PlatformTransactionManager

  • getTransaction()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东方航空逆向

声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; …

【AIGC】AnimateAnyone:AI赋予静态照片生命力的魔法

摘要&#xff1a; 在人工智能技术的不断进步中&#xff0c;AnimateAnyone项目以其创新性和易用性脱颖而出&#xff0c;成为GitHub上备受瞩目的AI项目之一。由阿里巴巴智能计算研究院开发的这一技术&#xff0c;允许用户通过提供一张静态照片&#xff0c;快速生成动态角色。本文…

Shiro 简单入门

Apache Shiro 是一个强大且灵活的 Java 安全框架&#xff0c;用于处理身份验证、授权、加密和会话管理等任务。Shiro 的设计目标是提供一种简单而直观的方式来处理安全问题&#xff0c;使开发人员能够轻松集成和管理应用程序的安全性。以下是对 Shiro 的详细讲解&#xff1a; …

Linux实用命令练习

目录 一、常用命令 二、系统命令 三、用户和组 四、权限 五、文件相关命令 六、查找 七、正则表达式 八、输入输出重定向 九、进程控制 十、其他命令 1、远程文件复制&#xff1a;scp 2、locate查找 3、which命令 4、设置或显示环境变量&#xff1a;export 5、修…

学习Symfony框架

学习Symfony框架&#xff0c;一个流行的PHP Web应用框架&#xff0c;你可以遵循以下几个步骤来逐步掌握它&#xff1a; ### 1. 了解Symfony框架 - **研究架构和理念**&#xff1a;了解Symfony的设计原则&#xff0c;如可重用组件、模块化、面向对象编程、以及MVC&#xff08;模…

YOLO-V1

一、YOLO-V1整体思想与网络架构 1.1 YOLO算法整体思路解读 YOLO-V1: 经典的one-stage方法 把检测问题转化成回归问题&#xff0c;一个CNN就搞定了&#xff01; 可以对视频进行实时检测&#xff0c;应用领域非常广&#xff01; 核心思想&#xff1a; 1、预测一张图像中有哪些物…

kafka 集群 Topic 之 Partion 数据写入分布原理设计(六)

kafka 集群 Topic 之 Partion 数据写入分布原理设计(六) 集群中假如有三个节点,分别ip为200,201,202 创建topic 为test,默认分区2,副本2,在写入消息 到topic时,数据就转的过程是什么,则 partition存储数据分布是如何分布的,各个节点数据如何同步 的,isr如何实现的?…

11_电子设计教程基础篇(磁性元件)

文章目录 前言一、电感1、原理2、种类1、制作工艺2、用途 3、参数1、测试条件2、电感量L3、品质因素Q4、直流电阻&#xff08;DCR&#xff09;5、额定电流6、谐振频率SRF&#xff08;Self Resonant Frequency&#xff09;7、磁芯损耗 4、应用与选型 二、共模电感1、原理2、参数…

《昇思25天学习打卡营第15天 | 昇思MindSpore基于MindSpore的红酒分类实验》

15天 本节学了通过MindSpore的完成红酒分类。 1.K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;是机器学习最基础的算法之一。 1.1分类问题 1.2回归问题 1.3距离的定义 2.数据处理 2.1 数据准备 2.2 数据读取与处…

动画重定向——当给一个人物模型用别人物的动画时,会遇到人物与动画不匹配问题,怎么解决呢?

每日一句&#xff1a;实践出真知&#xff0c;试错方确信 目录 最开始我想的原因&#xff01; 分析一下动画相关参数 Animator组件参数详解&#xff1a; 人物模型的导入设置参数&#xff1a; Skinned Mesh Renderer组件详解: Skinned Mesh Renderer工作原理 设置Skinned …

npm常用命令使用与事件案例

概述 npm&#xff08;Node Package Manager&#xff09;是一个JavaScript编程语言的包管理器&#xff0c;用于Node.js应用程序。它允许用户安装、共享和管理具有重复使用价值的代码&#xff08;包&#xff09;&#xff0c;这些代码可以是库、工具或应用程序。 npm常用命令详解…

AI大模型的崛起:第四次工业革命的前奏?

在当今这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;大模型的崛起引起了广泛的关注和讨论。有人将其视为第四次工业革命的前奏&#xff0c;然而&#xff0c;这真的可能吗&#xff1f;本文将探讨这一问题&#xff0c;并对中国AI大模型的发展进行简要分析。…

MyBatis第一节

目录 1. 简介2. 配置3. doing3.1 创建一个表3.2 打开IDEA&#xff0c;创建一个maven项目3.3 导入依赖的jar包3.4 创建entity3.5 编写mapper映射文件(编写SQL)3.6 编写主配置文件3.7 编写接口3.8 测试 参考链接 1. 简介 它是一款半自动的ORM持久层框架&#xff0c;具有较高的SQ…

Qt:4.信号和槽

目录 1.信号源、信号和槽&#xff1a; 2.Qt类的继承关系&#xff1a; 3.自定义槽函数&#xff1a; 4.第一种信号和槽的连接的方法&#xff1a; 5.第二种信号和槽的连接的方法&#xff1a; 6.自定义信号&#xff1a; 7.发射信号&#xff1a; 8.信号和槽的传参&#xff1a;…

神经网络在机器学习中的应用:手写数字识别

机器学习是人工智能的一个分支&#xff0c;它使计算机能够从数据中学习并做出决策或预测。神经网络作为机器学习的核心算法之一&#xff0c;因其强大的非线性拟合能力而广泛应用于各种领域&#xff0c;包括图像识别、自然语言处理和游戏等。本文将介绍如何使用神经网络对MNIST数…

《昇思25天学习打卡营第17天 | 昇思MindSporeCycleGAN图像风格迁移互换》

17天 本节学习了CycleGAN图像风格迁移互换。 CycleGAN即循环对抗生成网络&#xff0c;该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。该模型一个重要应用领域是域迁移&#xff0c;可以通俗地理解为图像风格迁移。其实在 CycleGAN 之前&a…

WP黑格导航主题BlackCandy

BlackCandy-V2.0全新升级&#xff01;首推专题区(推荐分类)更多自定义颜色&#xff01;选择自己喜欢的色系&#xff0c;焕然一新的UI设计&#xff0c;更加扁平和现代化&#xff01; WP黑格导航主题BlackCandy

【高考志愿】水利工程

目录 一、专业概述 二、主要专业课程与实习实训 三、就业方向 四、选择水利工程专业的注意事项 五、未来职业发展 六、水利工程专业排名 高考志愿选择水利工程专业时&#xff0c;考生应综合考虑多方面因素。以下是对水利工程专业的详细介绍&#xff0c;以帮助考生做出更明…

Oracle内部bug导致的19c DG备库宕机

Oracle内部bug导致的19c DG备库宕机 报错信息收集原因与受影响版本Workaround与解决办法报错信息收集 数据库版本: SQL> select banner,banner_full,banner_legacy from v$version;BANNER ----------------------------------------------------------------------------…

计算机科学基础简单介绍(1—6)

计算机影响了我们生活的方方面面&#xff0c;在我们这个时代完全渗透了我们的生活。 最早是算盘、星盘、时钟、尺卡等古老的计算工具&#xff0c;后来出现了进步计算机&#xff0c;类似与汽车里程表的一种机械工具&#xff0c;但是他也是手工制品。经过历史的演变与发展&#x…