ToB企服应用市场:ToB评测及商务社交产业平台
标题:
springboot3 集成mybatis 和通用mapper
[打印本页]
作者:
卖不甜枣
时间:
2023-9-2 03:19
标题:
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
import 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); } default RE 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); } default RE 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; } default List select(T t,Class returnClass) {
</dependencies> List ts = selectList(t);
</dependencies> return covertList(ts,returnClass); } default Page selectPage(T t,Class returnClass) {
</dependencies> Page ts = (Page) selectList(t);
</dependencies> return (Page) covertList(ts,returnClass); } default Page selectPageByExample(Example example,Class returnClass) {
</dependencies> Page ts = (Page) selectByExample(example);
</dependencies> return (Page) covertList(ts,returnClass); } default List selectByExample(Example example,Class returnClass) {
</dependencies> List ts = selectByExample(example);
</dependencies> return covertList(ts,returnClass); } default RE 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; } default RE 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()[0];
</dependencies> Type[] genericInterfaces = interfaces.getGenericInterfaces();
</dependencies> Type type = genericInterfaces[0];
</dependencies> if( type instanceof ParameterizedType){
</dependencies> ParameterizedType pType = (ParameterizedType) type;
</dependencies> Type clazz = pType.getActualTypeArguments()[0];
</dependencies> if( clazz instanceof Class ){
</dependencies>
</dependencies> return (Class) clazz;
</dependencies> }
</dependencies> }
</dependencies> return null; } default List 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; } default RE 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的一些基本注解
import 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
[code]package 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() + "
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4