OR-Mapping 设计改进(数据修改改进) | 学习笔记

简介: 简介:快速学习 OR-Mapping 设计改进(数据修改改进)

开发者学堂课程【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 类中追加方法:

整个过程中,要清楚所有的开发代码都是一个原型,然后进行功能完善。任何先期开发都有可能出现系统架构设计不合理的情况。

相关文章
|
存储 Docker 容器
docker降级操作,20.10降级到19.03版本
docker降级操作,20.10降级到19.03版本
1326 0
docker降级操作,20.10降级到19.03版本
使用delve调试golang
使用delve调试golang
234 0
|
机器学习/深度学习 XML 分布式计算
大数据的概念
【10月更文挑战第16天】
685 4
|
缓存 网络协议 API
Cloudflare
【7月更文挑战第17天】
1396 9
|
存储 Java 测试技术
一文彻底搞懂阿里开源TransmittableThreadLocal的原理和使用
【10月更文挑战第2天】在Java多线程编程中,线程本地变量(ThreadLocal)是一个非常有用的工具,它能够在每个线程中保存一个独立的变量副本,从而避免多线程环境下的数据竞争问题。然而,在使用线程池等高级多线程技术时,ThreadLocal却面临着一些挑战。为了解决这个问题,阿里巴巴开源了TransmittableThreadLocal(TTL),它扩展了ThreadLocal的功能,使其能够在复杂的多线程环境中正确传递值。本文将深入探讨TTL的原理和使用,帮助读者彻底理解这一技术干货。
2130 0
|
Java 测试技术
Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义
Java多线程实战-从零手搓一个简易线程池(二)线程池实现与拒绝策略接口定义
|
C语言 C++
C++对C的改进和拓展\string类型
C++对C的改进和拓展\string类型
91 1
|
应用服务中间件 nginx
mac install nginx
下载 Nginx 源码包 下载页: http://nginx.org/en/download.html 当前稳定版本: http://nginx.org/download/nginx-1.8.0.tar.
2523 1
|
安全 Java 图形学
Unity3D 导出的apk进行混淆加固、保护与优化原理(防止反编译)
对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿失了,这篇文章就是解决Unity打包出来的包进行代码加固和混淆。
|
数据可视化 搜索推荐 数据挖掘
阿里巴巴进入2022年Gartner《企业低代码平台魔力象限》
近日,国际咨询机构Gartner®正式发布了2022年《企业低代码平台魔力象限》,阿里巴巴成为首次入选该象限的中国厂商之一,被评为利基者(Niche Players)。
1472 1