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)

从属性文件中读取数据库连接池参数信息。

最新文章

  1. A Simple OpenGL Shader Example
  2. 配合 APP 调用 JS 的一次尝试
  3. Mac下安装 PIL
  4. unix automake 使用,快速生成你的Makefile
  5. Android 反编译
  6. iOS 关于objectForKey返回类型是不是mutable
  7. mysql建库DATETIME、DATE 和 TIMESTAMP区别
  8. python求微分方程组的数值解曲线01
  9. java 获取当期时间之前几小时的时间
  10. freemarker该阵列
  11. 【高斯消元】兼 【期望dp】例题
  12. 多对多中间表详解 -- Django从入门到精通系列教程
  13. Linux下普通IO文件操作函数---C语言
  14. IDEA报错Error:Module &#39;shop-common&#39; production: java.lang.IndexOutOfBoundsException
  15. JAVA Socket 编程---Socket 和 ServerSocket
  16. 浅谈常用的几种web攻击方式
  17. linux基础之程序包管理(rpm,yum)
  18. django+uwsgi+nginx+sqlite3部署+screen
  19. CEIL与FLOOR
  20. SQL拼接 html 发送

热门文章

  1. 我的第二个网页制作:p,hn,br标签的使用
  2. c语言sizeof用法(32位机)
  3. ThinkPHP基础知识
  4. win7 64位安装redis 及Redis Desktop Manager使用(转载的)
  5. Spider_Man_5.1 の Mongodb_安装
  6. 评论发布信息可插入QQ表情
  7. mysql 批量更新与批量更新多条记录的不同值实现方法
  8. 查看php的配置文件Php.ini的位置
  9. MySQL事务隔离级别的实现原理
  10. php 类的相互访问