我是靠谱客的博主 苹果毛衣,最近开发中收集的这篇文章主要介绍mybatis-plus,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、基础配置

1、导入maven依赖

<!-- 数据库连接 -->
<dependency>
  <groupId>mysql</groupId>  
  <artifactId>mysql-connector-java</artifactId>  
</dependency>

<!-- mybatis-plus依赖 -->
<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-boot-starter</artifactId>
  <version>3.5.1</version>
</dependency>

2、配置数据源

【省略创建数据库、表和添加数据】

#mysql8 的需要设置时区
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin

3、日志打印

# 日志打印
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

二、测试

1、创建实体类

package com.tcc.entity;

import java.sql.Timestamp;
import java.util.Date;

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 com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;

public class User {
	private Long id;
	private String name;
	private Integer age;
	private String email;
	
	//getter,setter等方法省略...

}

2、创建mapper

package com.tcc.mapper;

import org.apache.ibatis.annotations.Mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tcc.entity.User;

//放入springbott中并自动扫描这个类
@Mapper
//继承mybatis-plus的接口,里面拥有大部分sql方法 给这个接口传入泛型
public interface UserMapper extends BaseMapper<User> {
	
}

3、在测试方法中测试

package com.tcc;

import java.util.List;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import com.tcc.mapper.UserMapper;

@SpringBootTest
class ApplicationTests {
	@Autowired
	private UserMapper uMapper;

	/**
	 * 查询所有
	 */
	@Test
	void contextLoads() {
		List<User> list = uMapper.selectList(null);
		System.out.println(list);
	}

}

三、基本的CRUD

1、查询

/**
	* 查询所有
	*/
@Test
void contextLoads() {
  List<User> list = uMapper.selectList(null);
  System.out.println(list);
}

/**
	 * 根据id查询
	 */
@Test
void selectById() {
  User user = uMapper.selectById(1L);
  System.out.println(user);
}

/**
	 * 根据多个id查询
	 */
@Test
void selectByIds() {
  List<User> user = uMapper.selectBatchIds(Arrays.asList(1,2,3));
  System.out.println(user);
}

/**
	 * 根据map条件查询 会自动map里面的键值对动态拼接到where后面
	 */
@Test
void selectByMap() {
  HashMap<String,Object> map = new HashMap<>();
  map.put("name", "aaa");
  map.put("age", 20);
  List<User> user = uMapper.selectByMap(map);
  System.out.println(user);
}

2、添加

/**
	 * 添加
	 */
@Test
void addUser() {
  User user = new User();
  //user.setId(7L);
  user.setName("baba10");
  user.setAge(22);
  user.setEmail("897113177@qq.com");

  int num = uMapper.insert(user);
  System.out.println(num);
  System.out.println(user);
}

3、修改

/**
	 * 修改
	 */
@Test
void updateUser() {
  User user = new User();
  user.setId(1L);
  user.setName("abc");
  int num = uMapper.updateById(user);
  System.out.println(num);
}

4、删除

/**
	 * 删除 简单举例,还有很多删除的方法
	 */
@Test
void delUser() {
  int num = uMapper.deleteById(1492031071255588866L);
  System.out.println(num);
}

四、自定义ID生成

1、在实体类id上添加注解@TableId

//如果添加对象的时候不给id值或给null值,那么默认为雪花算法添加默认的全局唯一id,如果使用注解赋值则用注解的
//@TableId(type = IdType.AUTO)可以设置id值,添加的时候会默认添加,值可以参考IdType.class类或官网
@TableId(type = IdType.ASSIGN_ID)
private Long id;

五、自动填充

1、在表中添加 gmt_create, gmt_modified

  • 代表数据的创建时间和修改时间,gmt代表国际化。

2、更新实体类的属性,然后在这两个属性上添加注解@TableField

//自动填充功能 FieldFill:字段自动填充策略
@TableField(fill = FieldFill.INSERT)//在添加的时候填充
private Date create_time;
@TableField(fill = FieldFill.INSERT_UPDATE)//在添加和修改的时候填充
private Timestamp update_time;

3、自定义实现类 MyMetaObjectHandler

package com.tcc.Handler;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

//添加为spring组件
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

  Date date = new Date();//获得系统时间. 
  String nowTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
  //把被格式化的new date转换为Timestamp格式的日期
  Timestamp goodsC_date = Timestamp.valueOf(nowTime);

  @Override
  public void insertFill(MetaObject metaObject) {
    this.setFieldValByName("create_time", new Date(), metaObject);
    this.setFieldValByName("update_time", goodsC_date, metaObject);
  }

  @Override
  public void updateFill(MetaObject metaObject) {
    this.setFieldValByName("update_time", goodsC_date, metaObject);
  }

}

4、添加和修改数据进行测试查看时间列是否自动填充

六、乐观锁插件

1、创建配置类

package com.tcc.mpconfiguration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;


//定义配置类
@Configuration
//启用事务管理  效果等同于xml配置的<tx:annotation-driven />
@EnableTransactionManagement
public class MyBatisPlusConfiguration {
	
	/**
     * 乐观锁新版
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mybatisPlusInterceptor;
    }

}

2、在实体类version属性上添加@Version注解

@Version //乐观锁
private Integer version;

3、测试

/**
	 * 测试乐观锁成功
	 */
@Test
void versionTest() {
  User user = uMapper.selectById(1L);
  user.setName("bbb");
  uMapper.updateById(user);
}

/**
	 * 测试乐观锁失败
	 */
@Test
void versionTest2() {
  //修改失败
  User user = uMapper.selectById(1L);
  user.setName("ccc");

  //模拟另外一个线程执行了插队操作
  User user2 = uMapper.selectById(1L);
  user2.setName("aaa");
  uMapper.updateById(user2);

  uMapper.updateById(user);
}

七、分页插件

1、在配置类里添加配置方法

/**
  * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
  */
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor2() {
  MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
  return interceptor;
}

2、测试

/**
	 * 测试分页
	 */
@Test
void pageTest() {
  Page<User> page = new Page<>(2,3);
  uMapper.selectPage(page, null);
  List<User> list = page.getRecords();
  System.out.println(list);
}

八、逻辑删除

1、在表中添加deleted字段

2、更新实体类并在该类上添加@TableLogic注解

@TableLogic  //逻辑删除
private Integer deleted;

3、在配置文件里进行乐观锁配置

#乐观锁 默认0为没有被删除的,1为删除的
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0

4、进行测试

  • 执行删除的话看日志其实执行的是修改操作。
  • 执行查询的话会在where后面添加条件[and] deleted=0。

九、条件构造器

1、在测试方法中new一个wapper对象

  • 有QueryWrapper、UpdateWrapper等,具体看方法所需要的类型

2、调用测试

/**
	 * 条件构造器 wapper
	 * 查询名称为aaa的人
	 */
@Test
void wapperTest1() {
  QueryWrapper<User> wrapper = new QueryWrapper<>();
  wrapper.eq("name", "aaa");
  User user = uMapper.selectOne(wrapper);
  System.out.println(user.toString());
}

/**
	 * 条件构造器 wapper
	 * 查询姓名等于abc并且邮箱等于指定值并且年龄大于等于21的人
	 */
@Test
void wapperTest2() {
  QueryWrapper<User> wrapper = new QueryWrapper<>();
  wrapper.eq("name", "abc");
  wrapper.eq("email", "897113177@qq.com");
  wrapper.ge("age", 21);
  List<User> list = uMapper.selectList(wrapper);
  list.forEach(System.out::println);
}

/**
	 * 条件构造器 wapper
	 * 查询名称里含有a字母的人
	 */
@Test
void wapperTest3() {
  QueryWrapper<User> wrapper = new QueryWrapper<>();
  wrapper.like("name", "a");
  List<User> user = uMapper.selectList(wrapper);
  user.forEach(System.out::println);
}

/**
	 * 条件构造器 wapper
	 * 把名字为abc的人改成666
	 */
@Test
void wapperTest4() {
  User user = new User();
  UpdateWrapper<User> wrapper = new UpdateWrapper<>();
  wrapper.eq("name","abc");
  user.setName("666");

  uMapper.update(user, wrapper);
}

wapper的更多方法请在官网查看:https://baomidou.com/pages/10c804/#abstractwrapper。

十、代码生成器

1、旧(3.5.1以下版本适用)

1、导入依赖

<dependency>
  <groupId>org.apache.velocity</groupId>
  <artifactId>velocity-engine-core</artifactId>
  <version>2.0</version>
</dependency>

2、编写代码自动生成类

package com.tcc;

import java.util.ArrayList;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

// 代码自动生成器
public class MyAutoGenerator {

	public static void main(String[] args) {
		// 需要构建一个 代码自动生成器 对象
		AutoGenerator mpg = new AutoGenerator();
		
		// 全局配置
		GlobalConfig gc = new GlobalConfig();
		String projectPath = System.getProperty("user.dir");
		gc.setOutputDir(projectPath + "/src/main/java");
		// 作者
		gc.setAuthor("宇辰");
		// 是否打开输出目录(文件夹)
		gc.setOpen(false);
		// 是否覆盖已有文件
		gc.setFileOverride(false);
		// 默认声明前面会有前缀I,这个配置是去I的
		gc.setServiceName("%sService");
		// 指定生成的主键的ID类型
		gc.setIdType(IdType.ID_WORKER);
		// 时间类型对应策略
		gc.setDateType(DateType.ONLY_DATE);
		// 是否开启 swagger2 模式
		gc.setSwagger2(false);
		mpg.setGlobalConfig(gc);
		
		// 设置数据源
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setUrl("jdbc:mysql://localhost:3306/springbootdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");
		dsc.setUsername("root");
		dsc.setPassword("admin");
		// 设置数据库类型
		dsc.setDbType(DbType.MYSQL);
		mpg.setDataSource(dsc);
		
		// 包配置
		PackageConfig pc = new PackageConfig();
		// 设置模块名
		pc.setModuleName("blog");
		// 父包名
		pc.setParent("com.tcc");
		// 子名
		pc.setEntity("entity");
		pc.setMapper("mapper");
		pc.setService("service");
		pc.setServiceImpl("serviceImpl");
		pc.setController("controller");
		mpg.setPackageInfo(pc);
		
		// 策略配置
		StrategyConfig strategy = new StrategyConfig();
		// ====设置要生成的表名====
		strategy.setInclude("tbl_account");
		// NamingStrategy:从数据库表到文件的命名策略 underline_to_camel:下划线转驼峰命名
		strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        // 是否为lombok模型(默认 false)
        strategy.setEntityLombokModel(false);
        // 逻辑删除属性名称
        strategy.setLogicDeleteFieldName("deleted");
        // 生成 <code>@RestController</code> 控制器
        strategy.setRestControllerStyle(true);
        
        // 自动填充
        TableFill createTime = new TableFill("create_time", FieldFill.INSERT);
        TableFill updateTime = new TableFill("update_time", FieldFill.INSERT_UPDATE);
        ArrayList<TableFill> list = new ArrayList<>();
        list.add(createTime);
        list.add(updateTime);
        // 表填充字段
        strategy.setTableFillList(list);
        
        // 乐观锁属性名称
        strategy.setVersionFieldName("versioin");
		
		mpg.setStrategy(strategy);
		
		// 代码自动生成器,执行
		mpg.execute();

	}

}

3、运行测试

2、新(3.5.1以上版本适用)

1、导入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>

2、编写代码

package com.tcc;

import java.util.Arrays;
import java.util.Collections;


import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.fill.Column;


// 代码自动生成器
public class MyAutoGenerator {

	public static void main(String[] args) {
		String url = "jdbc:mysql://localhost:3306/springbootdb?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8";
		String username = "root";
		String password = "admin";
		String projectPath = System.getProperty("user.dir");
		
		FastAutoGenerator.create(url, username, password)
		    .globalConfig(builder -> {
		        builder.author("宇辰") // 设置作者
		            //.enableSwagger() // 开启 swagger 模式
		            .fileOverride() // 覆盖已生成文件
		            .outputDir(projectPath + "/src/main/java") // 指定输出目录
		        	.disableOpenDir(); // 禁止打开输出目录
		    })
		    .packageConfig(builder -> {
		        builder.parent("com.tcc") // 设置父包名
		            .moduleName("blog") // 设置父包模块名
		            .entity("entity")
		            .mapper("mapper")
		            .xml("xml")
		            .service("service")
		            .serviceImpl("serviceImpl")
		            .controller("controller")
		            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, projectPath + "/src/main/resources/mapper")); // 设置mapperXml生成路径
		    })
		    .strategyConfig(builder -> {
		        builder.addInclude("user") // 设置需要生成的表名
		            .addTablePrefix("t_", "c_") // 设置过滤表前缀
		            .serviceBuilder() // service策略配置
		            .formatServiceFileName("%sService") // 格式化名称
		            .formatServiceImplFileName("%sServiceImpl")
		            .entityBuilder() // 实体类策略配置
		            //.enableLombok() // 开启lombok模型
		            .idType(IdType.ASSIGN_ID) // 默认id生成策略
		            //.enableTableFieldAnnotation()// 生成字段注解(在每个属性上添加@TableField注解)
		            .logicDeleteColumnName("deleted") // 逻辑删除
		            .addTableFills(Arrays.asList( // 自动填充
		            		new Column("create_time",FieldFill.INSERT),
		            		new Column("update_time",FieldFill.INSERT_UPDATE)))
		            .versionColumnName("version") // 乐观锁
		            .controllerBuilder() // 控制层策略
		            .enableRestStyle() // 开启@RestController注解
		            .formatFileName("%sController") // 格式化名称
		            .mapperBuilder() // mapper策略
		            .formatMapperFileName("%sMapper") // mapper格式化名称
		            .formatXmlFileName("%sMapper") // xml名
		            .enableMapperAnnotation() // 开启@Mapper注解
		            .superClass(BaseMapper.class); // 父类
		            
		    })
      //.templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
	    .execute();

	}

}

3、运行测试

最后

以上就是苹果毛衣为你收集整理的mybatis-plus的全部内容,希望文章能够帮你解决mybatis-plus所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(87)

评论列表共有 0 条评论

立即
投稿
返回
顶部