Jdbc模板、事务管理

简介: 第一步用maven引入jdbc模板:注意引入的是Spring jdbc模板 第二步创建DataSource对象bena(用的话直接调用就行了) 懂就行了 jdbc模板查询巨麻烦mybatis好一点 更新语句用了Spring为我节省了好多操作例如:Connection、PreparedSta.

第一步用maven引入jdbc模板:注意引入的是Spring jdbc模板

第二步创建DataSource对象bena(用的话直接调用就行了)

懂就行了 jdbc模板查询巨麻烦mybatis好一点

更新语句用了Spring为我节省了好多操作例如:Connection、PreparedStatement、ResultSet等等操作

他这里是封装了jdbc操作


开始jdbc模板需要的jar:

c3p0数据源

spring-jdbc、spring的jdbc架包

Spring的环境架包

Xml配置

<?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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.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 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    <context:annotation-config></context:annotation-config>
    <context:component-scan base-package="com.sun.spring"/>

    <tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>
    <!--proxy-target-class="true"默认代理的是借口类型所以会报找不见类错误,将模式改为代理类而不是接口-->
    <!--JDBC模板上有接口-->
    <bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
     </bean>
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test2?useUnicode=true&
                characterEncoding=UTF-8&useSSL=false"/>
        <property name="user" value="root"/>
        <property name="password" value="Sb1996350."/>
        <property name="maxPoolSize" value="3"/>
      <property name="minPoolSize" value="1"/>
    </bean>

</beans>

创建数据源对象:

08f1e3fc90a476efce0ca7bf54450e0e9088ae4d

想要开启事务管理第一步需要配置事务管理主键:

8a80611d1a7430500b143fa6b444bb37769747ca

e989c0808f3148ac29ef27caf99e88f0d186ae2b


在类中操作用到的注解:

14407e97c90266d1bbf5071cf8c6ca117583834c

如果想开启事务的话就在方法中写个@Transactional注解,也可以将这个注解写在类上面变成全局的

在org.springframework.transaction.annotation.Transactional这个包下


dc8806952b094ba99f9fd8ad7c9723e3fc5832c0



package com.sun.spring;

import org.aspectj.lang.annotation.Around;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

@Component
public class UserDao extends JdbcTemplate {
    @Autowired
    public void setDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }

    public void insert(String sname, String address) {
        update("insert into student(sname,address) values (?,?)", sname, address);
    }

    public void update1(String sname, String address, int sid) {
        update("update student set sname=?,address=? where sid=?", sname, address, sid);
    }

    ;

    public List<Student> select1() {
//需要创建数据库表向对应的对象,返回的是对象
        List<Student> studentList = this.query("select*from student", new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                Student student = new Student();
                student.setSname(resultSet.getString("sname"));
                student.setAddress(resultSet.getString("address"));
                student.setSid(resultSet.getInt("sid"));
                student.setCid(resultSet.getString("cid"));
                return student;
            }
        });
        return studentList;
    }
}

Spring事务管理:

          如果没有开启事务的话,sql语句就不在一个事物当中

d280039b83c4fa73b941ef031a2d9c61113d6823

 Spring中七种Propagation类的事务属性详解: 

  @Transactional(propagation = (在这里选择)Propagation.REQUIRES_NEW)

 REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 


 SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。 


 MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。 


 REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。 


 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 


 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 


 NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。



//这个方法每个方法都是独立的事务

//这个切面是切的StudentDao类他会在每个方法的前后都加开启和提交


//每个方法都是单独的事务


@Component()
@Transactional
public class StudentDao extends JdbcTemplate {
    @Autowired
    public void SetDataSource(DataSource dataSource) {
        super.setDataSource(dataSource);
    }
//这两个方法用的是一个事物即使其中一个事物失败另一个也会提交数据(之所以会这样因为他动态代理了在每个方法前后都做了开始方法后都做了提交)
//这个操作并不是很好,所以就需要一个管理事务类 
   @Transactional  
    public void insert1 (){
        update("insert into student(sname,address) values (?,?)", "小李子", "东莞");

    }
    @Transactional
    public void insert2() {
        update("insert into student(name,address) values (?,?)", "小李子", "东莞");

    }
}


所以需要一个单独的类来管理事务,将事务管理在一个方法中,执行方法前开启事务,方法后关闭事务

业务逻辑处理类


 




可以控制事务回滚:不是所有异常都要回滚,有可能你密码错了,要进行录入

事务使用面向切面,代理模式来做个 方法前要执行那些(开启事务) 方法后是否发生异常(发生回滚,未发生提交)


@Component
public class StudentDaoService {
    @Autowired
    private StudentDao studentDao;//直接通过注释将对象赋值给他

    @Transactional()
    //isolation事务隔离级别
    //timeout超时只要在规定时间没有执行完就会报错
    //@Transactional(在各个当中选择你的需要)
    //readOnly只读模式只能读不能修改数据,在这个方法中不能插入任何数据,调用别人的方法修改数据也不行(只要修改就不行)
    //可以指定多个异常类
    //noRollbackFor这里声明报发生哪些异常事务不用回滚,这里一般指的是业务需要要不用回滚的
    //rollbackFor发生哪些异常类需要回滚
    public void insert() {
        studentDao.insert1();
        studentDao.insert2();
        //这里还是会报错误,但是可以对数据库进行操作,这里将事务提交了
        String s = null;
        //假如这个是密码的话,这是密码错误
        s.toCharArray();
    }
}



目录
相关文章
|
11月前
|
SQL 缓存 Java
Spring JDBC-混合框架的事务管理
Spring JDBC-混合框架的事务管理
91 0
|
11月前
|
监控 安全 Java
Spring JDBC-事务管理中的多线程问题
Spring JDBC-事务管理中的多线程问题
153 0
|
XML Java 数据库连接
Spring JDBC与事务管理(三)
Spring JDBC与事务管理
85 0
Spring JDBC与事务管理(三)
|
Java 测试技术 数据库连接
Spring JDBC与事务管理(二)
Spring JDBC与事务管理
80 0
Spring JDBC与事务管理(二)
|
Java 数据库连接 程序员
Spring JDBC与事务管理(一)
Spring JDBC与事务管理
71 0
Spring JDBC与事务管理(一)
|
SQL Java 关系型数据库
|
3月前
|
SQL Java 关系型数据库
MySQL之JDBC(二)
MySQL之JDBC(二)
34 0
|
3月前
|
关系型数据库 MySQL Java
MySQL之JDBC(一)
MySQL之JDBC
33 0