首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

手写一个orm框架-9

手写一个orm框架-9

生成sql:update

最后一部分了,马上就写完了。写东西真的好累啊~~~

思路

更新的语句也比较好做,sql后面的条件因为在之前已经写了where这一篇,所以这里就只写sqlwhere左边的一部分。现在还是先分析一下 **update **语句:

代码语言:javascript
复制
UPDATE user SET name = ? , id = ? , create_date = ? , age = ? , status = ? WHERE id = ?

可以看到的,大体上就是 UPDATE 表名称 SET 字段名称 = ? 这个样子的。(因为现在不写WHERE右边的

所以具体的思路就是:

  1. 根据映射关系拼装sql。 这里可能有一个可以选择的地方,就是如果某一个属性的值是null,这时要不要把这个属性更新为null
  2. 拿到要更新的值。
  3. 执行sql。

实现

  1. 从映射中拿到所有的属性。 这一步的代码就不放了~~~,和前面写的没有什么区别。
  2. 拿到要更新的属性名称,和值。 这里我们需要三个参数: 1:用来标示更新的时候是否需要忽略值是null的属性。 boolean ignoreNull 2:用来保存需要更新的字段的有序集合。 List updataColumn 3:保存需要更新的字段的值的有序集合。 List values 代码是这样的: List<String> columnNames = new ArrayList<>(entityTableRowMapper.getColumnNames()); Map<String, Field> columnFieldMapper = entityTableRowMapper.getColumnFieldMapper(); List<Object> values = new ArrayList<>(); for (int i = 0; i < columnNames.size(); i++) { String columnName = columnNames.get(i); if (!sqlColumns.contains(columnName)) { continue; } Field field = columnFieldMapper.get(columnName); Object value = EntityUtils.getValue(entity, field); //如果class中的值是null,并且设置忽略null,跳过 if (ignoreNull && value == null) { continue; } updataColumn.add(columnName); values.add(value); }
  3. 根据拿到的数据拼装sql 拿到上面需要的数据后,我们还需要拿到表的名称,这一步直接从映射关系中取就好了。下面的是拼装sql的代码: StringBuilder sql = new StringBuilder(); sql.append("UPDATE ").append(getTableName()).append(StringUtils.SPACE); sql.append("SET "); for (int i = 0; i < updataColumn.size(); i++) { String column = updataColumn.get(i); if (i == 0) { sql.append(StringUtils.append(column, " = ? ")); } else { sql.append(StringUtils.append(", ", column, " = ? ")); } } 这样就好了,大致上是这样的: UPDATE user SET name = ? , id = ? , create_date = ? , age = ? , status = ? 条件的话,用之前写的where生成就好了,where中的值加在集合values的后面就好了。
  4. 执行sql。 太简单了,就不写了~

最后

终于写完了。

还是说一下,因为代码已经在github上了,所以没有把全部的代码写在上面,主要还是以说明思路为主。另外刚开始写博客,有些可能表达的不是很明白。吃了没文化的亏啊~~~

这个项目还有很多可以但是还没有实现的功能,比如一些比较复杂的查询,执行函数之类的。我并没去写它。一是不需要,因为这个东西平时主要是做导出报表的时候用的,二是我自己写项目的话压根就不会用到这些东西,能用java写的我都用java写了。数据库嘛,对我来说就存个数据就好了,数据处理上的事情还是交给java来做好一点。

举报
领券