开发者学堂课程【DAO 开发实战业务分析:OR-Mapping 设计改进(数据修改改进)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/399/detail/5179
OR-Mapping 设计改进(数据修改改进)
内容介绍:
一、支持条件
二、具体操作内容
一、支持条件
下面继续按照同样的思路来解决数据更新问题。本次可以解决的更新只适合于根据主键的更新形式。
在本操作之中依然需要以下支持:
· 拼凑 SQL 语句,但是这个时候的拼凑 SQL ,可需要判断是否有数据。
例如传 name、age,其就可以更新,但没有传 age 只传了 name ,则只更新而name 不更新,所以要进行有选择地处理。
· 而后中间依然需要根据 PreparedStatement 的实例化对象从 VO 里面取出数据。
· 在 AbstractDAO 抽象类之中追加一个 updateSupport()方法,如下:
@Override
public boolean doUpdate(Member vo) throws Exception {
return super.updateSupport(vo) ;
}
这是最终的代码调用形式,本处实现子类的最终调用形式,一定要通过一个办法解决所有问题。
二、具体操作内容
找到 Abstract,跟上 AbstractDAO,再跟上方法public boolean updateSupport(Object vo) {,如下:
/**
* 实现数据的修改处理操作
* @param vo 要修改的数据,此数据之中一定要包含有id
* @return
*/
public boolean updateSupport(Object vo) {
return false ;
}
1、建立一个 UpdateSupport 的处理类,这个类负责处理更新的一切事物。
· 在创建 SQL 的时候,如果发现某些数据为 null ,那么不应该出现在更新语句之中;
随后新建一个位,SQL 语句应该找到 UPDATE ,表示名称,跟上 SET,再跟上字段=?,中间会有很多这样的结构,最后再跟上 WHERE ,表示主键字段=?,按照以上操作,应在程序中写入String idColumn = Resource.getId(this.vo.getClass().getName()) ;以及String tableName = this.vo.getClass().getSimpleName() ;,Name 与 SimpleName 二者的区别一个是带包一个是不带包。
再跟上
buf.append(“ UPDATE ”).append(tableName).append(“ SET ”) ;,前后加空格并不影响操作,随后进行操作判断,判断那些值不需要改,
跟上
Field fields [ ] = this.vo.getClass().getDeclaredFields();。
id 是最后一个进行保存。在进行判断时,目的是判断里面的值有没有内容。
取得值后,值不等于 null 表示不出现这个值,所以说值不等于 null,说明字段需要更新,如果字段需要更新,将字段加到
this.columnsMap.put(foot ++,fields[x].getName());。操作完成后,再跟上this. columnsMap.put(foot ++,idColumns) ;。
加完后,还有buf.append(field[x].fetName()).append(“=?,”);来进行操作,再跟上buf.delete(buf.length() -1,buf.length()) ;,追加
buf.append(“WHERE”).append(idColumn).append(“=?,)
,完成操作。之后在 AbstractDAO 中进行验证,找到UpdateSupport updateSupport = new UpdateSupport(vo) ;,
跟上
System.out.println(updateSupport.createSQL());,再回到测试位,将 Update 改为 Edit ,避免 SQL 的关键字问题,但此做的是关于 Update 的测试,则无需改变。
执行程序的测试位,观察 SQL 语句,在不设置年龄、生日的情况下,又换了结果,则说明设置的内容动态地选择是否要进行某个字段的更新处理。
创建 SQL 后,做法与之前相同,用 Support 的处理操作创建 preparedtatement ,然后与之前相同,运用 columnMap 进行操作。跟上 pstmt.executeUpdate() > 0 ;后,动态生成要保证数据存在,执行后测试通过。
完整程序如下:
package.cn.mldn.util.dao.support;
import cn.mldn.util.BeanValueUtils;
import cn.mldn.util.Resources;
import cn.mldn.util.dao.PreparedStatementUtils;
public class UpdateSupport {
private Object vo ; // 操作的VO对象
private Map<Integer,String> columnMap = new HashMap<Integer,String>()
public UpdateSupport(Object vo) {
this.vo = vo ;
}
public String createSQL() {
StringBuffer buf = new StringBuffer() ;
String idColumn = Resource.getId(this.vo.getClass().getName()) ;
String tableName = this.vo.getClass().getSimpleName() ;
buf.append(“UPDATE”).append(tableName).append(“SET”) ;
int foot = 1 ;
Field fields [ ] = this.vo.getClass().getDeclaredFields();
for (int x = 0 ; x < fields.length ; x++){
if (!idColumn.equals(fields[x].getName())) {
// 不是id列的才可以进行判断
if(BeanValueUtils.getValue(this.vo, fields[x].getName(),fields[x].getType()) !=null) ;
this.columnsMap.put(foot ++,fields[x].getName());
buf.append(field[x].fetName()).append(“=?,”);
}
}
}
buf.delete(buf.length() -1,buf.length()) ;
buf.append(“WHERE”).append(idColumn).append(“=?,) ;
this. columnsMap.put(foot ++,idColumns) ;
return buf.toString() ; //保存最终的总的SQL语句
}
}
}
2、在 AbstractDAO 类中追加方法:
整个过程中,要清楚所有的开发代码都是一个原型,然后进行功能完善。任何先期开发都有可能出现系统架构设计不合理的情况。