Skip to content

Commit

Permalink
pr#711 修订批量插入,支持设置逻辑删除默认值;扩展支持批量更新;支持PostgreSQL UPSERT语句
Browse files Browse the repository at this point in the history
  • Loading branch information
geodle authored and abel533 committed Oct 16, 2022
1 parent db8d4b8 commit 749deee
Show file tree
Hide file tree
Showing 8 changed files with 235 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ public String insertList(MappedStatement ms) {
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
//获取全部列
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
//获取逻辑删除列
EntityColumn logicDeleteColumn = SqlHelper.getLogicDeleteColumn(entityClass);
//单独增加对 genId 方式的支持
for (EntityColumn column : columnList) {
if (column.getGenIdClass() != null) {
Expand All @@ -72,9 +74,14 @@ public String insertList(MappedStatement ms) {
}
//当某个列有主键策略时,不需要考虑他的属性是否为空,因为如果为空,一定会根据主键策略给他生成一个值
for (EntityColumn column : columnList) {
if (column.isInsertable()) {
sql.append(column.getColumnHolder("record") + ",");
if (!column.isInsertable()) {
continue;
}
if (logicDeleteColumn != null && logicDeleteColumn == column) {
sql.append(SqlHelper.getLogicDeletedValue(column, false)).append(",");
continue;
}
sql.append(column.getColumnHolder("record") + ",");
}
sql.append("</trim>");
sql.append("</foreach>");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package tk.mybatis.mapper.additional.update.batch;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;

import java.util.List;

@RegisterMapper
public interface BatchUpdateMapper<T> {

@UpdateProvider(
type = BatchUpdateProvider.class,
method = "dynamicSQL"
)
void batchUpdate(@Param("list") List<? extends T> recordList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package tk.mybatis.mapper.additional.update.batch;

import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;

public class BatchUpdateProvider extends MapperTemplate {

public BatchUpdateProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}

public String batchUpdate(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
StringBuilder sql = new StringBuilder();
sql.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");
sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
sql.append(SqlHelper.updateSetColumns(entityClass, "record", false, false));
sql.append(SqlHelper.wherePKColumns(entityClass, "record", true));
sql.append("</foreach>");
return sql.toString();
}

public String batchUpdateSelective(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
StringBuilder sql = new StringBuilder();
sql.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");
sql.append(SqlHelper.updateTable(entityClass, tableName(entityClass)));
sql.append(SqlHelper.updateSetColumns(entityClass, "record", true, isNotEmpty()));
sql.append(SqlHelper.wherePKColumns(entityClass, "record", true));
sql.append("</foreach>");
return sql.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package tk.mybatis.mapper.additional.update.batch;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;

import java.util.List;

@RegisterMapper
public interface BatchUpdateSelectiveMapper<T> {

@UpdateProvider(
type = BatchUpdateProvider.class,
method = "dynamicSQL"
)
void batchUpdateSelective(@Param("list") List<? extends T> recordList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package tk.mybatis.mapper.additional.upsert;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.UpdateProvider;
import tk.mybatis.mapper.annotation.RegisterMapper;

import java.util.List;

@RegisterMapper
public interface BatchUpsertMapper<T> {

@UpdateProvider(
type = BatchUpsertProvider.class,
method = "dynamicSQL"
)
void batchUpsert(@Param("list") List<? extends T> recordList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package tk.mybatis.mapper.additional.upsert;

import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;

import java.util.Set;

public class BatchUpsertProvider extends MapperTemplate {

public BatchUpsertProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}

public String batchUpsert(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
StringBuilder sql = new StringBuilder();
sql.append("<foreach collection=\"list\" item=\"record\" separator=\";\" >");
sql.append("INSERT INTO ");
sql.append(tableName(entityClass));
Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);
String primaryKeyColumn = null;
EntityColumn logicDeleteColumn = SqlHelper.getLogicDeleteColumn(entityClass);
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
for (EntityColumn column : columns) {
if (column.isId()) {
primaryKeyColumn = column.getColumn();
}
if (column.isInsertable()) {
sql.append(column.getColumn() + ",");
}
}
sql.append("</trim>");
sql.append(" VALUES ");
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
for (EntityColumn column : columns) {
if (column.getGenIdClass() != null) {
sql.append("<bind name=\"").append(column.getColumn()).append("GenIdBind\" value=\"@tk.mybatis.mapper.genid.GenIdUtil@genId(");
sql.append("record").append(", '").append(column.getProperty()).append("'");
sql.append(", @").append(column.getGenIdClass().getCanonicalName()).append("@class");
sql.append(", '").append(tableName(entityClass)).append("'");
sql.append(", '").append(column.getColumn()).append("')");
sql.append("\"/>");
}
}
for (EntityColumn column : columns) {
if (!column.isInsertable()) {
continue;
}
if (logicDeleteColumn != null && logicDeleteColumn == column) {
sql.append(SqlHelper.getLogicDeletedValue(column, false)).append(",");
continue;
}
sql.append(column.getColumnHolder("record") + ",");
}
sql.append("</trim>");
sql.append(" ON CONFLICT (" + primaryKeyColumn + ") DO UPDATE ");
sql.append(SqlHelper.updateSetColumns(entityClass, "record", true, isNotEmpty()));
sql.append("</foreach>");
return sql.toString();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package tk.mybatis.mapper.additional.upsert;

import org.apache.ibatis.annotations.UpdateProvider;

public interface UpsertMapper<T> {

@UpdateProvider(
type = UpsertProvider.class,
method = "dynamicSQL"
)
void upsert(T record);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package tk.mybatis.mapper.additional.upsert;

import org.apache.ibatis.mapping.MappedStatement;
import tk.mybatis.mapper.entity.EntityColumn;
import tk.mybatis.mapper.mapperhelper.EntityHelper;
import tk.mybatis.mapper.mapperhelper.MapperHelper;
import tk.mybatis.mapper.mapperhelper.MapperTemplate;
import tk.mybatis.mapper.mapperhelper.SqlHelper;

import java.util.Set;

public class UpsertProvider extends MapperTemplate {

public UpsertProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}

public String upsert(MappedStatement ms) {
final Class<?> entityClass = getEntityClass(ms);
StringBuilder sql = new StringBuilder();
sql.append("INSERT INTO ");
sql.append(tableName(entityClass));
Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);
String primaryKeyColumn = null;
EntityColumn logicDeleteColumn = SqlHelper.getLogicDeleteColumn(entityClass);
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
for (EntityColumn column : columns) {
if (column.isId()) {
primaryKeyColumn = column.getColumn();
}
if (column.isInsertable()) {
sql.append(column.getColumn() + ",");
}
}
sql.append("</trim>");
sql.append(" VALUES ");
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
for (EntityColumn column : columns) {
if (column.getGenIdClass() != null) {
sql.append("<bind name=\"").append(column.getColumn()).append("GenIdBind\" value=\"@tk.mybatis.mapper.genid.GenIdUtil@genId(");
sql.append("record").append(", '").append(column.getProperty()).append("'");
sql.append(", @").append(column.getGenIdClass().getCanonicalName()).append("@class");
sql.append(", '").append(tableName(entityClass)).append("'");
sql.append(", '").append(column.getColumn()).append("')");
sql.append("\"/>");
}
}
for (EntityColumn column : columns) {
if (!column.isInsertable()) {
continue;
}
if (logicDeleteColumn != null && logicDeleteColumn == column) {
sql.append(SqlHelper.getLogicDeletedValue(column, false)).append(",");
continue;
}
sql.append(column.getColumnHolder() + ",");
}
sql.append("</trim>");
sql.append(" ON CONFLICT (" + primaryKeyColumn + ") DO UPDATE ");
sql.append(SqlHelper.updateSetColumns(entityClass, null, true, isNotEmpty()));
return sql.toString();
}
}

0 comments on commit 749deee

Please sign in to comment.