Spring中的面向对象查询

Spring JDBC的操作还是使用了 sql语句,如果对sql不是非常熟悉的程序员可能在运用的过程中还有些麻烦,为此Spring提供了org.springframework.jdbc.object包来设计完全面向对象查询,只要封装一个面向对象的查询类,丝毫不用写任何的sql语句就可以完成JdbcTemplate所有的数据库操作功能。
   
public   class  User {
   
private Long id;
   
private String userName;
   
private String passWord;
   
//set/get方法
}

1 org.springframework.jdbc.object.SqlQuery
SqlQuery 是主查询类,他提供了强大的查询功能,不过他的查询返回值将会放到一个RowMapper中进行处理,所以在使用SqlQuery的时候要定义一个自己的RowMapper,然后给返回值放到自定义的RowMapper中,这样就完成了查询工作,示例如下:
首先定义一个UserRowMapper,该类实现RowMapper接口,代码如下:
public   class  UserRowMapper  implements  RowMapper  {
    
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user
=new User();
        user.setId(
new Long(rs.getLong("id")));
        user.setUserName(rs.getString(
"username"));
        user.setPassWord(rs.getString(
"password"));
        
return user;
    }

}
 
UserRowMapper 类中只有一个 mapRow 方法,该方法就是将返回结果记录集 ResultSet 的值封装到 User 类中;
定义一个 UserSqlQuery 类,该类继承 SqlQuery ,代码如下:
public   class  UserSqlQuery  extends  SqlQuery  {
    
public UserSqlQuery(DataSource dataSource){
        
super(dataSource,"select * from user where id=?");
        
int[] types={Types.LONGVARCHAR};
        setTypes(types);
        compile();
    }

    
protected RowMapper newRowMapper(Object[] args, Map map) {
        UserRowMapper urm
=new UserRowMapper();
        
return urm;
    }

}
 
 
UserSqlQuery 类首先定义了一个构造函数,在构造函数中调用了 SqlQuery 中的
 SqlQuery(DataSource ds, String sql) 完成数据源以及 sql 的注入,在 sql 中仍然用“?”作为占位符, int[] types 数组为占位符设置 sql 字段属性,这里为 LONGVARCHAR ,最后调用 compile() 方法编译,执行 sql 返回值将有 newRowMapper 方法返回,这里我们直接使用了自定义的 UserRowMapper 来记录返回值,完成上述步骤后,就可以在 UserDAO find() 方法中使用这个查询了:
public  User find(Long id)  {
        List list
=userSqlQuery.execute(new Object[]{id});
           
return (User)list.get(0);
    }
 
SqlQuery 提供了很多的 execute 方法来执行查询,详情可以参考 Spring API 文档,这里使用了 execute 传递一个 id 参数,因为返回值是一个数组而且数组中只有一个 User 对象,所以直接使用了 (User)list.get(0)
2 org.springframework.jdbc.object.MappingSqlQuery
MappingSqlQuery 类是 SqlQuery 类的子类,使用 MappingSqlQuery 查询就不用使用 RowMapper 处理返回值了,直接写一个 UserMappingSqlQuery 类类继承 MappingSqlQuery ,代码如下:
public   class  UserMappingSqlQuery  extends  MappingSqlQuery  {
    
public UserMappingSqlQuery(DataSource dataSource) {
        
super(dataSource, "select * from user where id=?");
        
int[] types={Types.LONGVARCHAR};
        setTypes(types);
        compile();
    }

    
protected Object mapRow(ResultSet rs, int rowNum) throws SQLException {    User user=new User();
        user.setId(
new Long(rs.getLong("id")));
        user.setUserName(rs.getString(
"username"));
        user.setPassWord(rs.getString(
"password"));
        
return user;
    }

}
 
UserMappingSqlQuery 中首先还是使用SqlQuery中的构造函数完成数据源和sql的注入,返回值直接通过mapRow方法来完成,接着就可以这么使用它了:
 UserMappingSqlQuery userMappingSqlQuery = new  UserMappingSqlQuery(dataSource);
userMappingSqlQuery.execute(
new  Object[] {id} );
 
返回值还是一个list,list中就是查询出来的User对象。
3 org.springframework.jdbc.object.SqlUpdate

SqlUpdate类用来表示一个类的更新,当然前面的SqlQueryMappiingSqlQuery同样可以执行更新的sql语句,不过Spring为了适应人们的编程习惯,特意设计了SqlUpdate类来执行更新(update)、记录(insert)等操作,SqlUpdate类的使用更加简单,只要通过构造函数完成数据源和sql注入即可,定义一个自己的UserSqlUpdate,代码如下:
构造方法和上面的SqlQueryMappingSqlQuery一样,这里不过多重复,接着就可以如下来使用了:

public   class  UserSqlUpdate  extends  SqlUpdate  {
    
public UserSqlUpdate(DataSource dataSource) {
        
super(dataSource, "insert into user (username,password) values (?,?)");
        
int[] types = { java.sql.Types.VARCHAR, java.sql.Types.VARCHAR };
        setTypes(types);
        compile();
    }

}


UserSqlUpdate userSqlUpdate = new  UserSqlUpdate(dataSource);
User user
= new  User();
user.setUserName(
" erikchang " );
user.setPassWord(
" 123456 " );
userSqlUpdate.update(
new  Object[] {user.getUserName(),user.getPassWord} );
 
SqlUpdate 实例直接调用 update 方法来完成参数的传递以及 sql 的执行。
4 org.springframework.jdbc.object.SqlFunction
SqlFunction 类是 MappingSqlQuery 的一个子类,他也就是具备了 MappingSqlQuery 的所有功能,不过 SqlFunction 实例的调用使用 run runGeneric 方法来完成,同样可以在 run() runGeneric() 方法中传递一个数组作为 sql 的参数,其中 run() 方法返回 int 类型的,一般用在数量的查询, runGenetic() 方法返回一个对象,使用时首先定义一个 UserSqlFucntion 如下:
public   class  UserSqlFunction  extends  SqlFunction  {
    
public UserSqlFunction(DataSource dataSource) {
        
super(dataSource, "select * from user where id=?");
        
int[] types = { Types.LONGVARCHAR };
        setTypes(types);
        compile();
    }

}
 
接着就可以如下来查询:
UserSqlFunction userSqlFunction = new  UserSqlFunction(dataSource);
(User)userSqlFunction.runGeneric(
new  Object[] {id} );
 
如果在 UserSqlFunction 的构造函数中 sql :select count(*) from user, 在使用的时候就直接使用 userSqlFunction.run();
文章系eirkchang所有,转载注明作者!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值