Skip to content

Commit

Permalink
Merge pull request #1598 from hanjieliao/master
Browse files Browse the repository at this point in the history
修复SqlTemplate将字段更新为NULL的时候出现的空指针BUG
  • Loading branch information
wendal authored May 19, 2022
2 parents ea9ef64 ae47328 commit a0c4529
Showing 1 changed file with 52 additions and 44 deletions.
96 changes: 52 additions & 44 deletions src/org/nutz/dao/impl/sql/SqlTemplate.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 22,7 @@

/**
* 仿照Spring JdbcTemplate实现nutz的SqlTemplate,方便sql的调用
*
*
* @author hzl7652([email protected])
*/
public class SqlTemplate {
Expand All @@ -45,12 45,12 @@ public Dao dao() {

/**
* 执行一个SQL更新操作(如插入,更新或删除语句)。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
*
*
* @return SQL 语句所影响的行数
*/
public int update(String sql, Map<String, Object> params) {
Expand All @@ -59,14 59,14 @@ public int update(String sql, Map<String, Object> params) {

/**
* 执行一个SQL更新操作(如插入,更新或删除语句)。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
* 变量map,无参数时,可为null
* @param params
* 参数map,无参数时,可为null
*
*
* @return SQL 语句所影响的行数
*/
public int update(String sql, Map<String, Object> vars, Map<String, Object> params) {
Expand All @@ -77,12 77,12 @@ public int update(String sql, Map<String, Object> vars, Map<String, Object> para

/**
* 执行SQL批量更新操作(如插入,更新或删除语句)。
*
*
* @param sql
* 包含变量占位符的SQL
* @param batchValues
* 批量更新参数集合
*
*
* @return SQL 语句所影响的行数
*/
public int batchUpdate(String sql, List<Map<String, Object>> batchValues) {
Expand All @@ -91,14 91,14 @@ public int batchUpdate(String sql, List<Map<String, Object>> batchValues) {

/**
* 执行SQL批量更新操作(如插入,更新或删除语句)。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
* 变量map,无参数时,可为null
* @param batchValues
* 批量更新参数集合
*
*
* @return SQL 语句所影响的行数
*/
public int batchUpdate(String sql,
Expand All @@ -124,12 124,12 @@ public int batchUpdate(String sql,
/**
* 执行一个SQL查询操作,结果为一个int形数值。
* <p>
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
*
*
* @return int数值,当查询为null时返回0
*/
public int queryForInt(String sql, Map<String, Object> params) {
Expand All @@ -138,14 138,14 @@ public int queryForInt(String sql, Map<String, Object> params) {

/**
* 执行一个SQL查询操作,结果为一个int形数值。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
* 变量map,无参数时,可为null
* @param params
* 参数map,无参数时,可为null
*
*
* @return int数值,当查询为null时返回0
*/
public int queryForInt(String sql, Map<String, Object> vars, Map<String, Object> params) {
Expand All @@ -157,12 157,12 @@ public int queryForInt(String sql, Map<String, Object> vars, Map<String, Object>

/**
* 执行一个SQL查询操作,结果为一个long形数值。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
*
*
* @return long数值,当查询为null时返回0
*/
public long queryForLong(String sql, Map<String, Object> params) {
Expand All @@ -171,14 171,14 @@ public long queryForLong(String sql, Map<String, Object> params) {

/**
* 执行一个SQL查询操作,结果为一个long形数值。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
* 变量map,无参数时,可为null
* @param params
* 参数map,无参数时,可为null
*
*
* @return long数值,当查询为null时返回0
*/
public long queryForLong(String sql, Map<String, Object> vars, Map<String, Object> params) {
Expand All @@ -191,14 191,14 @@ public long queryForLong(String sql, Map<String, Object> vars, Map<String, Objec

/**
* 执行一个SQL查询操作,结果为给定对象类型的对象,适用于明确SQL查询结果的类型。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map 无参数时,可为null
* @param classOfT
* 对象类型,SQL查询结果所对应的类型,如Date.class等
*
*
* @return 对象,无查询结果时返回null
*/
public <T> T queryForObject(String sql, Map<String, Object> params, Class<T> classOfT) {
Expand All @@ -207,7 207,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Class<T> cla

/**
* 执行一个SQL查询操作,结果为给定对象类型的对象,适用于明确SQL查询结果的类型。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
Expand All @@ -216,7 216,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Class<T> cla
* 参数map,无参数时,可为null
* @param classOfT
* 对象类型,SQL查询结果所对应的类型,如Date.class等
*
*
* @return 对象,无查询结果时返回null
*/
public <T> T queryForObject(String sql,
Expand All @@ -238,14 238,14 @@ public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException

/**
* 执行一个SQL查询操作,结果为给定实体的对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
* @param entity
* 实体类型,无参数时,可为null
*
*
* @return 对象,无查询结果时返回null
*/
public <T> T queryForObject(String sql, Map<String, Object> params, Entity<T> entity) {
Expand All @@ -254,7 254,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Entity<T> en

/**
* 执行一个SQL查询操作,结果为给定实体的对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
Expand All @@ -263,7 263,7 @@ public <T> T queryForObject(String sql, Map<String, Object> params, Entity<T> en
* 参数map,无参数时,可为null
* @param entity
* 实体类型
*
*
* @return 对象,无查询结果时返回null
*/
public <T> T queryForObject(String sql,
Expand All @@ -281,12 281,12 @@ public <T> T queryForObject(String sql,

/**
* 执行一个SQL查询操作,结果为Record的对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
*
*
* @return Record对象,无查询结果时返回null
*/
public Record queryForRecord(String sql, Map<String, Object> params) {
Expand All @@ -295,7 295,7 @@ public Record queryForRecord(String sql, Map<String, Object> params) {

/**
* 执行一个SQL查询操作,结果为Record的对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
Expand All @@ -315,14 315,14 @@ public Record queryForRecord(String sql, Map<String, Object> vars, Map<String, O

/**
* 执行一个SQL查询操作,结果为一组对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
* @param entity
* 对象类型,无参数时,可为null
*
*
* @return 对象列表,无查询结果时返回长度为0的List对象
*/
public <T> List<T> query(String sql, Map<String, Object> params, Entity<T> entity) {
Expand All @@ -331,14 331,14 @@ public <T> List<T> query(String sql, Map<String, Object> params, Entity<T> entit

/**
* 执行一个SQL查询操作,结果为一组对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
* @param classOfT
* 对象类类
*
*
* @return 对象列表,无查询结果时返回长度为0的List对象
*/
public <T> List<T> query(String sql,
Expand All @@ -349,7 349,7 @@ public <T> List<T> query(String sql,

/**
* 执行一个SQL查询操作,结果为一组对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
Expand All @@ -358,7 358,7 @@ public <T> List<T> query(String sql,
* 参数map,无参数时,可为null
* @param entity
* 对象类型
*
*
* @return 对象列表,无查询结果时返回长度为0的List对象
*/
public <T> List<T> query(String sql,
Expand All @@ -376,7 376,7 @@ public <T> List<T> query(String sql,

/**
* 执行一个SQL查询操作,结果为一组对象。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
Expand All @@ -385,7 385,7 @@ public <T> List<T> query(String sql,
* 参数map,无参数时,可为null
* @param classOfT
* 对象类型
*
*
* @return 对象列表,无查询结果时返回长度为0的List对象
*/
public <T> List<T> queryForList(String sql,
Expand All @@ -412,14 412,14 @@ public Object invoke(Connection conn, ResultSet rs, Sql sql) throws SQLException

/**
* 执行一个SQL查询操作,结果为Record对象列表。
*
*
* @param sql
* 包含变量占位符的SQL
* @param vars
* 变量map,无参数时,可为null
* @param params
* 参数map,无参数时,可为null
*
*
* @return Record列表,无查询结果时返回长度为0的List对象
*/
public List<Record> queryRecords(String sql,
Expand Down Expand Up @@ -452,12 452,12 @@ private void execute(Sql sqlObj, Map<String, Object> vars, Map<String, Object> p
* 创建Sql对象。
* <p>
* 在这里处理Array Collection类型参数,方便SQL IN 表达式的设置
*
*
* @param sql
* 包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
*
*
* @return Sql对象
*/
private Sql createSqlObj(String sql, Map<String, Object> params) {
Expand All @@ -472,12 472,12 @@ private Sql createSqlObj(String sql, Map<String, Object> params) {

/**
* 将Array Collection类型参数对应的sql占位符进行处理
*
*
* @param originSql
* 原包含变量占位符的SQL
* @param params
* 参数map,无参数时,可为null
*
*
* @return 包含处理IN表达式的sql
*/
private String sqlProcess(String originSql, Map<String, Object> params) {
Expand All @@ -490,6 490,10 @@ private String sqlProcess(String originSql, Map<String, Object> params) {
String paramName = entry.getKey();
Object paramObj = entry.getValue();

if(paramObj == null){
continue;
}

if (paramObj.getClass().isArray()) {
String inSqlExp = inSqlProcess(paramName, paramObj);
newSql = newSql.replaceAll("@" paramName, inSqlExp);
Expand All @@ -509,10 513,10 @@ private String sqlProcess(String originSql, Map<String, Object> params) {

/**
* sql参数处理,在这里处理Array Collection类型参数,方便SQL IN 表达式的设置
*
*
* @param params
* 参数map,无参数时,可为null
*
*
* @return 包含处理IN表达式的sql
*/
private Map<String, Object> paramProcess(Map<String, Object> params) {
Expand All @@ -523,6 527,10 @@ private Map<String, Object> paramProcess(Map<String, Object> params) {
String paramName = entry.getKey();
Object paramObj = entry.getValue();

if(paramObj == null){
continue;
}

if (paramObj.getClass().isArray()) {
inParamProcess(paramName, paramObj, newParams);
newParams.remove(paramName);
Expand Down

0 comments on commit a0c4529

Please sign in to comment.