springBoot集成mybatis 转换为 mybatis-plus方式

 更新时间:2021年12月03日 11:39:57   投稿:jingxian  
这篇文章主要介绍了springBoot集成mybatis 转换为 mybatis-plus方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

mybatis-plus官方

导入maven

  <dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.4.2</version>
  </dependency>

更新yml文件

#mybatis-plus
mybatis-plus:
 mapperPackage: com.xn.mapper
 typeAliasesPackage: com.xn.mapper
 mapperLocations: classpath:mapper/*.xml
 global-config:
  db-config:
   id-type: none
 configuration:
  # 字段下划线转驼峰
  map-underscore-to-camel-case: false
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

添加扩展文件

(用于扩展 分页/批量新增修改/更多的方法修改 基础可以不加)

在这里插入图片描述

BaseEntity 用于定义model

model继承后可以 id自增会回填,更新时间在修改时刷新,创建时间在创建时刷新

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
import java.util.Date;
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public abstract class BaseEntity implements Serializable {
    /**
     * 创建时间 自增方式
     */
    @TableField(fill = FieldFill.INSERT)
    public Date create_time;
    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    public Date update_time;
    /**
     * ID
     */
    @TableId(value="id" ,type = IdType.AUTO)
    private Long id;
}

CreateAndUpdateMetaObjectHandler

设置刷新 更新时间 创建时间

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import java.util.Date;
/**
 * MP注入处理器
 */
public class CreateAndUpdateMetaObjectHandler implements MetaObjectHandler {
	public String CREATE_TIME = "create_time";
	public String UPDATE_TIME = "update_time";
	@Override
	public void insertFill(MetaObject metaObject) {
		if (metaObject.hasGetter(CREATE_TIME)) {
			if (metaObject.getValue(CREATE_TIME) == null) {
				this.setFieldValByName(CREATE_TIME, new Date(), metaObject);
			}
		}
	}
	@Override
	public void updateFill(MetaObject metaObject) {
		if (metaObject.hasGetter(UPDATE_TIME)) {
			if (metaObject.getValue(UPDATE_TIME) == null) {
				this.setFieldValByName(UPDATE_TIME, new Date(), metaObject);
			}
		}
	}
}

批量插入/更新 mapper需要继承这个接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
 * 自定义 Mapper 接口, 实现 自定义扩展
 *
 */
public interface BaseMapperPlus<T> extends BaseMapper<T> {
    /**
     * 批量插入(mysql)
     * @param entityList
     * @return
     */
    Integer insertBatchSomeColumn(List<T> entityList);
    /**
     * 批量更新(mysql)
     * @param entityList
     * @return
     */
    Integer updateBatchSomeColumn(List<T> entityList);
}

将批量方法放到 sql注入器中

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn;
import java.util.List;
/**
 * mybatis + sql注入器
 */
public class MybatisPlusSqlInjector extends DefaultSqlInjector {
    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 添加InsertBatchSomeColumn方法
        methodList.add(new InsertBatchSomeColumn());
        methodList.add(new UpdateBatchSomeColumn());
        return methodList;
    }

实现批量更新的方法

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
/**
 * 批处理更新一些列
 *
 */
public class UpdateBatchSomeColumn extends AbstractMethod {
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "<script>\n<foreach collection=\"list\" item=\"item\" separator=\";\">\nupdate %s %s where %s=#{%s} %s\n</foreach>\n</script>";
        String additional = tableInfo.isWithVersion() ? tableInfo.getVersionFieldInfo().getVersionOli("item", "item.") : "" + tableInfo.getLogicDeleteSql(true, true);
        String setSql = sqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, "item", "item.");
        String sqlResult = String.format(sql, tableInfo.getTableName(), setSql, tableInfo.getKeyColumn(), "item." + tableInfo.getKeyProperty(), additional);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateBatchSomeColumn", sqlSource);
    }
}

mybatis-plus配置类

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
 * mybatis-plus配置类
 */
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
@MapperScan("${mybatis-plus.mapperPackage}")
public class MybatisPlusConfig {
	@Bean
	public MybatisPlusInterceptor mybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
		// 分页插件
		interceptor.addInnerInterceptor(paginationInnerInterceptor());
		// 乐观锁插件
		interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
		return interceptor;
	}
	/**
	 * 分页插件,自动识别数据库类型
	 */
	public PaginationInnerInterceptor paginationInnerInterceptor() {
		PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
		// 设置数据库类型为mysql
		paginationInnerInterceptor.setDbType(DbType.MYSQL);
		// 设置最大单页限制数量,默认 500 条,-1 不受限制
		paginationInnerInterceptor.setMaxLimit(-1L);
		return paginationInnerInterceptor;
	}
	/**
	 * 乐观锁插件
	 */
	public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
		return new OptimisticLockerInnerInterceptor();
	}
	/**
	 * 元对象字段填充控制器
	 */
	@Bean
	public MetaObjectHandler metaObjectHandler() {
		return new CreateAndUpdateMetaObjectHandler();
	}
	/**
	 * sql注入器配置
	 */
	@Bean
	public MybatisPlusSqlInjector easySqlInjector () {
		return new MybatisPlusSqlInjector();
	}
}

还有两个是分页与查询方式可以自己定义

分页类需要继承 IPage,查询类可以继承 IService

开始测试

使用分页查询

    @Override
    public ServerResponse selectTableTestList(TableTestPOJO tableTest) {
        // 分页查询 1 sql自己写 适用于多表
        Page<TableTest> page = new Page<>(mutualStep.getPageNum(), mutualStep.getPageSize());
        page = tableTestMapper.findTableList(page,new TableTest());
        // 分页查询 2 对象筛选 适用单表 条件默认相等
        QueryWrapper<TableTest> query = Wrappers.query();
        query.like("name","ls");
        query.and(
                wrapper ->
                        wrapper.notLike("name","1").or().like("name","ls")
        );
        query.orderByDesc("id");
        Page<TableTest> page = new Page<>(tableTest.getPageNum(), tableTest.getPageSize());
        Page<TableTest> pageList = tableTestMapper.selectPage(page, query);
        return ServerResponse.createBySuccess(pageList);
    }

逻辑删除定义

	/**
     * 删除状态 0未删除,1删除
     */
    @TableLogic(value = "0",delval = "1")
    private Integer is_del;

逻辑删除

    @Override
    public ServerResponse deleteTableTest(MutualStepPage mutualStepPage, Integer... ids) {
        int number = tableTestMapper.deleteBatchIds(Arrays.asList(ids));
        return ServerResponse.createBySuccess(number);
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Hibernate实现批量添加数据的方法

    Hibernate实现批量添加数据的方法

    这篇文章主要介绍了Hibernate实现批量添加数据的方法,详细分析了基于Hibernate执行批量添加操作的具体步骤与相关实现代码,需要的朋友可以参考下
    2016-03-03
  • 详解jvm双亲委派机制

    详解jvm双亲委派机制

    双亲委派机制保证了核心类的安全,确保不会被修改,也保证了不会加载到重复的字节码文件,这篇文章主要介绍了jvm双亲委派机制详解,需要的朋友可以参考下
    2022-11-11
  • Spring的请求映射handlerMapping以及原理详解

    Spring的请求映射handlerMapping以及原理详解

    这篇文章主要介绍了Spring的请求映射handlerMapping以及原理详解,我们每次发请求,它到底是怎么找到我们哪个方法来去处理这个请求,因为我们知道所有的请求过来都会来到DispatcherServlet,springboot底层还是使用的是springMVC,需要的朋友可以参考下
    2023-08-08
  • Spring MVC 简单的hello world的实现

    Spring MVC 简单的hello world的实现

    这篇文章主要介绍了Spring MVC 简单的hello world的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • java的多线程用法编程总结

    java的多线程用法编程总结

    本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。
    2016-10-10
  • SpringBoot+Mybatis-Plus实现mysql读写分离方案的示例代码

    SpringBoot+Mybatis-Plus实现mysql读写分离方案的示例代码

    这篇文章主要介绍了SpringBoot+Mybatis-Plus实现mysql读写分离方案的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java中int转string与string转int的效率对比

    java中int转string与string转int的效率对比

    这篇文章主要介绍了java中int转string与string转int的效率对比,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 你知道Java中的注解可以继承吗?

    你知道Java中的注解可以继承吗?

    注解想必大家都用过,也叫元数据,是一种代码级别的注释,可以对类或者方法等元素做标记说明。那么今天我想问大家的是类被继承了,注解能否继承呢?可能会和大家想的不一样,感兴趣的可以往下看
    2022-12-12
  • ServletContext读取web资源_动力节点Java学院整理

    ServletContext读取web资源_动力节点Java学院整理

    这篇文章主要介绍了ServletContext读取web资源,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    浅谈JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并

    这篇文章主要介绍了JAVA实现选择排序,插入排序,冒泡排序,以及两个有序数组的合并,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03

最新评论