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