Spring中的面向对象查询

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

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

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

protectedRowMappernewRowMapper(Object[]args,Mapmap)...{
UserRowMapperurm
=newUserRowMapper();
returnurm;
}

}
UserSqlQuery 类首先定义了一个构造函数,在构造函数中调用了 SqlQuery 中的
SqlQuery(DataSourceds, Stringsql) 完成数据源以及 sql 的注入,在 sql 中仍然用“?”作为占位符, int[] types 数组为占位符设置 sql 字段属性,这里为 LONGVARCHAR ,最后调用 compile() 方法编译,执行 sql 返回值将有 newRowMapper 方法返回,这里我们直接使用了自定义的 UserRowMapper 来记录返回值,完成上述步骤后,就可以在 UserDAO find() 方法中使用这个查询了:
public Userfind(Longid) ... {
Listlist
=userSqlQuery.execute(newObject[]...{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 ... {
publicUserMappingSqlQuery(DataSourcedataSource)...{
super(dataSource,"select*fromuserwhereid=?");
int[]types=...{Types.LONGVARCHAR};
setTypes(types);
compile();
}

protectedObjectmapRow(ResultSetrs,introwNum)throwsSQLException...{Useruser=newUser();
user.setId(
newLong(rs.getLong("id")));
user.setUserName(rs.getString(
"username"));
user.setPassWord(rs.getString(
"password"));
returnuser;
}

}
UserMappingSqlQuery 中首先还是使用SqlQuery中的构造函数完成数据源和sql的注入,返回值直接通过mapRow方法来完成,接着就可以这么使用它了:
UserMappingSqlQueryuserMappingSqlQuery = 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 ... {
publicUserSqlUpdate(DataSourcedataSource)...{
super(dataSource,"insertintouser(username,password)values(?,?)");
int[]types=...{java.sql.Types.VARCHAR,java.sql.Types.VARCHAR};
setTypes(types);
compile();
}

}


UserSqlUpdateuserSqlUpdate = new UserSqlUpdate(dataSource);
Useruser
= 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 ... {
publicUserSqlFunction(DataSourcedataSource)...{
super(dataSource,"select*fromuserwhereid=?");
int[]types=...{Types.LONGVARCHAR};
setTypes(types);
compile();
}

}
接着就可以如下来查询:
UserSqlFunctionuserSqlFunction = new UserSqlFunction(dataSource);
(User)userSqlFunction.runGeneric(
new Object[] ... {id} );
如果在 UserSqlFunction 的构造函数中 sql :select count(*) from user, 在使用的时候就直接使用 userSqlFunction.run();
文章系 eirkchang所有,转载注明作者!

你可能感兴趣的:(spring)