您好,欢迎来到爱站旅游。
搜索
您的当前位置:首页mybatis-plus-insert

mybatis-plus-insert

来源:爱站旅游
mybatis-plus-insert

⼀. 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(\"sb.append(\" prefix=\\\"\").append(prefix).append(StringPool.QUOTE); }

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(\"\").toString(); }

实例中, 执⾏完后, columnScript 的结果是:

name,age,email,sex,

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 的值为:

#{name},#{age},#{email},#{sex},

拼装起来的 sql :

拿到这个sql之后, 就可以创建 SqlSource 了. 然后放到 MappedStatement ⾥⾯去.

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务