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及事务处理的更多相关文章

  1. Spring整合JDBC以及AOP管理事务

    本节内容: Spring整合JDBC Spring中的AOP管理事务 一.Spring整合JDBC Spring框架永远是一个容器,Spring整合JDBC其实就是Spring提供了一个对象,这个对象 ...

  2. Spring整合jdbc

    首先web.xml文件跟往常一样,加载spring容器和加载org.springframework.web.context.ContextLoaderListener读取applicationCont ...

  3. JAVAEE——spring03:spring整合JDBC和aop事务

    一.spring整合JDBC 1.spring提供了很多模板整合Dao技术 2.spring中提供了一个可以操作数据库的对象.对象封装了jdbc技术. JDBCTemplate => JDBC模 ...

  4. Spring整合JDBC实现简单的增删改

    Spring整合JDBC实现简单的增删改: 1.导入Spring的包和数据库的驱动包: 2.选择一个数据源(dbcp和C3P0) 3.导入数据源的包(这里我们使用dbcp) <span styl ...

  5. Spring知识点总结(五)Spring整合JDBC

     1. 回顾JDBC        a. java操作关系型数据的API.导入相关数据库的驱动包后可以通过JDBC提供的接口来操作数据库.        b. 实现JDBC的六个步骤          ...

  6. Spring整合JDBC(连接池、JDBC模板、Dao配置到Spring容器、配置文件的优化)

    1.Spring整合JDBC (1)导包(共12个): c3p0连接池.JDBC驱动(4个) Spring-jdbc.Spring-tx事务(2个) (2)JDBC模板对象(JDBCTemplate) ...

  7. spring整合jdbc方法一

    用了一段时间的spring这,闲来没事做一下spring整合jdbc 目录文件 导入jar包 由于spring的jar包是在myeclipse中自动导入的有些暂时用不到的也没有处理. Emp类 pac ...

  8. Spring学习5-Spring整合JDBC及其事务处理(注解方式)

    一.整合的步骤   1.步骤一:首先要获得DataSource连接池(推荐使用B方式): 要对数据库执行任何的JDBC操作,需要有一个Connection.在Spring中,Connection对象是 ...

  9. Spring学习笔记(五)—— Spring整合JDBC

    一.Spring对JDBC的支持 Spring提供了很多模板整合Dao技术 与JDBC的整合中,Spring中提供了一个可以操作数据库的对象——JdbcTemplate,该对象封装了JDBC技术,与D ...

随机推荐

  1. Vjios P1736 铺地毯【暴力,思维】

    铺地毯 描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n张地毯,编号从1到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴 ...

  2. ACM中常见错误对应表

    因为经常写错题,找了个这个看看... 传送门:http://www.cnblogs.com/ZouCharming/p/3868844.html 我太垃圾了... 我出现过的错误: Wrong Ans ...

  3. BZOJ-USACO被虐记

    bzoj上的usaco题目还是很好的(我被虐的很惨. 有必要总结整理一下. 1592: [Usaco2008 Feb]Making the Grade 路面修整 一开始没有想到离散化.然后离散化之后就 ...

  4. 二分查找c++简单模板

    //数组a[]中有n各元素,已经按升序排序,待查找的元素x sort(a,a+n); //升序排序 template<class Type> int BinarySearch(Type a ...

  5. c语言基础学习01

    =============================================================================每一种语言都有其独特的语法规则与语言定义. 指 ...

  6. angularJS 与angujs-sku实现购物车组合查询

    原网址:http://sentsin.com/web/1069.html   demo : https://codepen.io/hzxs1990225/pen/VYyOdW  修复版文件下载:htt ...

  7. js实现深拷贝和浅拷贝

    浅拷贝: 思路----------把父对象的属性,全部拷贝给子对象,实现继承. 问题---------如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,不会开辟新栈,不是 ...

  8. [20160711][VS2012配置OpenCV2.4.9]

    相关说明 OpenCV是一套开源机器视觉库,用于简化机器视觉算法的开发与调试. 移植环境 操作系统:Win7 64位 移植软件:Visual Studio 2012 代码下载: https://sou ...

  9. CMD命令操作MySql数据库详解

    第一:mysql服务的启动和停止 1.  net stop mysql 2.  net start mysql 第二:登录 mysql –u用户名 [–h主机名或者IP地址] –p密码 例如:mysq ...

  10. JavaScript八张思维导图—操作符

    JS基本概念 JS操作符 JS基本语句 JS数组用法 Date用法 JS字符串用法 JS编程风格 JS编程实践 不知不觉做前端已经五年多了,无论是从最初的jQuery还是现在火热的Angular,Vu ...