开发者学堂课程【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()方法,如下:
@O
verride
public
boolean
do
U
pdate(
M
ember
vo)
throws
E
xception
{
return
super.update
S
upport(
vo) ;
}
这是最终的代码调用形式,本处实现子类的最终调用形式,一定要通过一个办法解决所有问题。
二、具体操作内容
找到 Abstract,跟上 AbstractDAO,再跟上方法public boolean updateSupport(Object vo) {,如下:
/**
* 实现数据的修改处理操作
* @param vo
要修改的数据,此数据之中一定要包含有id
* @
return
*
/
public
boolean
update
S
upport
(Object vo) {
return
false
;
}
1、建立一个 UpdateSupport 的处理类,这个类负责处理更新的一切事物。
· 在创建 SQL 的时候,如果发现某些数据为 null ,那么不应该出现在更新语句之中;
随后新建一个位,SQL 语句应该找到 UPDATE ,表示名称,跟上 SET,再跟上字段=?,中间会有很多这样的结构,最后再跟上 WHERE ,表示主键字段=?,按照以上操作,应在程序中写入S
tring
id
C
olumn
= R
esource.
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 ++
,id
C
olumns) ;
。
加完后,还有buf.
append(field[x].fetName()).append(“=?,”);
来进行操作,再跟上buf.
delete(buf.length() -1
,buf.
length())
;,追加
buf.
append(“WHERE”).append(idColumn).append(“=?,)
,完成操作。之后在 AbstractDAO 中进行验证,找到Update
S
upport
update
S
upport
=
new
Update
S
upport
(vo) ;,
跟上
System.
out.println(u
pdate
S
upport
.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;
p
ublic class
Update
Support {
private Object
vo
; //
操作的V
O
对象
private
M
ap
<Integer,String> columnMap = new HashMap<Integer,String>()
public
U
pdate
S
upport(
O
bject
vo
) {
this.vo
=
vo
;
}
public String createSQL() {
StringBuffer buf = new StringBuffer() ;
S
tring
id
C
olumn
= R
esource.
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(Bean
V
alue
U
tils.
getValue(this.vo, fields[x].getName()
,
fields[x].getT
ype
()
)
!=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 ++
,id
C
olumns) ;
return buf.toString() ; //
保存最终的总的S
QL
语句
}
}
}
2、在 AbstractDAO 类中追加方法:
整个过程中,要清楚所有的开发代码都是一个原型,然后进行功能完善。任何先期开发都有可能出现系统架构设计不合理的情况。