Spring集成JDBC及事务管理_第1页
Spring集成JDBC及事务管理_第2页
Spring集成JDBC及事务管理_第3页
Spring集成JDBC及事务管理_第4页
Spring集成JDBC及事务管理_第5页
已阅读5页,还剩11页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Spring集成JDBC第一种方式:基于注解方式配置JDBC1.配置文件beans.xml!- -!- maxActive: 最大连接数量 minIdle: 最小空闲连接 ;当空闲的连接数少于阀值时,连接池会申请一些连接,以免洪峰来时来不及申请 maxIdle: 最大空闲连接;当经过一个高峰事件后,连接池可以慢慢将不用的连接释放掉,一直减少到maxidle为止 initialSize: 初始化连接 连接被泄露时是否打印 removeAbandoned: 是否自动回收超时连接 removeAbandonedTimeout: 超时时间(以秒数为单位) maxWait: 超时等待时间以毫秒为单位 1

2、000等于60秒 在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位. 在每次空闲连接回收器线程(如果有)运行时检查的连接数量 1000 * 60 * 30 连接在池中保持空闲而不被空闲连接回收器线程 -2.定义一个实体类Account;数据库表package cn.test.domain;public class Account private Integer id; private String name; private Float money; public Account() super(); / TODO Auto-generated constructor stub publ

3、ic Account(String name, Float money) super(); = name; this.money = money; public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() return name; public void setName(String name) = name; public Float getMoney() return money; public void

4、setMoney(Float money) this.money = money; 3.业务类的接口AccountServicepackage cn.test.service;import java.util.List;import cn.test.domain.Account;public interface AccountService void save(Account account); void update(Account account); Account getAccount(Integer accountid); List getAccounts(); void delete

5、(Integer accountid) throws Exception;4.业务类的实现类package cn.test.service.impl;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Types;import java.util.List;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;i

6、mport org.springframework.transaction.annotation.Isolation;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import cn.test.domain.Account;import cn.test.service.AccountService;/* * 基于注解方式实现JDBC */Transactional/ 使用注解开启事务publ

7、ic class AccountServiceImpl implements AccountService private JdbcTemplate jdbcTemplate; public void setDataSource(DataSource dataSource) this.jdbcTemplate = new JdbcTemplate(dataSource); /* * Transactional(propagation=Propagation.REQUIRED)默认的事务行为;可以不指定 * 业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,则加入该事务, 否则,

8、为自己创建一个新的事务 * * Transactional(propagation = Propagation.NOT_SUPPORTED) * 声明方法不需要事务。如果方法没有关联到一个事务 * ,容器不会为它创建事务。如果方法在一个事务中被调用,则该事务会被挂起,在方法调用结束后,原先的事务便恢复执行。 * * Transactional(propagation = Propagation.REQUIRES_NEW) * 属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务 * 。如果方法已经运行在一个事务中,则原先的事务会被挂起,新的事务会被创建,直到方法执行结束,新事物才算结束

9、,原先的事务才会恢复执行。 * * Transactional(propagation = Propagation.MANDATORY) * 该属性指定业务方法只能在一个已存在的事务中执行,业务方法不能发起自己的事务。 如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。 * * Transactional(propagation = Propagation.SUPPORTS) * 这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。 * * Transactional(propagation

10、= Propagation.NEVER) * 指定业务方法绝对不能存在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出异常,只有业务方法没有关联到任何事务,才能正常运行。 * * Transactional(propagation = Propagation.NESTED) * 如果一个活动的事务存在,则运行在一个嵌套的事务中。 * 如果没有活动的事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点 * 。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效 * * 对于查询语句,我们

11、也可以设置它为只读的事务;也可设置事务超时事件,默认30秒;事务的隔离级别 * Transactional(readOnly=true,timeout=30,isolation=Isolation.READ_UNCOMMITTED) * * Read Uncommited:读未提交数据(会出现脏读,不可重复读和幻读) * Read Commited:读已提交数据(会出现不可重复读和幻读) * Repeatable Read:可重复读(会出现幻读) * Serializable:串行化 * * 脏读:一个事务读取到另外一个事务未提交的更新数据。 * 不可重复读:在同一事务中,多次读取同一数据返回

12、的结果有所不同。换句话说,后续读取可以读取到另外一事务已提价的更新数据。相反,“可重复读” 在同一事务中多次读取数据时,能够保证所读数据一样,也就是,后续读取不能读到另外一事务已提交的更新数据。 * 幻读:一个事务读取到另外一事务已提交的insert数据。 * * Sqlserver 默认的隔离级别为Read Commited,Mysql默认的级别为Repeatable read; */ Transactional(propagation = Propagation.REQUIRED,isolation=Isolation.READ_UNCOMMITTED) Override public v

13、oid save(Account account) String sql = insert into account(name,money) values (?,?); Object args = account.getName(), account.getMoney() ; int argTypes = java.sql.Types.VARCHAR, java.sql.Types.FLOAT ; jdbcTemplate.update(sql, args, argTypes); Override public void update(Account account) String sql =

14、 update account set name=?,money=? where id=?; Object args = account.getName(), account.getMoney(), account.getId() ; int argTypes = java.sql.Types.VARCHAR, java.sql.Types.FLOAT, Types.INTEGER ; jdbcTemplate.update(sql, args, argTypes); /* * 对于有些方法场景中,比如获取帐号,不需要开启事务,我们怎么做呢? * * Transactional(propaga

15、tion=Propagation.NOT_SUPPORTED) */ Transactional(propagation = Propagation.NOT_SUPPORTED) Override public Account getAccount(Integer accountid) String sql = select * from account where id=?; Object args = accountid ; int argTypes = Types.INTEGER ; return jdbcTemplate.queryForObject(sql, args, argTyp

16、es, new RowMapper() Override public Account mapRow(ResultSet rs, int index) throws SQLException Account account = new Account(); account.setId(rs.getInt(id); account.setName(rs.getString(name); account.setMoney(rs.getFloat(money); return account; ); Transactional(propagation = Propagation.NOT_SUPPOR

17、TED) Override public List getAccounts() String sql = select * from account; return jdbcTemplate.query(sql, new RowMapper() Override public Account mapRow(ResultSet rs, int index) throws SQLException Account account = new Account(); account.setId(rs.getInt(id); account.setName(rs.getString(name); acc

18、ount.setMoney(rs.getFloat(money); return account; ); /* * spring管理事务;unchecked 运行期例外 (默认自动回滚)checked 编译时例外 (默认不自动回滚) * * 我们可以修改spring事务的默认回滚方式,通过在方法上加Transactional注解,修改注解的属性; * * Transactional(rollbackFor=Exception.class) */ Transactional(rollbackFor = Exception.class) Override public void delete(In

19、teger accountid) throws Exception String sql = delete from account where id=?; Object args = accountid ; int argTypes = Types.INTEGER ; jdbcTemplate.update(sql, args, argTypes); / 当抛出运行时异常,则事务管理器自动回滚 / throw new RuntimeException(运行期异常); / 当抛出的是编译异常,则事务管理器不会自动回滚 / 通过测试,数据库记录被删除了 throw new Exception(编

20、译期异常); 5.测试类package junit.test;import java.util.List;import org.junit.BeforeClass;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import cn.test.domain.Account;import cn.test.service.AccountService;

21、public class AccountServiceTest private static AccountService accountService; BeforeClass public static void setUpBeforeClass() try ApplicationContext cxt = new ClassPathXmlApplicationContext( beans.xml); accountService = (AccountService) cxt.getBean(accountServiceImpl); catch (Exception e) e.printS

22、tackTrace(); Test public void save() accountService.save(new Account(ddd1,123f); Test public void find() Account account=accountService.getAccount(7); System.out.println(account); Test public void getAccounts() List list=accountService.getAccounts(); for(Account account:list) System.out.println(acco

23、unt.getName()+:+account.getMoney(); Test public void update() Account account= accountService.getAccount(7); account.setName(ddd2); accountService.update(account); Test public void delete() try accountService.delete(5); catch (Exception e) / TODO Auto-generated catch block e.printStackTrace(); 6.当使用

24、的是用properties配置的xml文件时,该文件名叫pertiesdriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql:/localhost:3306/day16?useUnicode=true&characterEncoding=UTF-8username=rootpassword=*maxActive=150minIdle=5maxIdle=20initialSize=10logAbandoned=trueremoveAbandoned=trueremoveAbandonedTimeout=10maxWait=1000timeBetweenEvictionRunsMillis=10000numTestsPerEvictionRun=10minEvictableIdleTimeMillis=10000validationQuery=SELECT NOW() FROM DUAL第二种方式:使用XML配置管理JDBC及事务!- -!- maxActive: 最大连接数量 minIdle: 最小空闲连接 ;当空闲的连接数少于阀值时,连接池会申请一些连接,以免洪峰来时来不及申请 maxIdle: 最大空闲连接;当经过一个高峰事件后,连接池可以慢慢将不用的连接释放掉,一直减少到maxidle为止

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论