Spring整合JDBC及事务处理
1.Spring整合JDBC
DAO是数据访问对象(data access object)的简写。接口是实现松耦合的关键,Spring也鼓励使用接口,但不是强制的。
捕获异常时希望能尝试从异常状态中恢复,JDBC的SQLException是编译时异常,捕获了之后大部分情况下我们也是无能为力,无法恢复。
Spring的异常体系提供的异常是运行时异常,不要求强制捕获并处理。使用Spring模板时我们甚至可以不用去关心这些异常,手动地捕获也是可以的。
Spring中支持的模板类型如下:
Spring为JDBC提供了3个模板类:
从Spring 3.1开始,JdbcTemplate和NamedParameterJdbcTemplate提供了SimpleJdbcTemplate的功能。SimpleJdbcTemplate被标注为过时,使用JdbcTemplate和NamedParameterJdbcTemplate即可。
Spring 3.1之前的可以使用的是SimpleJdbcTemplate,支持泛型和可变长度参数。JdbcTemplate将会去捕获并抛出可能出现的Spring数据库操作异常,代码中不需要关心。
//这里用的不是占位符,要注意
String sql2 = "select id,tname,tpwd from tadd where tname = :tname";
RowMapper<UserBean> rw = new RowMapper<UserBean>(){
@Override
public UserBean mapRow(ResultSet paramResultSet, int paramInt)
throws SQLException {
UserBean ub = new UserBean();
ub.setId(paramResultSet.getObject("id") + "");
ub.setName(paramResultSet.getObject("tname") + "");
ub.setPassword(paramResultSet.getObject("tpwd") + "");
return ub;
}
};
Map<String, String> map = new HashMap<String, String>();
map.put("tname", "p");
UserBean ub = jdbctemplate.queryForObject(sql2, map, rw); //UserBean ub = jdbctemplate.queryForObject(sql2, map, new BeanPropertyRowMapper(UserBean.class));
System.out.println(ub.getName() + "," + ub.getPassword());
queryForObject只返回一条记录,如果是多条记录应该用query方法。queryForString(String sql,String.class)将返回字符串型的结果。如果没有对应的javabean,可以用queryForMap和queryForList方法。queryForMap返回一条记录,queryForList返回多条记录。
如果希望能够取得插入记录的主键值,可以调用回调函数,也可以在回调函数中对connection做更多的处理。
static Integer id=0; public static int getId(final Person person) {
JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource()); jdbcTemplate.execute(new ConnectionCallback(){
//传递的参数为Connection conn,自己可以在conn内写希望完成的功能
public Object doInConnection(Connection conn) throws SQLException,DataAccessException{
String sql="insert into person(name) values (?)";
PreparedStatement ps=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);//返回所插入数据的主键
for(int i=0;i<10;i++){
ps.setString(1, person.getName());
ps.addBatch(); //批处理,将SQL语句进行打包
}
//ps.executeUpdate();
ps.executeBatch(); //没有这一行是不会插入数据的
ResultSet rs=ps.getGeneratedKeys();
while(rs.next())
id=rs.getInt(1);
return id;
}
});
return id;
}
Hibernate,ibatis等持久层框架可以提供比JDBC更为强大的特性,如下所列:
2.事务的定义及处理
上图是Spring所支持的事务传播行为所支持的规则。
事务的隔离级别如下图所示:
不是所有的数据库都完整的支持上面所列的隔离级别,数据库不支持时即使进行了设置也不会起作用。
tx:method name =”*”将匹配除了save*之外的其他方法。
使用Druid数据库连接池。
先在配置文件引入tx命名空间,再引入TranstactionManager的bean,还需要打开如下开关:
<tx:annotation-driven transaction-manager = "txManager">
在数据库操作bean上加上@Transactional注解开启事务,方法中的多条语句将在一个事务中完成,否则每条语句在一个事务中完成。
@Transactional
public class PersonServiceBean implements PersonService
运行期例外(unckecked exception),事务的操作将被回滚。预知的例外(checked exception),事务的操作将不会回滚。
可以在方法上加上@Transactional注解来改变上述的默认行为
@Transactional(rollbackFor = Exception.class)
public void delete(Integer id) throws Exception{
}
希望运行期例外不进行事务回滚,加上的是
@Transactional(noRollbackFor = RuntimeException.class)
public void delete(Integer id) {
int i = 3/0;
}
如果一些操作不需要开启事务,例如查询操作,可以向下面这样操作:
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public Person getPerson(Integer id)
bean上开启了事务功能,上面所有的方法默认都是要进行事务操作的,默认的不需要加任何注解,等同于下面的形式:
@Transactional(propagation = Propagation.REQUIRED)
public Person savePerson(Person person)
从属性文件中读取数据库连接池参数信息。
Spring整合JDBC及事务处理的更多相关文章
- Spring整合JDBC以及AOP管理事务
本节内容: Spring整合JDBC Spring中的AOP管理事务 一.Spring整合JDBC Spring框架永远是一个容器,Spring整合JDBC其实就是Spring提供了一个对象,这个对象 ...
- Spring整合jdbc
首先web.xml文件跟往常一样,加载spring容器和加载org.springframework.web.context.ContextLoaderListener读取applicationCont ...
- JAVAEE——spring03:spring整合JDBC和aop事务
一.spring整合JDBC 1.spring提供了很多模板整合Dao技术 2.spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模 ...
- Spring整合JDBC实现简单的增删改
Spring整合JDBC实现简单的增删改: 1.导入Spring的包和数据库的驱动包: 2.选择一个数据源(dbcp和C3P0) 3.导入数据源的包(这里我们使用dbcp) <span styl ...
- Spring知识点总结(五)Spring整合JDBC
1. 回顾JDBC a. java操作关系型数据的API.导入相关数据库的驱动包后可以通过JDBC提供的接口来操作数据库. b. 实现JDBC的六个步骤 ...
- Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)
1.Spring整合JDBC (1)导包(共12个): c3p0连接池.JDBC驱动(4个) Spring-jdbc.Spring-tx事务(2个) (2)JDBC模板对象(JDBCTemplate) ...
- spring整合jdbc方法一
用了一段时间的spring这,闲来没事做一下spring整合jdbc 目录文件 导入jar包 由于spring的jar包是在myeclipse中自动导入的有些暂时用不到的也没有处理. Emp类 pac ...
- Spring学习5-Spring整合JDBC及其事务处理(注解方式)
一.整合的步骤 1.步骤一:首先要获得DataSource连接池(推荐使用B方式): 要对数据库执行任何的JDBC操作,需要有一个Connection.在Spring中,Connection对象是 ...
- Spring学习笔记(五)—— Spring整合JDBC
一.Spring对JDBC的支持 Spring提供了很多模板整合Dao技术 与JDBC的整合中,Spring中提供了一个可以操作数据库的对象——JdbcTemplate,该对象封装了JDBC技术,与D ...
随机推荐
- jqgrid 分页 (基于ashx)
1:数据库表创建并往中插入200000条数据: 复制代码 CREATE TABLE [dbo].[T_School]( [ID] [int] IDENTITY(1,1) NOT NULL, [Scho ...
- 你必须知道的session与cookie
Session本质 提到Session我们能联想到的就是用户登录功能,而本身我们使用Session的基础是通过url进行访问的,也就是使用http协议进行访问的,而http协议本身是无状态的,那么问题 ...
- PHPStorm+PHPStudy新建第一个PHP项目
img { max-width: 100% } 熟悉了.net的编程,偶尔也来客串一下PHP.前几天闲来无事随便加了一个PHP的开发群,入群之后傻眼了,群里有大小各位程工1600多人,所以决定学习一下 ...
- 用.net中的SqlBulkCopy类批量复制数据 (转载)
在软件开发中,把数据从一个地方复制到另一个地方是一个普遍的应用. 在很多不同的场合都会执行这个操作,包括旧系统到新系统的移植,从不同的数据库备份数据和收集数据. .NET 2.0有一个SqlBulkC ...
- 小白的Python之路 day5 模块XML特点和用法
模块XML的特点和用法 一.简介 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今 ...
- 从零开始学习前端开发 — 18、BFC
一. BFC的概念 BFC--block formating context的缩写,中文译为"块级格式化上下文" 二.如何触发BFC 1.设置float除none以外的值(left ...
- 4种常用扒站工具(webzip、ha_TeleportPro、Offline Explorer、wget)
许多开始做lead,EMU的新手,需要一个英文网站,找人定制费用太贵自己又不会技术的话,可以通过扒站来获得英文站,今天给大家介绍几种扒站工具: 1.HA_TeleportPro: Teleport P ...
- Git学习(2)-使用Git 代码将本地文件提交到 GitHub
上次随笔写到git的安装和运用命令窗口创建本地版本库,这次主要讲一下用git代码将本地文件提交到GitHub上. 前提是有一个GitHub账号. 1.创建一个新的版本库,进入到你本地项目的根目录下(我 ...
- hql(Hibernate Query Language)
1.Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate ...
- 流API--分组和分片
分组和分片 对具有相同特性的值进行分组时一个很常见的任务,我们可以直接使用groupingBy来进行分组. 当分类函数是一个predicate函数时,流会被分成2组列表,一组返回true,一组返回fa ...