跳至主要內容

MyBatis-Plus基础用法总结

Alooc...大约 7 分钟后端框架MyBatis-PlusMyBatis-Plus

MyBatis-Plus

1. 引入

	<properties>
        <java.version>1.8</java.version>
        <mp.version>3.5.1</mp.version>
        <freemarker.version>2.3.31</freemarker.version>
    </properties>	
<dependencies>
        <!--mybatis-plus启动器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mp.version}</version>
        </dependency>

        <!--lombok用于简化实体类开发-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--自动生成代码-->
         <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>${mp.version}</version>
            </dependency>
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>${freemarker.version}</version>
            </dependency>
    </dependencies>

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  global-config:
    db-config:
      table-prefix: t_
      id-type: assign_id 
  type-enums-package: com.atguigu.mybatisplus.enums # 枚举类

2. 基本CRUD

BaseMapepr

@Mapper
public interface UserMapper extends BaseMapper<User> {

    Page<User> selectPageVo(@Param("page") Page<User> page,@Param("age") Integer age);
}

IService

public interface UserService extends IService<User> {
}

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

}

3. 常用注解

1. @TableName

2. @TableId

3. @TableField

4. @TableLogic

4. 条件构造器和常用接口

  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
    • QueryWrapper : 查询条件封装
    • UpdateWrapper : Update 条件封装
    • AbstractLambdaWrapper : 使用Lambda 语法
      • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
      • LambdaUpdateWrapper : Lambda 更新封装Wrapper

5. 插件

1. 分页插件

1. 添加配置类

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return interceptor;
    }
}

2. 使用

    public void testPageVo() {
        Page<User> page = new Page<>(2,3);

        userMapper.selectPageVo(page,24);

        System.out.println(page.getRecords());
        System.out.println(page.getPages());
        System.out.println(page.getTotal());
        System.out.println(page.getCurrent());
        System.out.println(page.hasNext());
        System.out.println(page.hasPrevious());


    }

2. 乐观锁插件

1. 配置类同上

2. 使用

public void testProduct02() {
        //1、小李
        Product p1 = productMapper.selectById(1L);
        System.out.println("小李取出的价格:" + p1.getPrice());
        //2、小王
        Product p2 = productMapper.selectById(1L);
        System.out.println("小王取出的价格:" + p2.getPrice());

        //3、小李将价格加了50元,存入了数据库
        p1.setPrice(p1.getPrice() + 50);
        int result1 = productMapper.updateById(p1);
        System.out.println("小李修改结果:" + result1);
        //4、小王将商品减了30元,存入了数据库
        p2.setPrice(p2.getPrice() - 30);
        int result2 = productMapper.updateById(p2);

        if (result2 == 0) {
            p2 = productMapper.selectById(1L);
            p2.setPrice(p2.getPrice() - 30);
            result2 = productMapper.updateById(p2);
        }
        System.out.println("小王修改结果:" + result2);
        //最后的结果
        Product p3 = productMapper.selectById(1L);
        //价格覆盖,最后的结果:70
        System.out.println("最后的结果:" + p3.getPrice());

    }

6. 代码生成器

1. 引入依赖

        <!--自动生成代码-->
         	<dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>3.5.1</version>
            </dependency>
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.31</version>
            </dependency>

2. 配置生成器类的代码

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

import java.util.Collections;

/**
 * @author dongzhaohe
 * @version V1.0
 * @ClassName: FastAutoGeneratorTest
 * @Description:
 * @date 2022/4/22 12:09
 */
@SpringBootTest
public class FastAutoGeneratorTest {

    @Test
    public void test() {
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC", "root", "root")
                .globalConfig(builder -> {
                    builder.author("atguigu") // 设置作者
                            // .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("G://mybatis_plus_g"); // 指定输出目录
                        })
                .packageConfig(builder -> {
                    builder.parent("com.atguigu") // 设置父包名
                            .moduleName("mybatisplus") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "G://mybatis_plus_g"));// 设置mapperXml生成路径
                        })
                .strategyConfig(builder -> {
                    builder.addInclude("t_user") // 设置需要生成的表名
                            .addTablePrefix("t_", "c_"); // 设置过滤表前缀
                        })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker 引擎模板,默认的是Velocity引擎模板
                .execute();
    }
}

7. 多数据源

1. 引入依赖

<dependency>
	<groupId>com.baomidou</groupId>
	<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
	<version>3.5.0</version>
</dependency>

2. 配置多数据源

spring:
  # 配置数据源信息
  datasource:
    dynamic:
      # 设置默认的数据源或者数据源组,默认值即为master
      primary: master
      # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
      strict: false
      datasource:
        master:
          url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver
        slave_1:
          url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&userSSL=false&serverTimezone=UTC
          username: root
          password: root
          driver-class-name: com.mysql.cj.jdbc.Driver

3. 使用

@DS("slave_1")
@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}

参考

1.配置:
	pom
		<dependency>
		      <groupId>com.baomidou</groupId>
		      <artifactId>mybatis-plus-boot-starter</artifactId>
		      <version>3.4.0</version>
		</dependency>
		<dependency>
		      <groupId>org.projectlombok</groupId>
		      <artifactId>lombok</artifactId>
		</dependency>
	mapper

	mapperscan

2.MP注解:
	TableName    表名注解
	TableId	     主键注解
	TableField   字段注解
	Version      乐观锁注解
	EnumValue    枚举类注解
	TableLogic   表字段逻辑处理注解
	SqlParser    租户注解
	KeySequence  序列主键策略
3.代码生成器
	<dependency>
	    <groupId>com.baomidou</groupId>
	    <artifactId>mybatis-plus-generator</artifactId>
	    <version>3.4.0</version>
	</dependency>
	<dependency>
	    <groupId>org.apache.velocity</groupId>
	    <artifactId>velocity-engine-core</artifactId>
	    <version>2.2</version>
	</dependency>
4.CRUD接口
	Service CRUD接口:
			通用的Service CRUD 封装IService接口,进一步封装CRUD
		采用get查询单行、remove删除、list查询集合、page分页,前缀命
		名方式区分mapper层避免混淆
			泛型T为任意实体对象
			建议如果存在自定义通用Service方法的可能,请创建自己的
		IBaseService继承MP提供的基类
			对象Wrapper为条件构造器
	Mapper CRUD接口
			通用CRUD封装BaseMapper接口,为MP启动时自动解析实体表关系映射
		转换为Mybatis内部对象注入容器
			泛型T为任意实体对象
			参数Serializable为任意类型主键,MP不推荐使用符合主键约定每
		一张表都有自己的唯一ID主键
			对象Wrapper为条件构造器
5.条件构造器

--代码生成,CRUD操作

6.




MP视频学习:
1.通用Mapper
	新增Create
		新增方法 
		常用注解
			Data
			TableName("")
			TableId
			TableField
		排除非表字段
			关键字 transient 不能序列化
			@TableField(exist=false)
	
	查询Retrieve
		基本查询方法
			selectById
			selectBatchIds
			selectByMap
		以条件构造器为参数的查询方法
			QueryWrapper
				apply
				inSql
				nested
		select中字段不全出现的处理方法
		条件构造器中的condition的作用
		创建条件构造器时传入实体对象
		条件构造器中allEq用法
		其他以条件构造器为参数的查询方法
		Lambda条件构造器
		使用条件构造器的自定义sql
		Mybatis分页介绍
		MP分页插件实现物理分页
	更新Update:
		根据id更新
		以条件构造器作为参数的更新方法
		条件构造器中set方法使用
	删除Delete:
		根据id删除的方法
		其他普通删除方法
		以条件构造器为参数的删除方法
2.ActiveRecord模式:
	AR探索:【通过实体类对象直接进行表的增删改查操作】
		AR模式简介
		MP中AR模式的实现
3.主键策略:
	MP支持的主键策略介绍
	局部主键策略实现
	全局主键策略实现
4.MP配置
	基本配置
	进阶配置
	DB策略配置
5.通用Service:
	基本方法
	批量操作方法
	链式调用方法
进阶:
1.逻辑删除
	逻辑删除简介
		假删除
	逻辑删除实现
	查询中排除删除标识字段及注意事项
2.自动填充
	自动填充简介
	自动填充实现
	自动填充优化
		1.设置没有字段时不填充【一次管理多个表时使用】
		2.已经设值了就不自动填充
3.乐观锁插件
	简介:
		1.取出记录时,获取当前version
		2.更新时,带上这个version
		3.版本正确更新成功,错误更新失败
	功能实现:
		实现步骤
		注意事项
4.性能分析插件
	性能分析实现
	参数设置
	执行sql分析打印 p6spy
5.多租户
	多租户概念介绍
	多租户实现
	特定sql过滤
		1.自定义过滤器
		2.加注解 @SqlParser(filter = true)
6.动态表名SQL解析器
	动态表名的应用场景
	动态表名的实现
	注意事项
7.SQL注入器
	实现步骤:
		1.创建定义方法的类
		2.创建注入器
		3.在mapper中加入自定义方法
	选装件:	
		批量新增数据,自选字段insert
		根据id逻辑删除数据,并带字段填充功能
		根据id更新固定的某些字段

动态数据源:
	https://dynamic-datasource.github.io/dynamic-datasource-doc/guide/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95
	使用:
		1.引入dynamic-datasource-spring-boot-starter。
			<dependency>
			  <groupId>com.baomidou</groupId>
			  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
			  <version>${version}</version>
			</dependency>
		2.配置数据源
			可通过自定义从数据库中动态查询获取
		3.使用 @DS 切换数据源。
			DS中可以使用spEL
		
	

velocity

Velocity语法包括:变量Variables,注释,属性Properties,if条件语句,foreach循环语句,
逻辑运算符,Parse导入脚本,带参数的宏等。

# 关键字
$ 变量

语法:
	1.变量
		(1)变量定义
			#set($name = "velocity")
		(2)变量的使用
			${name}
			${names}
		(3)变量赋值
			弱数据类型
			#set($foo = ${bar})
	2.循环
		#foreach($element in $list)
			This is $element
			$velocityCount
		#end
	3.条件语句
		#if(condition)
		...
		#elseif(condition)
		...
		#else
		...
		#end
	4.关系操作符
		&&
		||
		!
	5.宏 可理解为函数定义
		#macro(macroName arg1 arg2 ...)
		...
		#end
		
		调用
		#macroName(arg1 arg2 ...)
		
		eg.
			#macro(sayHello $name)
				hello name
			#end

			#sayHello("velocity")
	6.#parse 和 #include
		解析
		放入
	

评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.5