文章思路参考:https://blog.csdn.net/Tanganling/article/details/125259479
一、功能效果
-
封装好service中直接调用save或updateById方法即可新增或修改date类型数据;
-
数据库结构如下:
-
service中直接调用方法即可,无需手写to_date语句
@Override public Integer insertOne(User user) { this.save(user); return 1; }
二、快速使用(2步)
首先保证项目已整合Mybatis Plus 本人用的版本为3.2.0
-
粘贴以下配置类
① 重写Insertpackage com.ryan.project.config; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; import org.apache.ibatis.executor.keygen.Jdbc3KeyGenerator; import org.apache.ibatis.executor.keygen.KeyGenerator; import org.apache.ibatis.executor.keygen.NoKeyGenerator; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlSource; import java.lang.reflect.Field; import java.util.List; import java.util.Objects; public class MyInsert 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.getAllInsertSqlColumnMaybeIf(), "(", ")", (String) null, ","); String valuesScript = SqlScriptUtils.convertTrim(tableInfo.getAllInsertSqlPropertyMaybeIf((String) null), "(", ")", (String) null, ","); String keyProperty = null; String keyColumn = null; List<TableFieldInfo> tableFieldInfoList = tableInfo.getFieldList(); for (TableFieldInfo tableFieldInfo : tableFieldInfoList) { try { Field field = modelClass.getDeclaredField(tableFieldInfo.getProperty()); OracleDate annotation = field.getAnnotation(OracleDate.class); if (Objects.nonNull(annotation)){ valuesScript = valuesScript.replace("#{" + tableFieldInfo.getProperty()+ "}", "to_date('${"+tableFieldInfo.getProperty()+"}','"+annotation.value()+"')"); } } catch (NoSuchFieldException e) { throw new RuntimeException("【获取字段失败】" + modelClass.getName() + "获取字段" + tableFieldInfo.getProperty() + "失败"); } } 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, this.builderAssistant, sqlMethod.getMethod(), this.languageDriver); keyProperty = tableInfo.getKeyProperty(); keyColumn = tableInfo.getKeyColumn(); } } String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript); SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); return this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource, (KeyGenerator) keyGenerator, keyProperty, keyColumn); } }
②重写 UpdateById
package com.ryan.project.config; import com.baomidou.mybatisplus.core.enums.SqlMethod; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlSource; import java.lang.reflect.Field; import java.util.List; import java.util.Objects; public class MyUpdateById extends AbstractMethod { @Override public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { boolean logicDelete = tableInfo.isLogicDelete(); SqlMethod sqlMethod = SqlMethod.UPDATE_BY_ID; String additional = this.optlockVersion() + tableInfo.getLogicDeleteSql(true, false); String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), this.sqlSet(logicDelete, false, tableInfo, false, "et", "et."), tableInfo.getKeyColumn(), "et." + tableInfo.getKeyProperty(), additional); List<TableFieldInfo> tableFieldInfoList = tableInfo.getFieldList(); for (TableFieldInfo tableFieldInfo : tableFieldInfoList) { try { Field field = modelClass.getDeclaredField(tableFieldInfo.getProperty()); OracleDate annotation = field.getAnnotation(OracleDate.class); if (Objects.nonNull(annotation)){ sql = sql.replace("#{et." + tableFieldInfo.getProperty()+ "}", "to_date('${et."+tableFieldInfo.getProperty()+"}','"+annotation.value()+"')"); } } catch (NoSuchFieldException e) { throw new RuntimeException("【获取字段失败】" + modelClass.getName() + "获取字段" + tableFieldInfo.getProperty() + "失败"); } } SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); } }
③编写自定义注解 OracleDate(可自行修改)
package com.ryan.project.config; import java.lang.annotation.*; @Documented @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface OracleDate { String value() default "YYYY-MM-DD HH24:MI:SS"; }
④替换MP原有接口集合
package com.ryan.project.config; import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; import com.baomidou.mybatisplus.core.injector.methods.Insert; import com.baomidou.mybatisplus.core.injector.methods.UpdateById; import org.springframework.stereotype.Component; import java.util.List; @Component public class MySqlInjector extends DefaultSqlInjector { @Override public List<AbstractMethod> getMethodList(Class<?> mapperClass) { List<AbstractMethod> methodList = super.getMethodList(mapperClass); for (int i = 0; i < methodList.size(); i++) { if (methodList.get(i) instanceof Insert) { methodList.set(i, new MyInsert()); } if (methodList.get(i) instanceof UpdateById) { methodList.set(i, new MyUpdateById()); } } return methodList; } }
-
字段上增加注解即可,实例代码如下:
package com.ryan.project.entity.db; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ryan.project.config.OracleDate; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; @TableName("STUDENT") @Data @AllArgsConstructor @NoArgsConstructor @Builder public class User { @TableId(type = IdType.UUID) private String id; private String username; private String password; private Integer age; @OracleDate private String startDate; @OracleDate private String endDate; }