第一步用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>
创建数据源对象:
想要开启事务管理第一步需要配置事务管理主键:
如果想开启事务的话就在方法中写个@Transactional注解,也可以将这个注解写在类上面变成全局的
在org.springframework.transaction.annotation.Transactional这个包下
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语句就不在一个事物当中
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();
}
}