卖不甜枣 发表于 2023-9-2 03:19:27

springboot3 集成mybatis 和通用mapper

xml版本查看:https://www.cnblogs.com/binz/p/6564490.html
springboot3.x以前的版本查看 https://www.cnblogs.com/binz/p/17421063.html
springboot3.x查看  https://www.cnblogs.com/binz/p/17654403.html
1、pom引用
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.2</version>
</parent>

<dependencies>
   <dependency>
   
</dependencies>      <groupId>org.springframework.boot</groupId>
   
</dependencies>      <artifactId>spring-boot-starter-web</artifactId>
   
</dependencies>      <exclusions>
   
</dependencies>      
</dependencies>    <exclusion>
   
</dependencies>      
</dependencies>      <artifactId>spring-boot-starter-tomcat</artifactId>
   
</dependencies>      
</dependencies>      <groupId>org.springframework.boot</groupId>
   
</dependencies>      
</dependencies>    </exclusion>
   
</dependencies>      </exclusions>
   
</dependencies>    </dependency>
   
</dependencies>   
   
</dependencies>   
   
</dependencies>    <dependency>
   
</dependencies>      <groupId>org.springframework.boot</groupId>
   
</dependencies>      <artifactId>spring-boot-starter-undertow</artifactId>
   
</dependencies>    </dependency>

   
</dependencies>    <dependency>
   
</dependencies>      <groupId>com.github.pagehelper</groupId>
   
</dependencies>      <artifactId>pagehelper-spring-boot-starter</artifactId>
   
</dependencies>      <version>1.4.7</version>
   
</dependencies>    </dependency><br>
    <br>   
    <dependency>
   
</dependencies>      <groupId>io.mybatis</groupId>
   
</dependencies>      <artifactId>mybatis-mapper</artifactId>
   
</dependencies>      <version>2.1.1</version>
    </dependency><br>   
    <dependency>
   
</dependencies>      <groupId>org.mybatis.spring.boot</groupId>
   
</dependencies>      <artifactId>mybatis-spring-boot-starter</artifactId>
   
</dependencies>      <version>3.0.2</version>
    </dependency><br><br><br>    
   
</dependencies>        
           
                        com.github.xiaoymin
                        knife4j-openapi3-jakarta-spring-boot-starter
                        4.3.0
                    
   
</dependencies>        
   
</dependencies>    2、新建自己的BaseMapper
https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifimport java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.List;import java.util.Optional;import org.apache.ibatis.session.RowBounds;import com.github.pagehelper.Page;import cn.hutool.core.bean.BeanUtil;import cn.hutool.core.util.ObjectUtil;import cn.hutool.core.util.ReflectUtil;import io.mybatis.mapper.Mapper;import io.mybatis.mapper.example.Example;import io.mybatis.mapper.example.LambdaExampleWrapper;public interface BaseMapper extends Mapper{   
</dependencies>    List selectList(T entity, RowBounds rowBounds);    default T getById(Long id) {   
</dependencies>    return selectByPrimaryKey(id).orElse(null);    }    defaultRE getById(Long id,Class returnClass) {   
</dependencies>    T t = getById(id);   
</dependencies>    if(t != null) {   
</dependencies>      return covert(t,returnClass);   
</dependencies>    }   
</dependencies>    return null;    }    default T one(T query) {   
</dependencies>    return selectOne(query).orElse(null);    }    defaultRE one(T query,Class returnClass) {   
</dependencies>    Optional optional = selectOne(query);   
</dependencies>    if(optional.isPresent()) {   
</dependencies>      T t = optional.get();   
</dependencies>      return covert(t,returnClass);   
</dependencies>    }   
</dependencies>    return null;    }    defaultList select(T t,Class returnClass) {   
</dependencies>    List ts = selectList(t);   
</dependencies>    return covertList(ts,returnClass);    }    defaultPage selectPage(T t,Class returnClass) {   
</dependencies>    Page ts = (Page) selectList(t);   
</dependencies>    return (Page) covertList(ts,returnClass);    }    defaultPage selectPageByExample(Example example,Class returnClass) {   
</dependencies>    Page ts = (Page) selectByExample(example);   
</dependencies>    return (Page) covertList(ts,returnClass);    }    defaultList selectByExample(Example example,Class returnClass) {   
</dependencies>    List ts = selectByExample(example);   
</dependencies>    return covertList(ts,returnClass);    }    defaultRE selectOneByExample(Example example,Class returnClass) {   
</dependencies>    Optional optional = selectOneByExample(example);   
</dependencies>    if(optional.isPresent()) {   
</dependencies>      T t = optional.get();   
</dependencies>      return covert(t,returnClass);   
</dependencies>    }   
</dependencies>    return null;    }    defaultRE selectOneByExampleLimitOne(Example example,Class returnClass) {   
</dependencies>    T t = selectOneByExampleLimitOne(example);   
</dependencies>    if(t != null) {   
</dependencies>      return covert(t, returnClass);   
</dependencies>    }   
</dependencies>    return null;    }    default T selectOneByExampleLimitOne(Example example) {   
</dependencies>    RowBounds rowBounds = new RowBounds(0, 1);   
</dependencies>    List ts = selectByExample(example, rowBounds);   
</dependencies>    if(ObjectUtil.isNotEmpty(ts)) {   
</dependencies>      return ts.get(0);   
</dependencies>    }   
</dependencies>    return null;    }    default T selectOneByLimitOne(T t) {   
</dependencies>    RowBounds rowBounds = new RowBounds(0, 1);   
</dependencies>    List ts = selectList(t,rowBounds);   
</dependencies>    if(ObjectUtil.isNotEmpty(ts)) {   
</dependencies>      return ts.get(0);   
</dependencies>    }   
</dependencies>    return null;    }    @SuppressWarnings("unchecked")    default Class thisTClass() {   
</dependencies>    Class class1 = getClass();   
</dependencies>    Class interfaces = class1.getInterfaces();   
</dependencies>    Type[] genericInterfaces = interfaces.getGenericInterfaces();   
</dependencies>    Type type = genericInterfaces;   
</dependencies>    if( type instanceof ParameterizedType){   
</dependencies>      ParameterizedType pType = (ParameterizedType) type;   
</dependencies>      Type clazz = pType.getActualTypeArguments();   
</dependencies>      if( clazz instanceof Class ){   
</dependencies>      
</dependencies>    return (Class) clazz;   
</dependencies>      }   
</dependencies>    }   
</dependencies>    return null;    }    defaultList covertList(List ts,Class returnClass){   
</dependencies>    List responses;   
</dependencies>    if(ts instanceof Page) {   
</dependencies>      responses = new Page();   
</dependencies>    }else {   
</dependencies>      responses = new ArrayList();   
</dependencies>    }   
</dependencies>    for (T t : ts) {   
</dependencies>      responses.add(covert(t,returnClass));   
</dependencies>    }   
</dependencies>    return responses;    }    defaultRE covert(T t , Class returnClass) {   
</dependencies>    if(t != null) {   
</dependencies>      RE response = null;   
</dependencies>      try {   
</dependencies>      
</dependencies>    response = ReflectUtil.newInstanceIfPossible(returnClass);   
</dependencies>      
</dependencies>    BeanUtil.copy(t, response);   
</dependencies>      } catch (Exception e) {   
</dependencies>      
</dependencies>    e.printStackTrace();   
</dependencies>      }   
</dependencies>      return response;   
</dependencies>    }   
</dependencies>    return null;    }    //自带的wrapper()个人觉得还缺点东西,就自己复制了一份出来微调了,根据情况使用,不需要就删除,需要对应的代码在下方    default LambdaExampleWrapper lambdaWrapper() {   
</dependencies>    return new LambdaExampleWrapper(BaseMapper.this, example());    }}View Code3、新建表模型,注意注解使用和以前版本有区别,但是兼容一些之前javax.persistence的一些基本注解
https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifimport java.util.Date;import io.mybatis.provider.Entity;import lombok.Data;@Data@Entity.Table("system_user")public class User {    @Entity.Column(id = true,insertable = false,updatable = false)    private Long id;    /**    * 姓名    */    private String realname;    /**    * 手机号    */    private String mobile;    /**    * 密码    */    private String password;    /**    * 身份证号    */    private String idcard;   
</dependencies>    /**    * 头像    */    private String avatar;    /**    * 最后登录时间    */    private String lastLoginIp;    /**    * 最后登录时间    */    private Date lastLoginTime;    /**    * 创建人    */    private Long createBy;    /**    * 创建时间    */    private Date createTime;    /**    * 修改人    */    private Long updateBy;    /**    * update_time    */    private Date updateTime;}View Code4、创建对应业务的mapper继承BaseMapper
import com.xxx.core.base.BaseMapper;
import com.xxx.system.model.User;

public interface UserMapper extends BaseMapper<User>{


}5、启动类扫描自己的mapper目录 @MapperScan
import org.mybatis.spring.annotation.MapperScan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.ComponentScan;import org.springframework.scheduling.annotation.EnableScheduling;@EnableCaching@EnableScheduling@SpringBootApplication@MapperScan(basePackages="com.xxx.*.mapper")@ComponentScan(basePackages = { "com.xxx.*.config", "com.xxx.*.controller", "com.xxx.*.job" })public class OperateApiStarted {    public static void main(String[] args) {   
</dependencies>    SpringApplication.run(OperateApiStarted.class, args);    }} 6、创建io.mybatis.mapper.example.LambdaExampleWrapper
https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gifhttps://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gifpackage io.mybatis.mapper.example;import java.io.Serializable;import java.util.Arrays;import java.util.List;import java.util.function.Function;import java.util.function.Supplier;import java.util.stream.Collectors;import java.util.stream.Stream;import org.apache.ibatis.exceptions.TooManyResultsException;import org.apache.ibatis.session.RowBounds;import com.github.pagehelper.Page;import com.xxx.BaseMapper;import com.xxx.BeanUtil;import io.mybatis.common.util.Assert;import io.mybatis.mapper.fn.Fn;public class LambdaExampleWrapper {    private final BaseMapper    baseMapper;    private final Example   
</dependencies>      example;    private       Example.Criteria current;    public LambdaExampleWrapper(BaseMapper baseMapper, Example example) {   
</dependencies>    this.baseMapper = baseMapper;   
</dependencies>    this.example = example;   
</dependencies>    this.current = example.createCriteria();    }    /**   * or 一组条件   *   * @return 条件   */    public LambdaExampleWrapper or() {   
</dependencies>    this.current = this.example.or();   
</dependencies>    return this;    }    /**   * 获取查询条件   */    public Example example() {   
</dependencies>    return example;    }    /**   * 清除条件,可重用   */    public LambdaExampleWrapper clear() {   
</dependencies>    this.example.clear();   
</dependencies>    this.current = example.createCriteria();   
</dependencies>    return this;    }    /**   * 指定查询列   *   * @param fns 方法引用   */    @SafeVarargs    public final LambdaExampleWrapper select(Fn... fns) {   
</dependencies>    this.example.selectColumns(fns);   
</dependencies>    return this;    }    /**   * 排除指定查询列   *   * @param fns 方法引用   */    @SafeVarargs    public final LambdaExampleWrapper exclude(Fn... fns) {   
</dependencies>    this.example.excludeColumns(fns);   
</dependencies>    return this;    }    /**   * 设置起始 SQL   *   * @param startSql 起始 SQL,添加到 SQL 前,注意防止 SQL 注入   */    public LambdaExampleWrapper startSql(String startSql) {   
</dependencies>    this.example.setStartSql(startSql);   
</dependencies>    return this;    }    /**   * 设置结尾 SQL   *   * @param endSql 结尾 SQL,添加到 SQL 最后,注意防止 SQL 注入   */    public LambdaExampleWrapper endSql(String endSql) {   
</dependencies>    this.example.setEndSql(endSql);   
</dependencies>    return this;    }    /**   * 通过方法引用方式设置排序字段   *   * @param fn    排序列的方法引用   * @param order 排序方式   * @return Example   */    public LambdaExampleWrapper orderBy(Fn fn, Example.Order order) {   
</dependencies>    this.example.orderBy(fn, order);   
</dependencies>    return this;    }    /**   * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案   *   * @param orderByCondition 排序字符串(不会覆盖已有的排序内容)   * @return Example   */    public LambdaExampleWrapper orderBy(String orderByCondition) {   
</dependencies>    this.example.orderBy(orderByCondition);   
</dependencies>    return this;    }    /**   * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案   *   * @param orderByCondition 排序字符串构造方法,比如通过数组集合循环拼接等   * @return Example   */    public LambdaExampleWrapper orderBy(Supplier orderByCondition) {   
</dependencies>    this.example.orderBy(orderByCondition);   
</dependencies>    return this;    }    /**   * 支持使用字符串形式来设置 order by,用以支持一些特殊的排序方案   *   * @param useOrderBy       条件表达式,true使用,false不使用 字符串排序   * @param orderByCondition 排序字符串构造方法,比如通过数组集合循环拼接等   * @return Example   */    public LambdaExampleWrapper orderBy(boolean useOrderBy, Supplier orderByCondition) {   
</dependencies>    return useOrderBy ? this.orderBy(orderByCondition) : this;    }    /**   * 通过方法引用方式设置排序字段,升序排序   *   * @param fns 排序列的方法引用   * @return Example   */    @SafeVarargs    public final LambdaExampleWrapper orderByAsc(Fn... fns) {   
</dependencies>    this.example.orderByAsc(fns);   
</dependencies>    return this;    }    /**   * 通过方法引用方式设置排序字段,降序排序   *   * @param fns 排序列的方法引用   * @return Example   */    @SafeVarargs    public final LambdaExampleWrapper orderByDesc(Fn... fns) {   
</dependencies>    this.example.orderByDesc(fns);   
</dependencies>    return this;    }    /**   * 设置 distince   */    public LambdaExampleWrapper distinct() {   
</dependencies>    this.example.setDistinct(true);   
</dependencies>    return this;    }    /**   * 设置更新字段和值   *   * @param useSet 表达式条件, true 使用,false 不使用   * @param setSql "column = value"   */    public LambdaExampleWrapper set(boolean useSet, String setSql) {   
</dependencies>    return useSet ? set(setSql) : this;    }    /**   * 设置更新字段和值   *   * @param setSql "column = value"   */    public LambdaExampleWrapper set(String setSql) {   
</dependencies>    this.example.set(setSql);   
</dependencies>    return this;    }    /**   * 设置更新字段和值   *   * @param useSet 表达式条件, true 使用,false 不使用   * @param fn   字段   * @param value值   */    public LambdaExampleWrapper set(boolean useSet, Fn fn, Object value) {   
</dependencies>    return useSet ? set(fn, value) : this;    }    /**   * 设置更新字段和值   *   * @param useSet   表达式条件, true 使用,false 不使用   * @param fn       字段   * @param supplier 值构造函数   */    public LambdaExampleWrapper set(boolean useSet, Fn fn, Supplier supplier) {   
</dependencies>    return useSet ? set(fn, supplier.get()) : this;    }    /**   * 设置更新字段和值   *   * @param fn    字段   * @param value 值   */    public LambdaExampleWrapper set(Fn fn, Object value) {   
</dependencies>    this.example.set(fn, value);   
</dependencies>    return this;    }    /**   * 指定字段为 null   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   */    public LambdaExampleWrapper isNull(boolean useCondition, Fn fn) {   
</dependencies>    return useCondition ? isNull(fn) : this;    }    /**   * 指定字段为 null   *   * @param fn 字段对应的 get 方法引用   */    public LambdaExampleWrapper isNull(Fn fn) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + " IS NULL");   
</dependencies>    return this;    }    /**   * 指定字段不为 null   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   */    public LambdaExampleWrapper isNotNull(boolean useCondition, Fn fn) {   
</dependencies>    return useCondition ? isNotNull(fn) : this;    }    /**   * 指定字段不为 null   *   * @param fn 字段对应的 get 方法引用   */    public LambdaExampleWrapper isNotNull(Fn fn) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + " IS NOT NULL");   
</dependencies>    return this;    }    /**   * 字段 = 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param value   
</dependencies>    值   */    public LambdaExampleWrapper eq(boolean useCondition, Fn fn, Object value) {   
</dependencies>    return useCondition ? eq(fn, value) : this;    }    /**   * 字段 = 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param supplier   值构造函数   */    public LambdaExampleWrapper eq(boolean useCondition, Fn fn, Supplier supplier) {   
</dependencies>    return useCondition ? eq(fn, supplier.get()) : this;    }    /**   * 字段 = 值   *   * @param fn    字段对应的 get 方法引用   * @param value 值   */    public LambdaExampleWrapper eq(Fn fn, Object value) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + " =", value);   
</dependencies>    return this;    }    /**   * 字段 != 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param supplier   值构造函数   */    public LambdaExampleWrapper ne(boolean useCondition, Fn fn, Supplier supplier) {   
</dependencies>    return useCondition ? ne(fn, supplier.get()) : this;    }    /**   * 字段 != 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param value   
</dependencies>    值   */    public LambdaExampleWrapper ne(boolean useCondition, Fn fn, Object value) {   
</dependencies>    return useCondition ? ne(fn, value) : this;    }    /**   * 字段 != 值   *   * @param fn    字段对应的 get 方法引用   * @param value 值   */    public LambdaExampleWrapper ne(Fn fn, Object value) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + " ", value);   
</dependencies>    return this;    }    /**   * 字段 > 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param supplier   值构造函数   */    public LambdaExampleWrapper gt(boolean useCondition, Fn fn, Supplier supplier) {   
</dependencies>    return useCondition ? gt(fn, supplier.get()) : this;    }    /**   * 字段 > 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param value   
</dependencies>    值   */    public LambdaExampleWrapper gt(boolean useCondition, Fn fn, Object value) {   
</dependencies>    return useCondition ? gt(fn, value) : this;    }    /**   * 字段 > 值   *   * @param fn    字段对应的 get 方法引用   * @param value 值   */    public LambdaExampleWrapper gt(Fn fn, Object value) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + " >", value);   
</dependencies>    return this;    }    /**   * 字段 >= 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param supplier   值构造函数   */    public LambdaExampleWrapper ge(boolean useCondition, Fn fn, Supplier supplier) {   
</dependencies>    return useCondition ? ge(fn, supplier.get()) : this;    }    /**   * 字段 >= 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param value   
</dependencies>    值   */    public LambdaExampleWrapper ge(boolean useCondition, Fn fn, Object value) {   
</dependencies>    return useCondition ? ge(fn, value) : this;    }    /**   * 字段 >= 值   *   * @param fn    字段对应的 get 方法引用   * @param value 值   */    public LambdaExampleWrapper ge(Fn fn, Object value) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + " >=", value);   
</dependencies>    return this;    }    /**   * 字段 < 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   */    public LambdaExampleWrapper lt(boolean useCondition, Fn fn, Supplier supplier) {   
</dependencies>    return useCondition ? lt(fn, supplier.get()) : this;    }    /**   * 字段 < 值   *   * @param useCondition 表达式条件, true 使用,false 不使用   * @param fn   
</dependencies>       字段对应的 get 方法引用   * @param value   
</dependencies>    值   */    public LambdaExampleWrapper lt(boolean useCondition, Fn fn, Object value) {   
</dependencies>    return useCondition ? lt(fn, value) : this;    }    /**   * 字段 < 值   *   * @param fn    字段对应的 get 方法引用   * @param value 值   */    public LambdaExampleWrapper lt(Fn fn, Object value) {   
</dependencies>    this.current.addCriterion(fn.toColumn() + "
页: [1]
查看完整版本: springboot3 集成mybatis 和通用mapper