手写一个orm框架-9
生成sql:update
最后一部分了,马上就写完了。写东西真的好累啊~~~
思路
更新的语句也比较好做,sql后面的条件因为在之前已经写了where这一篇,所以这里就只写sql中where左边的一部分。现在还是先分析一下 **update **语句:
UPDATE user SET name = ? , id = ? , create_date = ? , age = ? , status = ? WHERE id = ?
可以看到的,大体上就是 UPDATE 表名称 SET 字段名称 = ? 这个样子的。(因为现在不写WHERE右边的)
所以具体的思路就是:
- 根据映射关系拼装sql。
这里可能有一个可以选择的地方,就是如果某一个属性的值是null,这时要不要把这个属性更新为null。
- 拿到要更新的值。
- 执行sql。
实现
- 从映射中拿到所有的属性。
这一步的代码就不放了~~~,和前面写的没有什么区别。
- 拿到要更新的属性名称,和值。
这里我们需要三个参数:
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); }
- 根据拿到的数据拼装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的后面就好了。
- 执行sql。
太简单了,就不写了~
最后
终于写完了。
还是说一下,因为代码已经在github上了,所以没有把全部的代码写在上面,主要还是以说明思路为主。另外刚开始写博客,有些可能表达的不是很明白。吃了没文化的亏啊~~~
这个项目还有很多可以但是还没有实现的功能,比如一些比较复杂的查询,执行函数之类的。我并没去写它。一是不需要,因为这个东西平时主要是做导出报表的时候用的,二是我自己写项目的话压根就不会用到这些东西,能用java写的我都用java写了。数据库嘛,对我来说就存个数据就好了,数据处理上的事情还是交给java来做好一点。