使用spring和jdbc模板事务实现

1、创建实体类:

Role

  1. package com.wbg.sjt.entity;
  2.  
  3. public class Role {
  4. private int id;
  5. private String roleName;
  6. private String note;
  7.  
  8. @Override
  9. public String toString() {
  10. return "Role{" +
  11. "id=" + id +
  12. ", roleName='" + roleName + '\'' +
  13. ", note='" + note + '\'' +
  14. '}';
  15. }
  16.  
  17. public Role() {
  18. }
  19.  
  20. public Role(int id, String roleName, String note) {
  21. this.id = id;
  22. this.roleName = roleName;
  23. this.note = note;
  24. }
  25.  
  26. public int getId() {
  27. return id;
  28. }
  29.  
  30. public void setId(int id) {
  31. this.id = id;
  32. }
  33.  
  34. public String getRoleName() {
  35. return roleName;
  36. }
  37.  
  38. public void setRoleName(String roleName) {
  39. this.roleName = roleName;
  40. }
  41.  
  42. public String getNote() {
  43. return note;
  44. }
  45.  
  46. public void setNote(String note) {
  47. this.note = note;
  48. }
  49. }

2、创建配置JavaConfig

  1.  
  1. package com.wbg.sjt.config;
  2.  
  3. import com.mchange.v2.c3p0.ComboPooledDataSource;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.ComponentScan;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.context.annotation.ImportResource;
  8. import org.springframework.jdbc.core.JdbcTemplate;
  9. import org.springframework.jdbc.datasource.DataSourceTransactionManager;
  10. import org.springframework.transaction.PlatformTransactionManager;
  11. import org.springframework.transaction.annotation.EnableTransactionManagement;
  12. import org.springframework.transaction.annotation.TransactionManagementConfigurer;
  13. import org.springframework.transaction.interceptor.TransactionInterceptor;
  14. import org.springframework.transaction.support.TransactionTemplate;
  15.  
  16. import javax.sql.DataSource;
  17. import java.beans.PropertyVetoException;
  18.  
  19. @Configuration
  20. @ComponentScan("com.wbg.sjt.*")
  21. @EnableTransactionManagement
  22. public class JavaConfig {
  23.  
  24. @Bean(name = "dataSource")
  25. public DataSource getDataSource() {
  26. ComboPooledDataSource dataSource = new ComboPooledDataSource();
  27. try {
  28. dataSource.setDriverClass("org.mariadb.jdbc.Driver");
  29. } catch (PropertyVetoException e) {
  30. e.printStackTrace();
  31. }
  32. dataSource.setJdbcUrl("jdbc:mariadb://localhost:3306/wbg_logistics");
  33. dataSource.setUser("root");
  34. dataSource.setPassword("123456");
  35. dataSource.setMaxPoolSize(30);
  36. return dataSource;
  37. }
  38.  
  39. @Bean
  40. public JdbcTemplate jdbcTemplate() {
  41. JdbcTemplate jdbcTemplate = new JdbcTemplate();
  42. jdbcTemplate.setDataSource(getDataSource());
  43. return jdbcTemplate;
  44. }
  45. @Bean
  46. public PlatformTransactionManager platformTransactionManager() {
  47. DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
  48. transactionManager.setDataSource(getDataSource());
  49. return transactionManager;
  50. }
  51.  
  52. @Bean
  53. TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
  54. return new TransactionTemplate(platformTransactionManager);
  55. }
  56.  
  57. }

3、创建dao

当出错的时候,事务滚动,数据库数据不变

代码:

  1. package com.wbg.sjt.service;
  2.  
  3. import com.wbg.sjt.entity.Role;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.jdbc.core.JdbcOperations;
  6. import org.springframework.jdbc.core.RowMapper;
  7. import org.springframework.stereotype.Repository;
  8. import org.springframework.transaction.PlatformTransactionManager;
  9. import org.springframework.transaction.TransactionStatus;
  10. import org.springframework.transaction.support.DefaultTransactionDefinition;
  11. import org.springframework.transaction.support.TransactionTemplate;
  12.  
  13. import javax.sql.DataSource;
  14. import java.sql.Connection;
  15. import java.sql.PreparedStatement;
  16. import java.sql.ResultSet;
  17. import java.sql.SQLException;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Map;
  21.  
  22. @Repository
  23. public class RoleDao {
  24. @Autowired
  25. DataSource dataSource;
  26. @Autowired
  27. private PlatformTransactionManager transactionManager = null;
  28.  
  29. @Autowired
  30. private TransactionTemplate transactionTemplate;
  31. ;
  32. @Autowired
  33. private JdbcOperations jdbcOperations;
  34.  
  35. public Role getRole(){
  36. String sql = "select * from role where id = 1";
  37. Role role = jdbcOperations.queryForObject(
  38. sql,
  39. /*
  40. //方式一
  41. new RowMapper<Role>() {
  42. @Override
  43. public Role mapRow(ResultSet rs, int rowNum) throws SQLException {
  44. return new Role(rs.getInt(1),rs.getString(2),rs.getString(3));
  45. }
  46. }*/
  47. //方式二:
  48. (rs, rowNum) -> new Role(rs.getInt(1),rs.getString(2),rs.getString(3))
  49. );
  50. return role;
  51. }
  52.  
  53. public void create() {
  54. transactionTemplate.execute(status -> {
  55. //让事务出错
  56. String sql = "insert into role(role_name,note) values(?,?)";
  57. String sql2 = "insert into role(role_namess,note) values(?,?)";
  58. jdbcOperations.update(sql, "sql", "aa");
  59. jdbcOperations.update(sql2, "sql", "aa");
  60. return null;
  61. });
  62. }
  63.  
  64. //0代码实现
  65. public List<Role> listAll() {
  66. List<Role> list = new ArrayList<Role>();
  67. Connection connection = null;
  68. try {
  69. connection = dataSource.getConnection();
  70. } catch (SQLException e) {
  71. e.printStackTrace();
  72. }
  73. String sql = "select * from role";
  74. PreparedStatement preparedStatement = null;
  75. try {
  76. preparedStatement = connection.prepareStatement(sql);
  77. ResultSet resultSet = preparedStatement.executeQuery();
  78. Role role = null;
  79. while (resultSet.next()) {
  80. role = new Role(
  81. resultSet.getInt(1),
  82. resultSet.getString(2),
  83. resultSet.getString(3)
  84. );
  85. list.add(role);
  86. }
  87. } catch (SQLException e) {
  88. e.printStackTrace();
  89. } finally {
  90. try {
  91. if (connection != null)
  92. connection.close();
  93. if(preparedStatement != null)
  94. preparedStatement.close();
  95. } catch (SQLException e) {
  96. e.printStackTrace();
  97. }
  98. }
  99. return list;
  100. }
  101.  
  102. public List<Map<String, Object>> getToList() {
  103. List<Map<String, Object>> list = jdbcOperations.queryForList("select * from role");
  104. return list;
  105. }
  106.  
  107. public Map<String, Object> getToMap() {
  108. String sql = "select * from role where id = ?";
  109. Map<String, Object> map = jdbcOperations.queryForMap(sql, 1);
  110. return map;
  111. }
  112.  
  113. public int insert(Role role) {
  114. Connection connection = null;
  115. DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();
  116. dtd.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
  117. TransactionStatus ts = transactionManager.getTransaction(dtd);
  118. String sql = "insert into role(role_name,note) values(?,?)";
  119. PreparedStatement preparedStatement = null;
  120. try {
  121. connection = dataSource.getConnection();
  122. preparedStatement = connection.prepareStatement(sql);
  123. preparedStatement.setString(1, role.getRoleName());
  124. preparedStatement.setString(2, role.getNote());
  125. preparedStatement.executeUpdate();
  126. transactionManager.commit(ts);
  127. } catch (SQLException e) {
  128. transactionManager.rollback(ts);
  129. System.out.println("原因:" + e.getMessage());
  130. }
  131. return 0;
  132. }
  133. }

测试:

  1. package com.wbg;
  2. import com.wbg.sjt.config.JavaConfig;
  3. import com.wbg.sjt.service.RoleDao;
  4. import org.springframework.context.ApplicationContext;
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  6.  
  7. import java.util.Map;
  8.  
  9. public class Main {
  10. public static void main(String[] args) {
  11. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(JavaConfig.class);
  12. RoleDao roleDao = applicationContext.getBean(RoleDao.class);
  13. System.out.println(roleDao.getRole());
  14. for (Map<String, Object> map : roleDao.getToList()) {
  15. System.out.println(map);
  16. }
  17. roleDao.create();
  18. System.out.println("----------------------");
  19. for (Map<String, Object> map : roleDao.getToList()) {
  20. System.out.println(map);
  21. }
  22. }
  23. }

demo:https://github.com/weibanggang/hibernatejpaJpaRepository.git

spring+jdbc+template+transaction实现的更多相关文章

  1. Unit06: Spring对JDBC的 整合支持 、 Spring+JDBC Template、Spring异常处理

    Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架 ...

  2. Java泛型在spring jdbc template中的类似应用

    泛型的使用保证返回的对象类型的正确: package com.stono.gentest; import java.util.ArrayList; import java.util.List; pub ...

  3. Spring JDBC Framework

    引自 :学习经典:Spring JDBC Framework 这里记录我对Spring JDBC框架的学习.由于Spring JDBC和我之前做的工作有很多共同之处,学习经典Framework的设计, ...

  4. Spring框架学习10——JDBC Template 实现数据库操作

    为了简化持久化操作,Spring在JDBC API之上提供了JDBC Template组件. 1.添加依赖 添加Spring核心依赖,MySQL驱动 <!--Spring核心基础依赖--> ...

  5. SSM 实训笔记 -11- 使用 Spring MVC + JDBC Template 实现筛选、检索功能(maven)

    SSM 实训笔记 -11- 使用 Spring MVC + JDBC Template 实现筛选.检索功能(maven) 本篇是新建的一个数据库,新建的一个完整项目. 本篇内容: (1)使用 Spri ...

  6. Spring的JDBC Template

    Spring的JDBC Template(JDBC模板)简化JDBC API开发,使用上和Apache公司的DBUtils框架非常类似) 快速入门实例 1.创建项目后,导入Spring基础核心开发包. ...

  7. springboot成神之——spring boot,spring jdbc和spring transaction的使用

    本文介绍spring boot,spring jdbc和spring transaction的使用 项目结构 依赖 application model层 mapper层 dao层 exception层 ...

  8. spring学习笔记之---JDBC Template

    JDBC  Template(简化持久化操作) (一)创建项目 (1)Maven配置 <dependencies> <dependency> <groupId>ju ...

  9. Spring之JDBC Template

    时间:2017-2-5 18:16 --Spring对不同持久化技术的支持Spring为各种支持的持久化技术都提供了简单操作的模板和回调.ORM持久化技术:    JDBC:        org.s ...

随机推荐

  1. java 2018面试题-多线程汇总(含解答)

    学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行总结的,因此罗列了自己整理的多线程的问题,都是自己觉得比较经典和一些大企业面试会问 ...

  2. 简单工厂模式的C++、Java实现

    1.简单工厂模式UML UML如下: 图1. 简单工厂模式UML 2.C++实现 类视图如下: 图2. C++实现简单工厂模式类视图 其中,SimpleFactory实现为: Product * Si ...

  3. 模块与包&常用模块

    一.模块的使用 模块定义:一系列功能的集合体 分为三大类:1.自定义模块 2.内置模块(比如 time,os,sys) 3.第三方模块 模块的表现形式: 1.使用python编写的py文件 2.已被编 ...

  4. var a =10 与 a = 10的区别

    学习文章------汤姆大叔-变量对象 总结笔记 变量特点: ①变量声明可以存储在变量对象中.②变量不能直接用delete删除. var a =10 与 a = 10的区别: ①a = 10只是为全局 ...

  5. <Android 应用 之路> 百度地图API使用(1)

    简介 详情请看百度地图官方网站 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/introduction 使用方式 申请密钥,针对移动 ...

  6. hive配置参数的说明:

    hive.ddl.output.format:hive的ddl语句的输出格式,默认是text,纯文本,还有json格式,这个是0.90以后才出的新配置: hive.exec.script.wrappe ...

  7. Raft协议--中文论文介绍

    本篇博客为著名的 RAFT 一致性算法论文的中文翻译,论文名为<In search of an Understandable Consensus Algorithm (Extended Vers ...

  8. Raspberry Config.txt 介绍

    原文连接:http://elinux.org/RPi_config.txt Config.txt 由于树莓派并没有传统意义上的BIOS, 所以现在各种系统配置参数通常被存在"config.t ...

  9. linux 安装源码后的操作 ldconfig

    https://blog.csdn.net/cqkxboy168/article/details/8657487 知识点: .如果使用 ldd 命令时没有找到对应的共享库文件和其具体位置,可能是两种情 ...

  10. 使用SDL2出现 “error LNK2019: 无法解析的外部符号 _SDL_main,该符号在函数 _main 中被引用” 时的可能错误记录

    这几天在使用SDL2,之前一直都没有错,直到上午把项目搬了个地方.结果一直出现 “error LNK2019: 无法解析的外部符号 _SDL_main,该符号在函数 _main 中被引用” . 看了网 ...