日期:2014-05-16  浏览次数:20723 次

【第七章】 对JDBC的支持 之 7.3 关系数据库操作对象化 ——跟我学spring3

7.3.1? 概述

?????? 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用。

Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的、可复用的对象,是所有数据库对象的父类。而SqlOperation继承了RdbmsOperation,代表了数据库SQL操作,如select、update、call等,如图7-4所示。

?

?

图7-4 关系数据库操作对象化支持类

?

数据库操作对象化只要有以下几种类型,所以类型是线程安全及可复用的:

  • 查询:将数据库操作select封装为对象,查询操作的基类是SqlQuery,所有查询都可以使用该类表示,Spring JDBC还提供了一些更容易使用的MappingSqlQueryWithParameters和MappingSqlQuery用于将结果集映射为Java对象,查询对象类还提供了两个扩展UpdatableSqlQuery和SqlFunction;
  • 更新:即增删改操作,将数据库操作insert 、update、delete封装为对象,增删改基类是SqlUpdate,当然还提供了BatchSqlUpdate用于批处理;
  • 存储过程及函数:将存储过程及函数调用封装为对象,基类是SqlCall类,提供了StoredProcedure实现。

?

7.3.2? 查询

1)SqlQuery需要覆盖如下方法来定义一个RowMapper,其中parameters参数表示命名参数或占位符参数值列表,而context是由用户传入的上下文数据。

?

java代码:
RowMapper<T> newRowMapper(Object[] parameters, Map context)

?

?????? SqlQuery提供两类方法:

  • execute及executeByNamedParam方法:用于查询多行数据,其中executeByNamedParam用于支持命名参数绑定参数;
  • findObject及findObjectByNamedParam方法:用于查询单行数据,其中findObjectByNamedParam用于支持命名参数绑定。

?

演示一下SqlQuery如何使用:

?

java代码:
@Test
public void testSqlQuery() {
    SqlQuery query = new UserModelSqlQuery(jdbcTemplate);
    List<UserModel> result = query.execute("name5");
    Assert.assertEquals(0, result.size());
}

?

从测试代码可以SqlQuery使用非常简单,创建SqlQuery实现对象,然后调用相应的方法即可,接下来看一下SqlQuery实现:

?

java代码:
package cn.javass.spring.chapter7;
//省略import
public class UserModelSqlQuery extends SqlQuery<UserModel> {
    public UserModelSqlQuery(JdbcTemplate jdbcTemplate) {
        //super.setDataSource(jdbcTemplate.getDataSource());
        super.setJdbcTemplate(jdbcTemplate);
        super.setSql("select * from test where name=?");
        super.declareParameter(new SqlParameter(Types.VARCHAR));
        compile();
    }
    @Override
    protected RowMapper<UserModel> newRowMapper(Object[] parameters, Map context) {
        return new UserRowMapper();
    }
}
 

?

从测试代码可以看出,具体步骤如下:

一、setJdbcTemplate/ setDataSource:首先设置数据源或JdbcTemplate;

二、setSql("select * from test where name=?"):定义sql语句,所以定义的sql语句都将被编译为PreparedStatement;

三、declareParameter(new SqlParameter(Types.VARCHAR)):对PreparedStatement参数描述,使用SqlParameter来描述参数类型,支持命名参数、占位符描述;

对于命名参数可以使用如new SqlParameter("name", Types.VARCHAR)描述;注意占位符参数描述必须按占位符参数列表的顺序进行描述;

四、编译:可选,当执行相应查询方法时会自动编译,用于将sql编译为PreparedStatement,对于编译的SqlQuery不能再对参数进行描述了。

五、以上步骤是不可变的,必须按顺序执行。