Spring MybatisPlus Core Code

  • Post author:
  • Post category:其他



目录


MybatisPlus


MybatisPlusConfig.java


BaseMetaObjectHandler.java


AutoBaseEntity.java


BaseEntity.java


LongBaseEntity.java


StringBaseEntity.java


Spring Web


SpringWebHolder.java


SpringContextHolder.java


BaseController.java


LongIdBaseController.java


StringIdBaseController.java


MybatisPlus

MybatisPlusConfig.java

package com.aboverock.core.orm.mybatisplus;

import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * The Class MybatisPlusConfig.
 *
 * @author Rock Wang
 */
@Configuration
@EnableTransactionManagement
@MapperScan("com.aboverock.module.**.mapper*")
public class MybatisPlusConfig {

    /**
     * 乐观锁插件.
     *
     * @return the optimistic locker interceptor
     */
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }

    /**
     * 分页插件.
     *
     * @return the pagination interceptor
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }

}

BaseMetaObjectHandler.java

package com.aboverock.core.orm.mybatisplus;

import com.aboverock.autoconfigure.util.JwtUtil;
import com.aboverock.common.enums.DomainDeletedEnum;
import com.aboverock.core.spring.SpringWebHolder;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.ibatis.reflection.MetaObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * The Class BaseMetaObjectHandler.
 *
 * @author Rock Wang
 */
@Component
public class BaseMetaObjectHandler implements MetaObjectHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void insertFill(MetaObject metaObject) {
        Date date = new Date();

        // 设置创建时间
        setFieldValByName("createTime", date, metaObject);
        // 设置创建用户
        HttpServletRequest request = null;
        try {
            request = SpringWebHolder.getRequest();
        } catch (Exception e) {
            logger.warn("Data-Smart:{}", e.getMessage());
        }

        if (request != null) {
            String loginName = JwtUtil.getLoginName();
            if (loginName != null) {
                setFieldValByName("createUser", loginName, metaObject);
            }
        }
        // 设置更新时间
        setFieldValByName("updateTime", date, metaObject);

        // 设置删除状态
        Object deleted = getFieldValByName("deleted", metaObject);
        if (null == deleted) {
            setFieldValByName("deleted", DomainDeletedEnum.NORMAL.getStatus(), metaObject);
        }
        // 设置初始版本
        Object version = getFieldValByName("version", metaObject);
        if (null == version) {
            setFieldValByName("version", 0, metaObject);
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        // 设置更新时间
        setFieldValByName("updateTime", new Date(), metaObject);
        // 设置更新用户
        HttpServletRequest request = null;
        try {
            request = SpringWebHolder.getRequest();
        } catch (Exception e) {
            logger.warn("Data-Smart:{}", e.getMessage());
        }

        if (request != null) {
            String loginName = JwtUtil.getLoginName();
            if (loginName != null) {
                setFieldValByName("updateUser", loginName, metaObject);
            }
        }
    }

}

AutoBaseEntity.java

package com.aboverock.core.orm.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

/**
 * 全局唯一ID(mybatisplus AUTO).
 *
 * @author Rock Wang
 */
public abstract class AutoBaseEntity extends BaseEntity<Long> {

    /** id. */
    @TableId(value = "id", type = IdType.AUTO)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }

}

BaseEntity.java

package com.aboverock.core.orm.domain;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.io.Serializable;
import java.util.Date;

/**
 * The Class BaseEntity.
 *
 * @author Rock Wang
 */
public abstract class BaseEntity<ID extends Serializable> {

    /** 创建时间. */
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private Date createTime;

    /** 创建用户. */
    @TableField(value = "create_user", fill = FieldFill.INSERT)
    private String createUser;

    /** 更新时间. */
    @TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /** 更新用户. */
    @TableField(value = "update_user", fill = FieldFill.UPDATE)
    private String updateUser;

    /** 状态 0:正常,1:删除. */
    @TableLogic
    @TableField(value = "deleted", fill = FieldFill.INSERT)
    @JsonIgnore
    private Integer deleted;

    /** The version. */
    @Version
    @TableField(value = "version", fill = FieldFill.INSERT)
    private Integer version;

    /**
     * Gets the id.
     *
     * @return the id
     */
    public abstract ID getId();

    /**
     * Sets the id.
     *
     * @param id the new id
     */
    public abstract void setId(ID id);

    /**
     * Gets the creates the time.
     *
     * @return the creates the time
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * Sets the creates the time.
     *
     * @param createTime the new creates the time
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * Gets the creates the user.
     *
     * @return the creates the user
     */
    public String getCreateUser() {
        return createUser;
    }

    /**
     * Sets the creates the user.
     *
     * @param createUser the new creates the user
     */
    public void setCreateUser(String createUser) {
        this.createUser = createUser;
    }

    /**
     * Gets the update time.
     *
     * @return the update time
     */
    public Date getUpdateTime() {
        return updateTime;
    }

    /**
     * Sets the update time.
     *
     * @param updateTime the new update time
     */
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    /**
     * Gets the update user.
     *
     * @return the update user
     */
    public String getUpdateUser() {
        return updateUser;
    }

    /**
     * Sets the update user.
     *
     * @param updateUser the new update user
     */
    public void setUpdateUser(String updateUser) {
        this.updateUser = updateUser;
    }

    /**
     * Gets the deleted.
     *
     * @return the deleted
     */
    public Integer getDeleted() {
        return deleted;
    }

    /**
     * Sets the deleted.
     *
     * @param deleted the new deleted
     */
    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }

    /**
     * Gets the version.
     *
     * @return the version
     */
    public Integer getVersion() {
        return version;
    }

    /**
     * Sets the version.
     *
     * @param version the new version
     */
    public void setVersion(Integer version) {
        this.version = version;
    }

    public static class FieldMapping {
        public static final String ID = "id";

        public static final String CREATE_TIME = "create_time";

        public static final String CREATE_USER = "create_user";

        public static final String UPDATE_TIME = "update_time";

        public static final String UPDATE_USER = "update_user";

        public static final String DELETED = "deleted";

        public static final String VERSION = "version";
    }
}

LongBaseEntity.java

package com.aboverock.core.orm.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;

/**
 * 全局唯一ID(mybatisplus ID_WORKER).
 *
 * @author Rock Wang
 */
public abstract class LongBaseEntity extends BaseEntity<Long> {

    /** id. */
    @TableId(value = "id", type = IdType.ID_WORKER)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;

    @Override
    public Long getId() {
        return id;
    }

    @Override
    public void setId(Long id) {
        this.id = id;
    }

}

StringBaseEntity.java

package com.aboverock.core.orm.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;

/**
 * 字符串全局唯一ID(mybatisplus ID_WORKER_STR).
 *
 * @author Rock Wang
 */
public abstract class StringBaseEntity extends BaseEntity<String> {

    /** id. */
    @TableId(value = "id", type = IdType.ID_WORKER_STR)
    private String id;

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void setId(String id) {
        this.id = id;
    }

}

Spring Web

SpringWebHolder.java

/**
 *  
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 */
package com.aboverock.core.spring;

import com.aboverock.common.utils.ClientIpUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.context.request.ServletWebRequest;

/**
 * spring mvc 上下文持有者,类似Struts2的ServletActionContext,.
 *
 * @author Rock Wang
 */
@SuppressWarnings("unchecked")
public abstract class SpringWebHolder {

    /**
     * 获取request attribute.
     *
     * @param <T> the generic type
     * @param name 属性名称
     * @return Object
     */
    public static <T> T getRequestAttribute(String name) {
        return (T) getAttribute(name, RequestAttributes.SCOPE_REQUEST);
    }

    /**
     * 设置request attribute.
     *
     * @param name 属性名称
     * @param value 值
     */
    public static void addRequestAttribute(String name, Object value) {
        addAttribute(name, value, RequestAttributes.SCOPE_REQUEST);
    }

    /**
     * 删除request attribute.
     *
     * @param name 属性名称
     */
    public void removeRequestAttribute(String name) {
        removeAttribute(name, RequestAttributes.SCOPE_REQUEST);
    }

    /**
     * 获取sessiont attribute.
     *
     * @param <T> the generic type
     * @param name 属性名称
     * @return Object
     */
    public static <T> T getSessionAttribute(String name) {
        return (T) getAttribute(name, RequestAttributes.SCOPE_SESSION);
    }

    /**
     * 设置session attribute.
     *
     * @param name 属性名称
     * @param value 值
     */
    public static void addSessionAttribute(String name, Object value) {
        addAttribute(name, value, RequestAttributes.SCOPE_SESSION);
    }

    /**
     * 删除session attribute.
     *
     * @param name 属性名称
     */
    public static void removeSessionAttribute(String name) {
        removeAttribute(name, RequestAttributes.SCOPE_SESSION);
    }

    /**
     * 根据作用域,获取Attribute.
     *
     * @param <T> the generic type
     * @param name attribute名称
     * @param scope 作用域,参考{@link RequestAttributes}
     * @return Object
     */
    public static <T> T getAttribute(String name, int scope) {
        return (T) getServletRequestAttributes().getAttribute(name, scope);
    }

    /**
     * 根据作用域,设置Attribute.
     *
     * @param name attribute名称
     * @param value 值
     * @param scope 作用域,参考{@link RequestAttributes}
     */
    public static void addAttribute(String name, Object value, int scope) {
        getServletRequestAttributes().setAttribute(name, value, scope);
    }

    /**
     * 根据作用域和名称,删除Attribute.
     *
     * @param name attribute名称
     * @param scope 作用域,参考{@link RequestAttributes}
     */
    public static void removeAttribute(String name, int scope) {
        getServletRequestAttributes().removeAttribute(name, scope);
    }

    /**
     * 获取HttpServletRequest.
     *
     * @return {@link HttpServletRequest}
     */
    public static HttpServletRequest getRequest() {
        return getServletRequestAttributes().getRequest();
    }

    /**
     * 获取 http session.
     *
     * @return {@link HttpSession}
     */
    public static HttpSession getSession() {
        return getSession(false);
    }

    /**
     * 获取 http session.
     *
     * @param create true to create a new session for this request if necessary; false to return
     *            null if there's no current session
     * @return {@link HttpSession}
     */
    public static HttpSession getSession(boolean create) {
        return getRequest().getSession(create);
    }

    /**
     * 获取spring mvc的ServletRequestAttributes.
     *
     * @return {@link ServletRequestAttributes}
     */
    public static ServletRequestAttributes getServletRequestAttributes() {
        return (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
    }

    /**
     * 获取web项目中的真实路径.
     *
     * @param path 指定的虚拟路径
     * @return String
     */
    public static String getRealPath(String path) {
        return getRequest().getSession().getServletContext().getRealPath(path);
    }

    /**
     * 获取HttpServletResponse.
     *
     * @return {@link HttpServletResponse}
     */
    public static HttpServletResponse getResponse() {
        return getServletWebRequest().getResponse();
    }

    /**
     * 获取spring mvc的ServletWebRequest.
     *
     * @return {@link ServletWebRequest}
     */
    public static ServletWebRequest getServletWebRequest() {
        return ((ServletWebRequest) RequestContextHolder.getRequestAttributes());
    }

    /**
     * 取得HttpRequest中Parameter的简化方法.
     *
     * @param <T> the generic type
     * @param name the name
     * @return the parameter
     */
    public static <T> T getParameter(String name) {
        return (T) getRequest().getParameter(name);
    }

    /**
     * 取得客户端IP.
     *
     * @return the ip
     */
    public static String getIp() {
        HttpServletRequest request = getRequest();
        return ClientIpUtils.getIpAddr(request);
    }
}

SpringContextHolder.java

package com.aboverock.core.spring;

import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author Rock Wang
 */
@Component
public class SpringContextHolder implements ApplicationContextAware, DisposableBean {
    private static final Logger logger = LoggerFactory.getLogger(SpringContextHolder.class);
    private static ApplicationContext applicationContext = null;

    public SpringContextHolder() {
    }

    public static ApplicationContext getApplicationContext() {
        assertContextInjected();
        return applicationContext;
    }

    public static <T> T getBean(String name, Class<T> clazz) {
        assertContextInjected();
        return applicationContext.getBean(name, clazz);
    }

    public static <T> T getBean(Class<T> requiredType) {
        assertContextInjected();
        return applicationContext.getBean(requiredType);
    }

    public static Object getBean(String name) {
        assertContextInjected();
        return applicationContext.getBean(name);
    }

    public static void clearHolder() {
        logger.debug("清除SpringContextHolder中的ApplicationContext:{}", applicationContext);
        applicationContext = null;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        logger.debug("注入ApplicationContext到SpringContextHolder:{}", applicationContext);
        if (SpringContextHolder.applicationContext != null) {
            logger.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:{}", SpringContextHolder.applicationContext);
        }

        SpringContextHolder.applicationContext = applicationContext;
    }

    @Override
    public void destroy() throws Exception {
        clearHolder();
    }

    private static void assertContextInjected() {
        if (applicationContext == null) {
            logger.warn("applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
        }

    }

    public static String getActiveProfile() {
        return ArrayUtils.isEmpty(applicationContext.getEnvironment().getActiveProfiles()) ? null : applicationContext.getEnvironment().getActiveProfiles()[0];
    }

    public static boolean isProduction() {
        return "prod".equalsIgnoreCase(getActiveProfile());
    }
}

BaseController.java

package com.aboverock.core.spring.web;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.aboverock.common.constant.KbsmartConstant;
import com.aboverock.common.domain.Result;
import com.aboverock.common.helper.PageHelper;
import com.aboverock.common.utils.ReflectionUtils;
import com.aboverock.core.orm.domain.BaseEntity;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

public abstract class BaseController<T extends BaseEntity<?>, S extends IService<T>> {
    
    protected static final String CURRENT_PAGE_DEFAULT = KbsmartConstant.Pagination.CURRENT_PAGE_DEFAULT + "";
    protected static final String PAGE_SIZE_DEFAULT = KbsmartConstant.Pagination.PAGE_SIZE_DEFAULT + "";

    @Autowired
    protected S baseService;

    /**
     * 分页查询.
     *
     * @param request the request
     * @return 分页查询结果
     */
    @ApiOperation(value = "分页获取数据信息")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "current", value = "当前页码", defaultValue = CURRENT_PAGE_DEFAULT, required = false, dataType = "long"),
        @ApiImplicitParam(name = "pageSize", value = "每页数量", defaultValue = PAGE_SIZE_DEFAULT, required = false, dataType = "long"),
        @ApiImplicitParam(name = "sort", value = "字段排序:column1,column3,order1;column2,order2", required = false, paramType = "query") })
    @GetMapping
    public Result page(HttpServletRequest request) {
        Page<T> page = PageHelper.page(ReflectionUtils.getClassGenricType(getClass()));
        baseService.page(page, null);
        return Result.success(page);
    }

    /**
     * 查询所有数据.
     *
     * @param request the request
     * @return 查询数据的结果列表
     */
    @ApiOperation(value = "获取所有数据信息")
    @GetMapping("all")
    public Result all(HttpServletRequest request) {
        List<T> list = baseService.list(null);
        return Result.success(list);
    }

    /**
     * 插入新数据.
     *
     * @param entity the entity
     * @return the result
     */
    @ApiOperation(value = "新增数据")
    @PostMapping
    public Result save(@Valid @RequestBody T entity) {
        if (baseService.save(entity)) {
            return Result.success(entity);
        }
        return Result.fail();
    }

}

LongIdBaseController.java

package com.aboverock.core.spring.web;

import com.aboverock.common.domain.Result;
import com.aboverock.common.enums.MessageSourceKey;
import com.aboverock.core.orm.domain.BaseEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import io.swagger.annotations.ApiOperation;
import javax.validation.Valid;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;

public abstract class LongIdBaseController<T extends BaseEntity<Long>> extends BaseController<T, IService<T>> {
    
    /**
     * 通过id获取数据.
     *
     * @param id the id
     * @return the by id
     */
    @ApiOperation(value = "根据id获取数据信息")
    @GetMapping("{id}")
    public Result getById(@PathVariable("id") Long id) {
        T entity = baseService.getById(id);
        return Result.success(entity);
    }

    /**
     * 根据id更新数据.
     *
     * @param id the id
     * @param entity the entity
     * @return the result
     */
    @ApiOperation(value = "根据id更新数据信息")
    @PutMapping("{id}")
    public Result update(@PathVariable("id") Long id, @Valid @RequestBody T entity) {
        T oldEntity = baseService.getById(id);
        if (null == oldEntity) {
            return Result.fail(MessageSourceKey.Common.COMMON_DATA_NOT_FOUND_KEY);
        }

        entity.setId(id);
        if (baseService.updateById(entity)) {
            return Result.success(entity);
        }
        return Result.fail();
    }

    /**
     * Delete.
     *
     * @param id the id
     * @return the result
     */
    @ApiOperation(value = "根据id删除数据信息")
    @DeleteMapping("{id}")
    public Result delete(@PathVariable("id") Long id) {
        if (baseService.removeById(id)) {
            return Result.success();
        }
        return Result.fail();
    }

}

StringIdBaseController.java

package com.aboverock.core.spring.web;

import com.aboverock.common.domain.Result;
import com.aboverock.common.enums.MessageSourceKey;
import com.aboverock.core.orm.domain.BaseEntity;
import com.baomidou.mybatisplus.extension.service.IService;
import io.swagger.annotations.ApiOperation;
import javax.validation.Valid;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;

public abstract class StringIdBaseController<T extends BaseEntity<String>> extends BaseController<T, IService<T>> {
    
    /**
     * 通过id获取数据.
     *
     * @param id the id
     * @return the by id
     */
    @ApiOperation(value = "根据id获取数据信息")
    @GetMapping("{id}")
    public Result getById(@PathVariable("id") String id) {
        T entity = baseService.getById(id);
        return Result.success(entity);
    }

    /**
     * 根据id更新数据.
     *
     * @param id the id
     * @param entity the entity
     * @return the result
     */
    @ApiOperation(value = "根据id更新数据信息")
    @PutMapping("{id}")
    public Result update(@PathVariable("id") String id, @Valid @RequestBody T entity) {
        T oldEntity = baseService.getById(id);
        if (null == oldEntity) {
            return Result.fail(MessageSourceKey.Common.COMMON_DATA_NOT_FOUND_KEY);
        }

        entity.setId(id);
        if (baseService.updateById(entity)) {
            return Result.success(entity);
        }
        return Result.fail();
    }

    /**
     * Delete.
     *
     * @param id the id
     * @return the result
     */
    @ApiOperation(value = "根据id删除数据信息")
    @DeleteMapping("{id}")
    public Result delete(@PathVariable("id") String id) {
        if (baseService.removeById(id)) {
            return Result.success();
        }
        return Result.fail();
    }

}



版权声明:本文为wang727997856原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。