⼀. insert
⾸先看⼀下 insert.java 的代码:
/** *
* 根据 ID 删除 *
** @author hubin
* @since 2018-04-06 */
public class Insert extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) { KeyGenerator keyGenerator = new NoKeyGenerator(); SqlMethod sqlMethod = SqlMethod.INSERT_ONE;
String columnScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlColumn(),
StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET, null, StringPool.COMMA); String valuesScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlProperty(),
StringPool.LEFT_BRACKET, StringPool.RIGHT_BRACKET, null, StringPool.COMMA); String keyProperty = null; String keyColumn = null;
// 表包含主键处理逻辑,如果不包含主键当普通字段处理 if (StringUtils.isNotEmpty(tableInfo.getKeyProperty())) { if (tableInfo.getIdType() == IdType.AUTO) { /** ⾃增主键 */
keyGenerator = new Jdbc3KeyGenerator(); keyProperty = tableInfo.getKeyProperty(); keyColumn = tableInfo.getKeyColumn(); } else {
if (null != tableInfo.getKeySequence()) {
keyGenerator = TableInfoHelper.genKeyGenerator(tableInfo, builderAssistant, sqlMethod.getMethod(), languageDriver); keyProperty = tableInfo.getKeyProperty(); keyColumn = tableInfo.getKeyColumn(); } } }
String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource, keyGenerator, keyProperty, keyColumn); }}
可以看到 insert 继承了 AbstractMethod 类.
1. ableInfo.getAllInsertSqlColumn()
/**
* 获取 inset 时候字段 sql 脚本⽚段 * insert into table (字段) values (值) * 位于 \"字段\" 部位 *
* @return sql 脚本⽚段 */
public String getAllInsertSqlColumn() {
return getKeyInsertSqlColumn() + fieldList.stream().map(TableFieldInfo::getInsertSqlColumn) .collect(joining(StringPool.NEWLINE)); }
getInsertSqlColumn() ⽅法, 拿列名:
/**
* 获取 inset 时候字段 sql 脚本⽚段 * insert into table (字段) values (值) * 位于 \"字段\" 部位 *
* @return sql 脚本⽚段 */
public String getInsertSqlColumn() {
String sqlScript = column + StringPool.COMMA;
if (fieldFill == FieldFill.INSERT || fieldFill == FieldFill.INSERT_UPDATE) { return sqlScript; }
return convertIf(sqlScript, property); }
getKeyInsertSqlColumn()就是根据配置看是否要拿 id , 进⼊sql列的拼装: /**
* 获取 inset 时候主键 sql 脚本⽚段 * insert into table (字段) values (值) * 位于 \"字段\" 部位 *
* @return sql 脚本⽚段 */
public String getKeyInsertSqlColumn() { if (StringUtils.isNotEmpty(keyColumn)) { if (idType == IdType.AUTO) { return StringPool.EMPTY; }
return keyColumn + StringPool.COMMA + StringPool.NEWLINE; }
return StringPool.EMPTY;}
如果 id 配置了 ⾃动⽣成, 则在⽣成 sql 的列的时候, id不参与. 也就是说, ⽣成的语句是 insert name, age values(#{name}, #{age})
2. SqlScriptUtils.convertTrim()
/** *
* 获取 带 trim 标签的脚本 *
** @param sqlScript sql 脚本⽚段 * @param prefix 以...开头 * @param suffix 以...结尾
* @param prefixOverrides ⼲掉最前⼀个... * @param suffixOverrides ⼲掉最后⼀个... * @return trim 脚本 */
public static String convertTrim(final String sqlScript, final String prefix, final String suffix, final String prefixOverrides, final String suffixOverrides) { StringBuilder sb = new StringBuilder(\" if (StringUtils.isNotEmpty(suffix)) { sb.append(\" suffix=\\\"\").append(suffix).append(StringPool.QUOTE); } if (StringUtils.isNotEmpty(prefixOverrides)) { sb.append(\" prefixOverrides=\\\"\").append(prefixOverrides).append(StringPool.QUOTE); } if (StringUtils.isNotEmpty(suffixOverrides)) { sb.append(\" suffixOverrides=\\\"\").append(suffixOverrides).append(StringPool.QUOTE); } return sb.append(StringPool.RIGHT_CHEV).append(StringPool.NEWLINE).append(sqlScript) .append(StringPool.NEWLINE).append(\"
实例中, 执⾏完后, columnScript 的结果是:
3. tableInfo.getAllInsertSqlProperty()
/**
* 获取所有 inset 时候插⼊值 sql 脚本⽚段 * insert into table (字段) values (值) * 位于 \"值\" 部位 *
* @return sql 脚本⽚段 */
public String getAllInsertSqlProperty() {
return getKeyInsertSqlProperty() + fieldList.stream().map(TableFieldInfo::getInsertSqlProperty)
.collect(joining(StringPool.NEWLINE));}
/**
* 获取 inset 时候插⼊值 sql 脚本⽚段 * insert into table (字段) values (值) * 位于 \"值\" 部位 *
* @return sql 脚本⽚段 */
public String getInsertSqlProperty() {
String sqlScript = SqlScriptUtils.safeParam(el) + StringPool.COMMA; if (fieldFill == FieldFill.INSERT || fieldFill == FieldFill.INSERT_UPDATE) { return sqlScript; }
return convertIf(sqlScript, property);}
/** *
* 安全⼊参: #{⼊参} *
** @param param ⼊参 * @return 脚本 */
public static String safeParam(final String param) {
return StringPool.HASH_LEFT_BRACE + param + StringPool.RIGHT_BRACE;}
执⾏完之后, valuesScript 的值为:
拼装起来的 sql :
拿到这个sql之后, 就可以创建 SqlSource 了. 然后放到 MappedStatement ⾥⾯去.
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务