1,更新操作对象
首先考虑如何将User插入操作建模为一个操作对象,可以扩展SqlUpdate为更新操作创建UserInsertOperation类
public class UserInsertOperation extends SqlUpdate{
public UserInsertOperation(DataSource dataSource){
this.setDataSource(dataSource);
this.setSql("insert into user values(?,?)");
this.declareParamter(new SqlParamters(Types.VARCHAR));
this.declareParamter(new SqlParamters(Types.VARCHAR));
compile();
}
public void perform(User user){
this.update(new Object[]{user.getUsername,user.getPassword()});
}
}
一旦更新操作对象进行了正确的初始化后,就可以调用update()方法,并以对象数组形式传入参数,为了更好地进行封装,避
免无效的参数,可以提供自定义的perform()方法,以便从User对象中提取参数,然后再IOC容器中声明它的实例
<bean id="UserInsertOperation"
class="com.kang.fei.dao.UserInsertOperation">
<constructor-arg ref="dataSource"/>
</bean>
一下Main类展示了如何用这个操作类插入数据
public class Main{
public static void main(String[] args){
UserInsertOperation operation = new UserInsertOperation(dataSource);
User user = new User("kang","fei");
operation.perform(user);
}
}
2,查询操作对象
对于查询操作对象,可以扩展MappingSqlQuery类,让查询和映射逻辑集中在一个类中,为了更好的进行封装,还应该编写定制的perform()方法,将查询参数打包在一个对象数组中,并强制转换返回类型
public class UserQueryOperation extends MappingSqlQuery{
public UserQueryOperation(DataSource dataSource){
setDataSource(dataSource);
setSql("select *from user where id=?");
declareParamter(new SqlParamter(Types.INT));
complie();
}
protected Object mapRow(ResultSet rs ,int rowNum)throws SQLException{
User user = new User();
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
public User perform(int id){
return (User)findObject(new Object[]{id});
}
}
然后在Spring Ioc容器中为这个操作对象声明一个实例
<bean id="userQueryOperaiton"
class="com.kang.fei.dao.UserQueryOperation">
<constructor-arg ref="dataSource"/>
</bean>
在Main类中,可以用该操作对象按照车牌号来查询车辆
public class Main{
public static void main(String[] args){
UserQueryOperation operation = (UserQueryOperation)context.getBean("userQueryOperation");
User user = operation.perform(2);
System.out.println("username: "+user.getUsername());
System.out.println("password: "+user.getPassword());
}
}
3,函数操作对象
SqlFunction操作对象类型用于查询单个值,例如User统计操作就可以通过SqlFunction进行建模,run()方法返回的结果类型为整形,如果想返回其他类型就必须调用runGeneric()方法.
public class UserCountOperation extends SqlFunction{
public UserCountOperation(DataSource dataSource){
setDataSource(dataSource);
setSql("select count(*) from user");
complie();
}
public int perform(){
return run();
}
}
然后再spring Ioc容器中为这个操作对象声明一个实例
<bean id="userCountOperaiton"
class="com.kang.fei.dao.UserCountOperation">
<constructor-arg ref="dataSource"/>
</bean>
以下Main代码测试
public class Main{
public static void main(String[] args){
UserCountOperation operation= (UserCountOperation)context.getBean("userCountOPeration");
int count = operation.perform();
System.out.println("count : "+count);
}
}