From 54cfa5038c6b3c1093a47a95772cd7e04a7492cb Mon Sep 17 00:00:00 2001 From: MaxKey Date: Mon, 17 Jul 2023 10:53:24 +0800 Subject: [PATCH] PartitionKey --- .../jpa/metadata/FieldColumnMapper.java | 11 +++++ .../mybatis/jpa/metadata/MapperMetadata.java | 29 ++++++++++--- .../mybatis/jpa/provider/DateConverter.java | 2 +- .../mybatis/jpa/provider/DeleteProvider.java | 32 ++++++++++---- .../mybatis/jpa/provider/InsertProvider.java | 8 ++-- .../mybatis/jpa/provider/UpdateProvider.java | 43 +++++++++++++------ 6 files changed, 93 insertions(+), 32 deletions(-) diff --git a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/FieldColumnMapper.java b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/FieldColumnMapper.java index 9cd295a..9c0a69f 100644 --- a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/FieldColumnMapper.java +++ b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/FieldColumnMapper.java @@ -18,6 +18,7 @@ package org.dromara.mybatis.jpa.metadata; import org.dromara.mybatis.jpa.annotations.ColumnDefault; +import org.dromara.mybatis.jpa.annotations.PartitionKey; import jakarta.persistence.Column; import jakarta.persistence.GeneratedValue; @@ -45,6 +46,8 @@ public class FieldColumnMapper { private ColumnDefault columnDefault; + private PartitionKey partitionKey; + public FieldColumnMapper() { } @@ -127,6 +130,14 @@ public class FieldColumnMapper { public void setColumnDefault(ColumnDefault columnDefault) { this.columnDefault = columnDefault; } + + public PartitionKey getPartitionKey() { + return partitionKey; + } + + public void setPartitionKey(PartitionKey partitionKey) { + this.partitionKey = partitionKey; + } @Override public String toString() { diff --git a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/MapperMetadata.java b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/MapperMetadata.java index 4c26951..2fdc423 100644 --- a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/MapperMetadata.java +++ b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/metadata/MapperMetadata.java @@ -29,6 +29,7 @@ import java.util.concurrent.ConcurrentMap; import org.apache.ibatis.jdbc.SQL; import org.dromara.mybatis.jpa.annotations.ColumnDefault; +import org.dromara.mybatis.jpa.annotations.PartitionKey; import org.dromara.mybatis.jpa.entity.JpaEntity; import org.dromara.mybatis.jpa.id.IdentifierGeneratorFactory; import org.slf4j.Logger; @@ -158,6 +159,18 @@ public class MapperMetadata { } return idFieldColumnMapper; } + + public static FieldColumnMapper getPartitionKey(String classSimpleName) { + List listFields = fieldsMap.get(classSimpleName); + FieldColumnMapper partitionKeyColumnMapper = null; + for (FieldColumnMapper column : listFields) { + if (column.getPartitionKey() != null) { + partitionKeyColumnMapper = column; + break; + } + } + return partitionKeyColumnMapper; + } /** * get select table Column from entityClass, data cache in fieldsMap @@ -203,7 +216,7 @@ public class MapperMetadata { return; } - _logger.trace("entityClass " +entityClass); + _logger.trace("entityClass {}" , entityClass); Field[] fields = entityClass.getDeclaredFields(); ListfieldColumnMapperList=new ArrayList(fields.length); @@ -240,19 +253,23 @@ public class MapperMetadata { } if(field.isAnnotationPresent(GeneratedValue.class)) { - GeneratedValue generatedValue=(GeneratedValue) field.getAnnotation(GeneratedValue.class); + GeneratedValue generatedValue=field.getAnnotation(GeneratedValue.class); fieldColumnMapper.setGeneratedValue(generatedValue); fieldColumnMapper.setGenerated(true); } if (field.isAnnotationPresent(Temporal.class)) { - Temporal temporalAnnotation = (Temporal) field.getAnnotation(Temporal.class); + Temporal temporalAnnotation = field.getAnnotation(Temporal.class); fieldColumnMapper.setTemporalAnnotation(temporalAnnotation); } if (field.isAnnotationPresent(ColumnDefault.class)) { - ColumnDefault columnDefault = (ColumnDefault) field.getAnnotation(ColumnDefault.class); + ColumnDefault columnDefault = field.getAnnotation(ColumnDefault.class); fieldColumnMapper.setColumnDefault(columnDefault); } - _logger.trace("FieldColumnMapper : " + fieldColumnMapper); + if (field.isAnnotationPresent(PartitionKey.class)) { + PartitionKey partitionKey = field.getAnnotation(PartitionKey.class); + fieldColumnMapper.setPartitionKey(partitionKey); + } + _logger.trace("FieldColumnMapper : {}" , fieldColumnMapper); fieldColumnMapperList.add(fieldColumnMapper); } @@ -260,7 +277,7 @@ public class MapperMetadata { } fieldsMap.put(entityClass.getSimpleName(), fieldColumnMapperList); - _logger.trace("fieldsMap : " + fieldsMap); + _logger.trace("fieldsMap : {}" , fieldsMap); } diff --git a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DateConverter.java b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DateConverter.java index aa81260..b74364a 100644 --- a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DateConverter.java +++ b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DateConverter.java @@ -24,8 +24,8 @@ public class DateConverter{ public static String convert(Object entity ,FieldColumnMapper fieldColumnMapper,boolean isUpdate) { String dateValue = ""; - Date date = (Date)BeanUtil.get(entity, fieldColumnMapper.getFieldName()); if(fieldColumnMapper.getFieldType().equalsIgnoreCase("Date")) { + Date date = (Date)BeanUtil.get(entity, fieldColumnMapper.getFieldName()); if(date == null) { dateValue = convertDateTime(LocalDateTime.now(),fieldColumnMapper); }else { diff --git a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DeleteProvider.java b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DeleteProvider.java index 5be7bb3..46d1f85 100644 --- a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DeleteProvider.java +++ b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/DeleteProvider.java @@ -45,16 +45,30 @@ public class DeleteProvider { if (MapperMetadata.sqlsMap.containsKey(tableName + SQL_TYPE.REMOVE_SQL)) { return MapperMetadata.sqlsMap.get(tableName + SQL_TYPE.REMOVE_SQL); } - FieldColumnMapper idFieldColumnMapper=MapperMetadata.getIdColumn((entityClass).getSimpleName()); + FieldColumnMapper idFieldColumnMapper = MapperMetadata.getIdColumn((entityClass).getSimpleName()); + FieldColumnMapper partitionKey = MapperMetadata.getPartitionKey((entityClass).getSimpleName()); SQL sql=new SQL() - .DELETE_FROM(tableName) - .WHERE(idFieldColumnMapper.getColumnName() - + " = #{" +idFieldColumnMapper.getFieldName() + ",javaType=string,jdbcType=VARCHAR}"); + .DELETE_FROM(tableName); + if(partitionKey!=null) { + sql.WHERE(""" + %s = #{%s,javaType=string,jdbcType=VARCHAR} + and + %s = #{%s,javaType=string,jdbcType=VARCHAR} + """.formatted( + partitionKey.getColumnName() , + partitionKey.getFieldName(), + idFieldColumnMapper.getColumnName(), + idFieldColumnMapper.getFieldName()) + ); + }else { + sql.WHERE("%s = #{%s,javaType=string,jdbcType=VARCHAR}" + .formatted(idFieldColumnMapper.getColumnName(),idFieldColumnMapper.getFieldName()) ); + } String deleteSql = sql.toString(); MapperMetadata.sqlsMap.put(tableName + SQL_TYPE.REMOVE_SQL,deleteSql); - _logger.trace("Delete SQL \n"+deleteSql); + _logger.trace("Delete SQL \n{}" , deleteSql); return deleteSql; } @@ -68,7 +82,7 @@ public class DeleteProvider { for(String value : idValues) { if(value.trim().length() > 0) { keyValue += ",'" + value + "'"; - _logger.trace("batch delete by id " + value); + _logger.trace("batch delete by id {}" , value); } } //remove ; @@ -81,7 +95,7 @@ public class DeleteProvider { String deleteSql=sql.toString(); MapperMetadata.sqlsMap.put(tableName + SQL_TYPE.BATCHDELETE_SQL,deleteSql); - _logger.trace("Delete SQL \n" + deleteSql); + _logger.trace("Delete SQL \n{}" , deleteSql); return deleteSql; } @@ -95,7 +109,7 @@ public class DeleteProvider { for(String value : idValues) { if(value.trim().length() > 0) { keyValue += ",'" + value + "'"; - _logger.trace("logic delete by id " + value); + _logger.trace("logic delete by id {}" , value); } } //remove ; @@ -109,7 +123,7 @@ public class DeleteProvider { String deleteSql = sql.toString(); MapperMetadata.sqlsMap.put(tableName + SQL_TYPE.LOGICDELETE_SQL,deleteSql); - _logger.trace("logic Delete SQL \n" + deleteSql); + _logger.trace("logic Delete SQL \n{}" , deleteSql); return deleteSql; } diff --git a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/InsertProvider.java b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/InsertProvider.java index cda3b60..73d24a6 100644 --- a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/InsertProvider.java +++ b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/InsertProvider.java @@ -69,7 +69,7 @@ public class InsertProvider { && StringUtils.isBlank(BeanUtil.getValue(entity, fieldColumnMapper.getFieldName())) && !fieldColumnMapper.isGenerated()) { //skip null field value - _logger.trace("skip field value is null "); + _logger.trace("skip field {} value is null ",fieldColumnMapper.getFieldName()); }else { if(fieldColumnMapper.isGenerated() && fieldColumnMapper.getTemporalAnnotation() != null) { sql.VALUES(fieldColumnMapper.getColumnName(),"'" + DateConverter.convert(entity, fieldColumnMapper,false) + "'"); @@ -80,12 +80,12 @@ public class InsertProvider { )) { generatedValue(sql , entity , fieldColumnMapper); }else { - sql.VALUES(fieldColumnMapper.getColumnName(),"#{" + fieldColumnMapper.getFieldName() + "}"); + sql.VALUES(fieldColumnMapper.getColumnName(),"#{%s}".formatted(fieldColumnMapper.getFieldName())); } } } } - _logger.trace("Insert SQL : \n" + sql); + _logger.trace("Insert SQL : \n{}" , sql); return sql.toString(); } @@ -102,7 +102,7 @@ public class InsertProvider { genValue = IdentifierGeneratorFactory.generate(IdStrategy.DEFAULT); } BeanUtil.set(entity, fieldColumnMapper.getFieldName(),genValue); - sql.VALUES(fieldColumnMapper.getColumnName(),"#{" + fieldColumnMapper.getFieldName() + "}"); + sql.VALUES(fieldColumnMapper.getColumnName(),"#{%s}".formatted(fieldColumnMapper.getFieldName())); }else if(generatedValue.strategy()==GenerationType.SEQUENCE){ sql.VALUES(fieldColumnMapper.getColumnName(),generatedValue.generator()+".nextval"); }else if(generatedValue.strategy()==GenerationType.IDENTITY){ diff --git a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/UpdateProvider.java b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/UpdateProvider.java index 584f6ca..b5fc85d 100644 --- a/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/UpdateProvider.java +++ b/mybatis-jpa-extra-core/src/main/java/org/dromara/mybatis/jpa/provider/UpdateProvider.java @@ -48,14 +48,19 @@ public class UpdateProvider { SQL sql = new SQL() .UPDATE(MapperMetadata.getTableName(entity.getClass())); - for (int i = 0; i < listFields.size(); i++) { - FieldColumnMapper fieldColumnMapper = listFields.get(i); + FieldColumnMapper partitionKey = null; + FieldColumnMapper idFieldColumnMapper = null; + for(FieldColumnMapper fieldColumnMapper : listFields) { _logger.trace("Field {} , Type {}", fieldColumnMapper.getFieldName(), fieldColumnMapper.getFieldType()); - if (fieldColumnMapper.isIdColumn()) { + if (fieldColumnMapper.isIdColumn() ) { + idFieldColumnMapper = fieldColumnMapper; + continue; + } + if(fieldColumnMapper.getPartitionKey() != null) { + partitionKey = fieldColumnMapper; continue; } - if( (fieldColumnMapper.getFieldType().equalsIgnoreCase("String") ||fieldColumnMapper.getFieldType().startsWith("byte") @@ -64,22 +69,36 @@ public class UpdateProvider { && BeanUtil.getValue(entity, fieldColumnMapper.getFieldName())== null && !fieldColumnMapper.isGenerated()) { //skip null field value - _logger.trace("skip field value is null "); + _logger.trace("skip field {} value is null ",fieldColumnMapper.getFieldName()); }else { if(fieldColumnMapper.getColumnAnnotation().updatable()) { if(fieldColumnMapper.isGenerated() && fieldColumnMapper.getTemporalAnnotation() != null) { - sql.SET(fieldColumnMapper.getColumnName() + " = '" + DateConverter.convert(entity, fieldColumnMapper,true) + "'"); + sql.SET(" %s = '%s' ".formatted(fieldColumnMapper.getColumnName(),DateConverter.convert(entity, fieldColumnMapper,true))); }else { - sql.SET(fieldColumnMapper.getColumnName() + " = #{" + fieldColumnMapper.getFieldName() + "}"); + sql.SET(" %s = #{%s} ".formatted(fieldColumnMapper.getColumnName(),fieldColumnMapper.getFieldName())); } } } } - - FieldColumnMapper idFieldColumnMapper = MapperMetadata.getIdColumn(entity.getClass().getSimpleName()); - sql.WHERE(idFieldColumnMapper.getColumnName() + " = #{" + idFieldColumnMapper.getFieldName() + "}"); - _logger.trace("Update SQL : \n{}" , sql); - return sql.toString(); + if(idFieldColumnMapper != null) { + if(partitionKey != null) { + sql.WHERE(""" + %s = #{%s} + and %s = #{%s} + """.formatted( + partitionKey.getColumnName(), + partitionKey.getFieldName(), + idFieldColumnMapper.getColumnName(), + idFieldColumnMapper.getFieldName()) + ); + }else { + sql.WHERE("%s = #{%s}" .formatted(idFieldColumnMapper.getColumnName(),idFieldColumnMapper.getFieldName())); + } + _logger.trace("Update SQL : \n{}" , sql); + return sql.toString(); + }else { + return ""; + } } } -- GitLab