spring+jdbc+template+transaction实现

使用spring和jdbc模板事务实现

1、创建实体类:

Role

package com.wbg.sjt.entity;

public class Role {
    private int id;
    private String roleName;
    private String note;

    @Override
    public String toString() {
        return "Role{" +
                "id=" + id +
                ", roleName=‘" + roleName + ‘\‘‘ +
                ", note=‘" + note + ‘\‘‘ +
                ‘}‘;
    }

    public Role() {
    }

    public Role(int id, String roleName, String note) {
        this.id = id;
        this.roleName = roleName;
        this.note = note;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }
}

2、创建配置JavaConfig


package com.wbg.sjt.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import org.springframework.transaction.interceptor.TransactionInterceptor;
import org.springframework.transaction.support.TransactionTemplate;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;

@Configuration
@ComponentScan("com.wbg.sjt.*")
@EnableTransactionManagement
public class JavaConfig  {

    @Bean(name = "dataSource")
    public DataSource getDataSource() {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        try {
            dataSource.setDriverClass("org.mariadb.jdbc.Driver");
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        dataSource.setJdbcUrl("jdbc:mariadb://localhost:3306/wbg_logistics");
        dataSource.setUser("root");
        dataSource.setPassword("123456");
        dataSource.setMaxPoolSize(30);
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(getDataSource());
        return jdbcTemplate;
    }
    @Bean
    public PlatformTransactionManager platformTransactionManager() {
        DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
        transactionManager.setDataSource(getDataSource());
        return transactionManager;
    }

    @Bean
    TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
        return new TransactionTemplate(platformTransactionManager);
    }

}

3、创建dao

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

代码:

package com.wbg.sjt.service;

import com.wbg.sjt.entity.Role;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcOperations;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionTemplate;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Repository
public class RoleDao {
    @Autowired
    DataSource dataSource;
    @Autowired
    private PlatformTransactionManager transactionManager = null;

    @Autowired
    private TransactionTemplate transactionTemplate;
    ;
    @Autowired
    private JdbcOperations jdbcOperations;

   public Role getRole(){
        String sql = "select * from role where id = 1";
        Role role =  jdbcOperations.queryForObject(
                sql,
              /*
              //方式一
               new RowMapper<Role>() {
                    @Override
                    public Role mapRow(ResultSet rs, int rowNum) throws SQLException {
                        return new Role(rs.getInt(1),rs.getString(2),rs.getString(3));
                    }
                }*/
                //方式二:
                (rs, rowNum) -> new Role(rs.getInt(1),rs.getString(2),rs.getString(3))
        );
        return role;
    }

    public void create() {
        transactionTemplate.execute(status -> {
            //让事务出错
            String sql = "insert into role(role_name,note) values(?,?)";
            String sql2 = "insert into role(role_namess,note) values(?,?)";
            jdbcOperations.update(sql, "sql", "aa");
            jdbcOperations.update(sql2, "sql", "aa");
            return null;
        });
    }

    //0代码实现
    public List<Role> listAll() {
        List<Role> list = new ArrayList<Role>();
        Connection connection = null;
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        String sql = "select * from role";
        PreparedStatement preparedStatement = null;
        try {
            preparedStatement = connection.prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            Role role = null;
            while (resultSet.next()) {
                role = new Role(
                        resultSet.getInt(1),
                        resultSet.getString(2),
                        resultSet.getString(3)
                );
                list.add(role);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (connection != null)
                    connection.close();
                if(preparedStatement != null)
                    preparedStatement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return list;
    }

    public List<Map<String, Object>> getToList() {
        List<Map<String, Object>> list = jdbcOperations.queryForList("select * from role");
        return list;
    }

    public Map<String, Object> getToMap() {
        String sql = "select * from role where id = ?";
        Map<String, Object> map = jdbcOperations.queryForMap(sql, 1);
        return map;
    }

    public int insert(Role role) {
        Connection connection = null;
        DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();
        dtd.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus ts = transactionManager.getTransaction(dtd);
        String sql = "insert into role(role_name,note) values(?,?)";
        PreparedStatement preparedStatement = null;
        try {
            connection = dataSource.getConnection();
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, role.getRoleName());
            preparedStatement.setString(2, role.getNote());
            preparedStatement.executeUpdate();
            transactionManager.commit(ts);
        } catch (SQLException e) {
            transactionManager.rollback(ts);
            System.out.println("原因:" + e.getMessage());
        }
        return 0;
    }
}

测试:

package com.wbg;
import com.wbg.sjt.config.JavaConfig;
import com.wbg.sjt.service.RoleDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import java.util.Map;

public class Main {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(JavaConfig.class);
        RoleDao roleDao = applicationContext.getBean(RoleDao.class);
        System.out.println(roleDao.getRole());
        for (Map<String, Object> map : roleDao.getToList()) {
            System.out.println(map);
        }
        roleDao.create();
        System.out.println("----------------------");
        for (Map<String, Object> map : roleDao.getToList()) {
            System.out.println(map);
        }
    }
}

原文地址:https://www.cnblogs.com/weibanggang/p/10156065.html

时间: 2024-10-10 11:12:12

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

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

Unit06: Spring对JDBC的 整合支持 . Spring+JDBC Template .Spring异常处理 1. springmvc提供的异常处理机制 我们可以将异常抛给spring框架,让spring来帮我们处理异常. (1)使用简单异常处理器 step1. 配置简单异常处理器. step2. 添加对应的异常处理页面. 注:该方式只适合处理简单异常的处理,如果要对异常做复杂处理,比如 记录日志等,则不合适了. (2)使用@ExceptionHandler注解 step1. 在处理

Spring+JDBC Template应用步骤

1.应用步骤介绍 基于SpringMVC和JDBC技术开发的主要步骤如下 创建工程,搭建SpringMVC和JDBC技术环境 基于JdbcTemplate实现DAO组件 编写和配置SpringMVC的主要组件,例如Controller,HandlerMapping,ViewResolver等 编写JSP视图组件,利用标签和表达式显示模型数据 测试程序 2.如何搭建SpringMVC和JDBC技术环境? 创建一个Web工程 添加JDBC相关技术环境 引入数据库驱动包 引入dbcp连接池开发包 添加

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

泛型的使用保证返回的对象类型的正确: package com.stono.gentest; import java.util.ArrayList; import java.util.List; public class StoryTeller { public static void main(String[] args) { List<Minstrel> story = StoryTemplate.getStory("select", new StoryI<Mins

Spring之JDBC Template

时间:2017-2-5 18:16 --Spring对不同持久化技术的支持 Spring为各种支持的持久化技术都提供了简单操作的模板和回调. ORM持久化技术:    JDBC:        org.springframework.jdbc.core.JdbcTemplate Hibernate3.0:        org.springframework.orm.hibernate3.HibernateTemplate IBatis(MyBatis):        org.springfr

spring + jdbc + extjs configuration

所有源代码能够訪问我的GitHub 有空没空的稻谷了几天,最终前后台跑通了,提供一套可用的配置文件. (因为与extjs整合,spring security的登录须要重写原handler.会在后面补上) 首先是pom.主要有junit.spring(mvc + security).log4j以及jdbc(mysql)依赖. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w

一个spring jdbc实例

一.使用示例 (1)springJdbcContext.xml Java代码   <?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

Spring JDBC入门

Spring将替我们完成所有使用JDBC API进行开发的单调乏味的.底层细节处理工作. 操作JDBC时Spring可以帮我们做这些事情: 定义数据库连接参数,打开数据库连接,处理异常,关闭数据库连接 我们仅需要关注: 声明SQL语句,处理每一次得到的结果 一个较为简单的例子与讲解 JdbcTemplate类 JdbcTemplate是core包的核心类.它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用.它还可以帮助我们避免一些常见的错误,比如忘记关闭数据库连接.JdbcTe

Spring JDBC主从数据库配置

通过昨天学习的自定义配置注释的知识,探索了解一下web主从数据库的配置: 背景:主从数据库:主要是数据上的读写分离: 数据库的读写分离的好处? 1. 将读操作和写操作分离到不同的数据库上,避免主服务器出现性能瓶颈: 2. 主服务器进行写操作时,不影响查询应用服务器的查询性能,降低阻塞,提高并发: 3. 数据拥有多个容灾副本,提高数据安全性,同时当主服务器故障时,可立即切换到其他服务器,提高系统可用性: 读写分离的基本原理就是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELE

Spring事务管理Transaction

Spring提供了许多内置事务管理器实现: DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架.iBATIS或MyBatis框架的事务管理: JdoTransactionManager:位于org.springframework.orm.jdo包中,提供对单个javax.jdo.Persistenc