目录
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 版权协议,转载请附上原文出处链接和本声明。