开发者学堂课程【DAO 开发实战业务分析:OR-Mapping 设计改进(数据删除改进)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/399/detail/5180
OR-Mapping 设计改进(数据删除改进)
内容介绍:
一、简要说明
二、具体内容
一、简要说明
对于现在给出的数据的批量删除处理实际上相对于之前的增加和修改操作要容易许多,因为在整个删除的处理里面就是根据一个指定的 ID,而后使用一个IN操作符进行操作处理而已。
对于删除操作来说,主键跟上的类型有两种。不同的表只要知道表名称与主键名称就可以进行删除。
二、具体内容
1、对于子类(MemberDAOImpl 子类),只需要在方法内部调用一个处理操作即可,如下:
@Override
public boolean doRemoveBatch(Set<String> ids) throws Exception {
return super.removeSupport(ids,Member.class) ;
}
2、随后的重点就需要放在 AbstractDAO 父类里面,如下:
public <T> boolean removeSupport(Set<?> ids,Class<T> cls)
{
System.out.println(ids.toArray()[0].getClass().getName());
return false ;
}
设置问号,只需要修改,不需要取出,但是是Set集合,Set集合与List集合的最大区别是支不支持取数据,所以取出第0个测试能输出的内容。执行后结果为String类型。
3、定义一个 RemoveSupport 的处理类,这个类需要进行创建 SQL 语句的操作控制,最好通过 PreparedStatement 的动态设计完成。
在进行操作前要传入取出 idType。返回后拼凑语句,DELETE FROM 表名称,WHER 跟上主键列再跟上(),括号里面分为两种值,分别为字符串或数字。
如下:
public <T> boolean removeSupport(Set<?> ids,Class<T> cls){
RemoveSupport support = new RemoveSupport() ;
String idType = ids.toArray()[0].getClass().getSimpleName() ;
System.out.println(support.createSQL(type,ids,cls));
return false ; //可知道id类型
}
然后找到 RemoveSupport,如下:
package cn.mldn.util.dao.support;
import java.util.Set;
public class RemoveSupport { //加入泛型保持一致,但过于麻烦,所以保持原型
private Map<Integer,Object> valueMap = new HashMap<Integer, Object>() ;
/**
* 为删除语句之中的PreparedStatement对象设置内容
* @param pstmt
* @param type
*/
public void setPreparedStatement(PreparedStatement pstmt,String type) throws Exception {
for(int x = 1;x <= this,valueMap.size() ; x ++) {
if (“String“.equals(type)) {
pstmt.setString(x,this.valueMap.get(x).toString());
} else if (“Integer“.equals(type)) { pstmt.setInt(x,Intger.parseInt(this.valueMap.get(x).toString()));
}
}
}
/**
* 创建要删除的SQL语句
* @param type ID的数据类型
* @param ids 所有的ID数据
* @param cls VO类型
* @return
*/
public <T> String createSQL(Set<?> ids,Class<T> cls) { //要接收操作id的所有值,因为需要id设置内容。
StringBuffer buf = new StringBuffer() ;
String tableName = cls.getSimpleName() ;
String idColumn = Resource.getId(cls.getName()) ;
buf.append(“DELETE FROM”).append(tableName).append(“WHERE”).append(idColumn).append(“(“) ;
Iterator<?> iter = ids. iterator() ;
int foot = 1 ;
while (iter.hasNext()) {
buf.append(“?,”) ;
this.valueMap.put(foot ++,iter.next()) ;
}
buf.delete(buf.length() - 1, buf.length()) ;
buf. append(“(“) ;
return buf.toString() ;
}
}
创建 PreparedStatement 时需要用到 Type 。进行执行后仍要进行创建来完善程序,
如下:
public <T> boolean removeSupport(Set<?> ids,Class<T> cls)
{
RemoveSupport support = new RemoveSupport() ;
String idtype = ids toArray()[0].getClass().getSimpleName();
this.pstmt= this.conn.preparedStatement(support.createSQL(ids,cls)) ;
support.setPreparedStatement(this.pstmt.idType);
return this.pstmt,executeUpdate() == ids.size();
}
回到之前的测试业务位上,执行后操作成功。
对于实际开发之中删除的处理操作流程几乎是固定的。
4、调用操作:
public <T> String createSQL(Set<?> ids,Class<T> cls) {
StringBuffer buf = new StringBuffer() ;
String tableName = cls.getSimpleName() ;
String idColumn = Resource.getId(cls.getName()) ;
buf.append(“DELETE FROM”).append(tableName).append(“WHERE”).append(idColumn).append(“(“) ;
Iterator<?> iter = ids. iterator() ;
int foot = 1 ;
while (iter.hasNext()) {
buf.append(“?,”) ;
this.valueMap.put(foot ++,iter.next()) ;
}
buf.delete(buf.length() - 1, buf.length()) ;
buf. append(“(“) ;
return buf.toString() ;
}
}
唯一要处理的部分只有主键类型:
Integer、String。