mybatis-plus公共字段自動填充

github地址https://github.com/heng1234/mybatis_plus

需求: 要求insert或者update填充當前時間

主要是工具類和實體字段屬性加入註解

 @TableField(fill = FieldFill.UPDATE)//修改時填充 

@TableField(fill = FieldFill.INSERT)//插入時填充

 

代碼

 實體:

package com.hlvy.mybatis_plus.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

/**
 * User
 *
 * @author heng
 * @date 2019/4/11
 **/
@Data
/**@auth
 * @TableName 指定數據庫表名
 * extends Model<User> AR模式
 * @EqualsAndHashCode(callSuper = false) 去除AR模式繼承沒調用父類方法警告警告
 */
@TableName("User")
@EqualsAndHashCode(callSuper = false)
public class User  extends Model<User> {

    /**
     * @TableId 指定主鍵列名及主鍵策略方式
     */
    @TableId(value = "id",type = IdType.NONE)
    private Long id;
    /**
     * 姓名
     *@TableField 指定數據庫列名
     */
    @TableField(condition = SqlCondition.LIKE,value = "name")
    private String name;

    /**
     * 年齡
     */
    @TableField(condition = "%s&lt;#{%s}")
    private Integer age;

    /**
     * 郵箱
     */
    @TableField("email")
    private String email;
    /**
     * 直屬上級id
     */
    private Long managerId;
    /**
     * 創建時間
     */
    @TableField(fill = FieldFill.INSERT)//插入時填充
    private Date createdTime;

    /**
     * 修改時間
     */
    @TableField(fill = FieldFill.UPDATE)//修改時填充
    private Date updateTime;

    /**
     * 版本
     */
    private Integer version;
    /**
     * 0、未刪除 1、已刪除
     */
    @TableLogic//邏輯刪除標識
    @TableField(select = false)//查詢的時候不顯示
    private Integer deleted;


    /** 備註  非數據庫字段需要排除
     * 方法一加入transient 不讓該變量序列化 不推薦
     *  方法二加入static 但是lombok不會生成get set方法需要自己手動添加 不推薦
     *  方法三  @TableField(exist = false) 默認是true 改爲false表示不是數據庫字段 推薦
     * */
    @TableField(exist = false)
    private /*static*/  /*transient*/ String remark;
}

工具類:

  

package com.hlvy.mybatis_plus.comporent;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Date;

/**
 * MetaObjectHandler
 * 自動填充工具類
 * @author heng
 * @date 2019/9/14
 **/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER= LoggerFactory.getLogger(MyMetaObjectHandler.class);

    @Override
    public void insertFill(MetaObject metaObject) {
        //是否存在set方法
      boolean bol =   metaObject.hasSetter("createdTime");
      //拿到createdTime的值
        Object createdTime = getFieldValByName("createdTime", metaObject);
        //插入時填充創建時間 fieldName是屬性名
        LOGGER.info("insert 自動填充 "+ LocalDateTime.now());
       // setInsertFieldValByName("createTime", LocalDateTime.now(),metaObject);
        if(bol){//有set方法
        if (createdTime == null) {//值爲null填充
            setFieldValByName("createdTime", new Date(), metaObject);
         }
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        //是否存在set方法
        boolean bol =   metaObject.hasSetter("updateTime");
        //拿到updateTime的值
        Object updateTime = getFieldValByName("updateTime", metaObject);
        //修改時填充當前時間  fieldName是屬性名
        LOGGER.info("update 自動填充 "+ LocalDateTime.now());
        //setUpdateFieldValByName("updateTime", LocalDateTime.now(),metaObject);
       if (bol){//有set方法
        if (updateTime == null) {//值爲null填充
            setFieldValByName("updateTime", new Date(), metaObject);
        }
       }
    }
}

測試類

 

package com.hlvy.mybatis_plus.userTest;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hlvy.mybatis_plus.entity.User;
import com.hlvy.mybatis_plus.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * UserTestNew
 * mp進階 自動填充
 * @author heng
 * @date 2019/4/11
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class FillUserTestNew {

    @Autowired
    private UserMapper userMapper;
    /**
     * 插入一行user      自動填充
     * sql INSERT INTO User ( id, name, age, email, created_time ) VALUES ( 1172866953920393218, '恆果果', 19, '[email protected]', '2019-09-14 13:37:27.29' )
     */
    @Test
    public void insertUser() {
        System.out.println(("----- insertUser method test ------"));
        User user = new User();
        user.setName("恆果果");
        user.setAge(19);
        user.setEmail("[email protected]");
        int row = userMapper.insert(user);
        System.out.println("插入成功"+row+"行");
    }

    /**
     * 修改 自動填充
     * 執行sql UPDATE User SET age=17, update_time='2019-09-14 13:26:30.305' WHERE id=5 AND deleted=0
     */
    @Test
    public void updateOne() {
      User user = new User();
      user.setId(5L);
      user.setAge(17);
      System.out.println(userMapper.updateById(user));
    }




}

pom文件

 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.hlvy</groupId>
    <artifactId>mybatis_plus</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mybatis_plus</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--引入 MyBatis-Plus 之後請不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差異導致的問題-->
       <!-- <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>-->

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.2</version>
        </dependency>
<!--mybatis-plus-generator-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--freemarker-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml 文件

server:
  port: 9091
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mytest?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  #MyBaits 別名包掃描路徑,通過該屬性可以給包中的類註冊別名,註冊後在 Mapper 對應的 XML 文件中可以直接使用類名,而不用使用全限定的類名(即 XML 中調用的時候不用包含包名)。
  type-aliases-package: com.hlvy.mybatis_plus.entity
  #該配置請和 typeAliasesPackage 一起使用,如果配置了該屬性,則僅僅會掃描路徑下以該類作爲父類的域對象
  type-aliases-super-type: java.lang.Object
  #MyBatis Mapper 所對應的 XML 文件位置,如果您在 Mapper 中有自定義方法(XML 中有自定義實現),需要進行該配置,告訴 Mapper 所對應的 XML 文件位置。
  mapper-locations: classpath*:mybatis/*.xml
  #MyBatis 配置文件位置,如果您有單獨的 MyBatis 配置,請將其路徑配置到 configLocation 中。
  #config-location: classpath:mybatis-config.xml
  #啓動時是否檢查 MyBatis XML 文件的存在,默認不檢查
  check-config-location: false
  global-config:
    db-config: #配置邏輯刪除
      logic-delete-value: 1 # 邏輯已刪除值(默認爲 1)
      logic-not-delete-value: 0 # 邏輯未刪除值(默認爲 0)
      #id-type: none #全局策略
      #field-strategy: ignored #所有字段加入crud語句中 一般不這麼設置 默認not_null
      #table-prefix: t_ #表的前綴
      #table-underline: true #表名是否使用下劃線
    #configuration:#不能與config-location同時出現
    #map-underscore-to-camel-case: true
#設置日誌 級別
logging:
  level:
    root: warn
    com.hlvy.mybatis_plus: trace
  pattern:
    console: '%P%m%n'

啓動類

package com.hlvy.mybatis_plus;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.hlvy.mybatis_plus.mapper")
public class MybatisPlusApplication {

    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }

}

userMapper

package com.hlvy.mybatis_plus.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hlvy.mybatis_plus.entity.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * UserMapper
 *
 * @author heng
 **/

public interface UserMapper extends BaseMapper<User> {

   /* @Select("select * from user ${ew.customSqlSegment}")*/
   List<User> selectAll(@Param(Constants.WRAPPER) Wrapper<User> wrapper);


   IPage<User> selectUserPage(Page<User> page,@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章