Spring(四)-- JdbcTemplate、声明式事务
<!-- 加载properties文件中 信息 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置数据源 -->
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
其中,新建 jdbc.properties 文件
内容:
jdbc.username=root
jdbc.password=123456
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/jdbc_template
③在IOC容器中配置JdbcTemplate对象的bean,并将数据源对象装配到JdbcTemplate对象中
<!-- 配置JdbcTemplate对应的bean, 并装配dataSource数据源属性-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean>
@Test
public void test() throws SQLException{
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
DataSource bean = ioc.getBean(DataSource.class);
System.out.println(bean.getConnection());
}

实验2:将emp_id=5的记录的salary字段更新为1300.00【更新操作】
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
@Test
public void test() throws SQLException{
String sql = "UPDATE employee SET salary = ? WHERE emp_id = ?";
bean.update(sql, 1300,5);//第一个是sql语句,后面的按着顺序传入参数即可,这个update方法是接收的可变参数!
}
}
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
@Test
public void test() throws SQLException{
String sql="INSERT INTO employee(emp_name,salary) VALUES(?,?)";
List<Object[]> list = new ArrayList<Object[]>();
list.add(new Object[]{"Tom2015",1000});
list.add(new Object[]{"Tom2016",2000});
list.add(new Object[]{"Tom2017",3000});
bean.batchUpdate(sql, list);
}
}
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
@Test
public void test(){
//需要注意的是:sql语句中的别名要与对应实体类的属性名保持一致!
String sql = "SELECT emp_id AS empId,emp_name AS empName,salary FROM employee WHERE emp_id=?";
//RowMapper是一个接口,这里我们使用其子类
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
//最后一个参数是可变参数,用于向sql语句中依次传递参数!
Employee employee = bean.queryForObject(sql, rowMapper, 5);
System.out.println(employee);
}
}
实验5:查询salary>4000的数据库记录,封装为List集合返回
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
@Test
public void test(){
//需要注意的是:sql语句中的别名要与对应实体类的属性名保持一致!
String sql = "SELECT emp_id AS empId,emp_name AS empName,salary FROM employee WHERE salary > ?";
//RowMapper是一个接口,这里我们使用其子类
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<Employee>(Employee.class);
//该query方法查询出来的是一个list列表,query方法的最后一个参数是可变参数!
List<Employee> list = bean.query(sql, rowMapper, 4000);
for (Employee employee : list) {
System.out.println(employee);
}
}
}
实验6:查询最大salary
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
@Test
public void test01(){
String sql = "SELECT MAX(salary) FROM employee";
//需要指定返回值的类型,而且类型必须是包装类型
Double maxSalary = bean.queryForObject(sql, Double.class);
System.out.println(maxSalary);
}
}
实验7:使用带有具名参数的SQL语句插入一条员工记录,并以Map形式传入参数值
<!-- 为了执行带有具名参数的SQL语句,需要配置NamedParameterJdbcTemplate -->
<!-- 该NamedParameterJdbcTemplate类没有无参构造器,需要传入JdbcTemplate对象或者数据源对象[DataSource] -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<!-- 不能使用property标签配置 -->
<constructor-arg ref="jdbcTemplate"></constructor-arg>
</bean>
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test01(){
NamedParameterJdbcTemplate bean2 = ioc.getBean(NamedParameterJdbcTemplate.class);
String sql="INSERT INTO employee(emp_name,salary) VALUES(:paramName,:paramSalary)";//具名参数与map 的key 值相同
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("paramName","张学友" );
paramMap.put("paramSalary",1000);
bean2.update(sql, paramMap);
}
}
实验8:重复实验7,以SqlParameterSource形式传入参数值
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test01(){
NamedParameterJdbcTemplate bean2 = ioc.getBean(NamedParameterJdbcTemplate.class);
String sql="INSERT INTO employee(emp_name,salary) VALUES(:empName,:salary)";
//该BeanPropertySqlParameterSource类构造器需要一个对象参数,该对象参数是一个封装了sql语句参数的对象!
//此时要求对象的属性名要和sql中的参数名保持一致!这里我们使用Employee对象来完成
Employee employee= new Employee("郭富城", 1500);
//以实体对象的形式封装具名参数和值
SqlParameterSource source = new BeanPropertySqlParameterSource(employee);
bean2.update(sql, source);
}
}
@Repository
public class JdbcTemplateDao {
@Autowired
private JdbcTemplate jdbcTemplate; public void update(){
String sql = "DELETE FROM employee where emp_id = ?";
jdbcTemplate.update(sql, 15);
}
}
public class TestJDBCTemplate {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private JdbcTemplate bean = ioc.getBean(JdbcTemplate.class);
private JdbcTemplateDao dao = ioc.getBean(JdbcTemplateDao.class);
@Test
public void testEmployeeDao(){
dao.update();
}
}
<context:component-scan base-package="com.neuedu"></context:component-scan>
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="comboPooledDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
</bean>
<!-- 以上时JdbcTemplate配置所需 --> <!-- 配置事务管理器 -->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="comboPooledDataSource"></property>
</bean> <!-- 开启基于注解的声明式事务 -->
<!-- 有时候不需要transaction-manager 因为默认值为transactionManager -->
<!-- 如果事务管理器的id为transactionManager就不用写 -->
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
public class TestDataSource {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test() throws Exception {
DataSource bean = ioc.getBean(DataSource.class);
System.out.println(bean.getConnection());
}
}
@Repository
public class BookDao { @Autowired
private JdbcTemplate template; public double findPriceByIsbn(String isbn){
String sql = "SELECT price FROM book WHERE isbn = ?";
Double price = template.queryForObject(sql, Double.class, isbn);
return price;
} public void updateBookStock(String isbn){
String sql="UPDATE book_stock SET stock = stock -1 WHERE isbn = ?";
template.update(sql, isbn);
} public void updateAccount(String username,Double price){
String sql = "UPDATE account SET balance = balance - ? WHERE username = ?";
template.update(sql, price,username);
} //演示事务的传播机制
public void updateBookPrice(double price,String isbn){
String sql ="UPDATE book SET price = ? WHERE isbn = ?";
template.update(sql, price,isbn);
}
}
7.创建 Service 层
@Service
public class BookService { @Autowired
private BookDao bookDao; @Transactional
public void doCash(String isbn,String username){
double price = bookDao.findPriceByIsbn(isbn);
bookDao.updateBookStock(isbn);
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
bookDao.updateAccount(username, price);
} @Transactional
public void updateBookPrice(double price,String isbn){
bookDao.updateBookPrice(price, isbn);
}
}
public class TestBookService {
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test() {
BookService bean = ioc.getBean(BookService.class);
bean.doCash("ISBN-001", "Tom");
}
}
- 事务的隔离级别
- 事务根据什么异常不进行回滚
- 事务的超时属性
- 事务的只读属性
@Transactional(propagation=Propagation.REQUIRED)
public void doCash(String isbn,String username){
double price = bookDao.findPriceByIsbn(isbn);
bookDao.updateBookStock(isbn);
bookDao.updateAccount(username, price);
} @Transactional(propagation=Propagation.REQUIRED)
public void updateBookPrice(double price,String isbn){
bookDao.updateBookPrice(price, isbn);
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void doCash(String isbn,String username){
double price = bookDao.findPriceByIsbn(isbn);
bookDao.updateBookStock(isbn);
bookDao.updateAccount(username, price);
} @Transactional(propagation=Propagation.REQUIRES_NEW)
public void updateBookPrice(double price,String isbn){
bookDao.updateBookPrice(price, isbn);
}
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
public void doCash(String isbn,String username){
double price = bookDao.findPriceByIsbn(isbn);
System.out.println(price);
bookDao.updateBookStock(isbn);
bookDao.updateAccount(username, price);
}
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED
,noRollbackFor={ArithmeticException.class}
)
public void doCash(String isbn,String username){
double price = bookDao.findPriceByIsbn(isbn);
bookDao.updateBookStock(isbn);
int i = 10/0;//异常
bookDao.updateAccount(username, price);
}
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED
,noRollbackFor={ArithmeticException.class}
,timeout=3)
public void doCash(String isbn,String username){
double price = bookDao.findPriceByIsbn(isbn);
bookDao.updateBookStock(isbn);
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
bookDao.updateAccount(username, price);
}
Spring(四)-- JdbcTemplate、声明式事务的更多相关文章
- Spring(四)-声明式事务
Spring-04 声明式事务 1.事务的定义 事务就是由一组逻辑上紧密关联的多个工作单元(数据库操作)而合并成一个整体,这些操作要么都执行,要么都不执行. 2.事务的特性:ACID 1)原子性A : ...
- Spring(四)Spring JdbcTemplate&声明式事务
JdbcTemplate基本使用 01-JdbcTemplate基本使用-概述(了解) JdbcTemplate是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装.spr ...
- 170831-关于JdbcTemplate声明式事务-操作步骤-例子
创建一个动态web工程 加入jar包 3.创建一份jdbc.properties文件 4.在spring配置文件中配置数据源 5.测试数据源: 6.配置jdbcTemplate: 7.创建Dao类 & ...
- Spring的 JDBCTemplate和声明式事务控制
Spring 中的 JdbcTemplate[会用] JdbcTemplate 概述 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.spring 框架为我们提供 ...
- 11、Spring教程之声明式事务
1.回顾事务 事务在项目开发过程非常重要,涉及到数据的一致性的问题,不容马虎! 事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性. 事务就是把一系列的动作当成一个独立的工作单元,这 ...
- Spring AOP实现声明式事务代码分析
众所周知,Spring的声明式事务是利用AOP手段实现的,所谓"深入一点,你会更快乐",本文试图给出相关代码分析. AOP联盟为增强定义了org.aopalliance.aop.A ...
- SSM实战——秒杀系统之Service层接口设计与实现、Spring托管、声明式事务
一:Service层接口设计 准备工作:新建三个包:service包.exception包.dto包,分别用来存放业务接口.自定义异常类.dto类. 1:定义接口 package org.myseck ...
- Spring—SSJ集成&声明式事务管理
1. 课程介绍 1. SSJ集成;(掌握) 2. 声明式事务管理;(掌握) 什么是三大框架 2.1. ssh Struts/Struts2 Spring Hibernate 2.2. ss ...
- spring+mybatis之声明式事务管理初识(小实例)
前几篇的文章都只是初步学习spring和mybatis框架,所写的实例也都非常简单,所进行的数据访问控制也都很简单,没有加入事务管理.这篇文章将初步接触事务管理. 1.事务管理 理解事务管理之前,先通 ...
- Spring笔记(5) - 声明式事务@EnableTransactionManagement注解源码分析
一.背景 前面详解了实现Spring事务的两种方式的不同实现:编程式事务和声明式事务,对于配置都使用到了xml配置,今天介绍Spring事务的注解开发,例如下面例子: 配置类:注册数据源.JDBC模板 ...
随机推荐
- python web开发之django
上一篇介绍了python-web.py的开发,本节课我们详细说明django的开发与使用. 简介及可以学习到的内容: 1.Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表 ...
- UglyNumber - 找“丑数”
uglynumber的定义是只能被1,2,3,5整除的数 规定1是第一个uglynumber:以此类推,1 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32 ...
- Python爬取百度贴吧数据
本渣除了工作外,在生活上还是有些爱好,有些东西,一旦染上,就无法自拔,无法上岸,从此走上一条不归路.花鸟鱼虫便是我坚持了数十年的爱好. 本渣还是需要上班,才能支持我的业余爱好.上班时间还是尽量访问外网 ...
- 【Owin 学习系列】1. 第一个 Owin 程序
IIS 中的 Owin 在 IIS 里面部署 Owin,既能得到 Owin 管道模型的灵活性和模块特性,也能很好地利用 IIS 成熟的配置,Owin 程序将会跑在 ASP.NET request 的管 ...
- 项目中ApplicationContext
applicationContext说白了就是对beanFactory的扩展,也就是一个spring容器,而且applicationContext是单例的,项目中主要包含一个webApplicatio ...
- maven相关的学习资料
1, maven的settings配置文件详解: http://blog.csdn.net/jinshuaiwang/article/details/23686099 2,maven原理---翡青的博 ...
- WAS 部署 Birt 报表出现 error.CannotStartupOSGIPlatform 和 更新web.xml
在WAS7.0中部署Birt报表会出现error.CannotStartupOSGIPlatform错误,通常需要这样修改 1.依次打开Applications->WebSphere enter ...
- [js高手之路] es6系列教程 - 不定参数与展开运算符(...)
三个点(...)在es6中,有两个含义: 用在形参中, 表示传递给他的参数集合, 类似于arguments, 叫不定参数. 语法格式: 在形参面前加三个点( ... ) 用在数组前面,可以把数组的值 ...
- 【某集训题解】【DAY 2 T3】与非
题目描述 作为一名新世纪共产主义的接班人,你认识到了资本主义的软弱性与妥协性,决定全面根除资本主义,跑步迈入共产主义.但是当你即将跨入共产主义大门的时候,遇到了万恶的资本家留下的与非电路封印,经过千辛 ...
- vc操作电脑之常用命令
1.重启计算机: ExitWindowsEx(EWX_REBOOT,0); 2.关机: ExitWindowsEx(EWX_SHUTDOWN,0); 3.注销: ExitWindowsEx(EWX_L ...