【Mybatis Plus 入门学习笔记】

Mybatis Plus 笔记记录

1. 代码生成器使用

1.0 配置

server:
  port: 8088
spring:
  # 配置数据源信息
  datasource:
    # 配置连接数据库信息
    #本地地址:“127.0.0.1”
    #数据库名称:“db2”
    url: jdbc:mysql://127.0.0.1:3306/db2?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    #数据库账户
    username: root
    #数据库密码
    password: root
mybatis-plus:
  global-config:
    db-config:
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

1.1 引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <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>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.2 交互式生成


public class CodeGenerator {
    private static final String URL = "jdbc:mysql://localhost:3306/db2?serverTimezone=GMT%2b8";
    private static final String OUTPUT_DIR = "D:/Spring Code Compile Project/demo/src/main/java";
    private static final String MAPPER_XML_DIR = "D:/Spring Code Compile Project/demo/src/main/resources/mapper";

    public static void main(String[] args) {
        FastAutoGenerator.create(URL,"root","root")
                // 全局配置
                .globalConfig((scanner, builder) -> builder.author(scanner.apply("请输入作者名称?"))
                        //覆盖已生成文件默认为false
                        .fileOverride()
                        //指定输出目录
                        .outputDir(OUTPUT_DIR)
                        //开启 swagger 模式 默认为false

                )
                // 包配置
                .packageConfig((scanner, builder) -> builder.parent(scanner.apply("请输入包名?"))
                        //路径配置信息 Collections.singletonMap(OutputFile.mapperXml, "D://")
                        .pathInfo(Collections.singletonMap(OutputFile.mapperXml,MAPPER_XML_DIR))
                )
                // 策略配置
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                        //增加过滤表前缀
                        .addTablePrefix("tbl_")
                        //实体策略配置
                        .entityBuilder()
                        //开启链式模型    默认值:false
                        .enableChainModel()
                        //开启 lombok 模型    默认值:false
                        .enableLombok()
                        //开启生成实体时生成字段注解    默认值:false
                        .enableTableFieldAnnotation()
                        //添加表字段填充
                        .addTableFills()
                        .addTableFills(
                                new Column(
                                        "create_time", FieldFill.INSERT
                                )
                        )
                        //controller 策略配置
                        .controllerBuilder()
                        //开启驼峰转连字符    默认值:false
                        .enableHyphenStyle()
                        //开启生成@RestController 控制器    默认值:false
                        .enableRestStyle()
                        //格式化文件名称
                        .formatFileName("%sController")


                        //mapper 策略配置
                        .mapperBuilder()
                        //启用 BaseResultMap 生成    默认值:false
                        .enableBaseResultMap()
                        //格式化 mapper 文件名称
                        .formatMapperFileName("%sMapper")
                        //格式化 xml 实现类文件名称
                        .formatXmlFileName("%sMapper")

                        //service 策略配置
                        .serviceBuilder()
                        //格式化 service 接口文件名称
                        .formatServiceFileName("%sService")
                        //格式化 service 实现类文件名称
                        .formatServiceImplFileName("%sServiceImpl")
                        .build()
                )
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();


    }

    /**
     * 处理所有表的情况
     * @param tables
     * @return 
     */
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}


2. BaseMapper方法使用

数据库环境准备

数据库:
CREATE TABLE `user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  `date_` timestamp NULL DEFAULT NULL COMMENT '出生时间',
  `istop` tinyint(4) DEFAULT NULL COMMENT '是否置顶',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1682271009801224197 DEFAULT CHARSET=utf8;
实体类:

@Data
@Accessors(chain = true)
@TableName("user")
public class User extends Model implements Serializable {

    private static final long serialVersionUID = 1L;
    /**
     * 主键ID
     */
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;

    /**
     * 姓名
     */
    @TableField("name")
    private String name;

    /**
     * 年龄
     */
    @TableField("age")
    private Integer age;

    /**
     * 邮箱
     */
    @TableField("email")
    private String email;

    /**
     * 出生时间
     */
    @TableField("date_")
    private Date date;

    /**
     * 是否置顶
     */
    @TableField("istop")
    private Integer istop;

    /**
     * 字段排除
     */
    @TableField(exist = false)
    private String game;


}
Mapper:
public interface UserMapper extends BaseMapper<User> {

    List<User> select(Integer pageIndex,Integer pageSize);
}


在这里插入图片描述

2.1 insert 实体类插入

插入语句 需要对应实体类

 User user = new User();
        user.setName("刘佩切");
        user.setAge(88);
        user.setDate(new Date());
        user.setGame("lol");
        int insert = userMapper.insert(user);
        System.out.println(insert);

在这里插入图片描述

2.2 deleteById 根据id删除

     int i = userMapper.deleteById(1682271009801224197L);
        System.out.println(i);

2.3 deleteById 根据id删除 参数为实体类

     int i = userMapper.deleteById(new User().setId(1682271009801224194L));
        System.out.println(i);

2.4 deleteByMap 参数为Map

 Map<String, Object> map = new HashMap<>();
        map.put("name","xiaolong");
        map.put("age","19");
        int i = userMapper.deleteByMap(map);
        System.out.println(i);

2.5 delete 根据条件构造器使用

QueryWrapper<User> query = Wrappers.query();
        query.eq("name","ez");
        int delete = userMapper.delete(query);
        System.out.println(delete);

2.6 deleteBatchIds 根据id批量删除

      List<Long> list = Arrays.asList(1682270752224821250l, 1682270797389086721L);
        int i = userMapper.deleteBatchIds(list);
        System.out.println(i);

2.7 updateById 根据id更新 参数为实体类对象

int i = userMapper.updateById(new User().setId(3l).setName("JIAKESI"));
        System.out.println(i);

2.8 update 使用条件构造器 参数为实体类和 条件构造器对象

    QueryWrapper<User> query = Wrappers.query();
        query.eq("name","张飞");
        int update = userMapper.update(new User().setId(1682270611774357505L), query);
        System.out.println(update);
     可以不传user实体类:
             UpdateWrapper<User> updateWrapper=new UpdateWrapper<>();
        updateWrapper.eq("name","Jone").set("age",88);
        int update = userMapper.update(null, updateWrapper);
        System.out.println(update);

2.9 selectById 根据单个id查询

  User user = userMapper.selectById(4L);
        System.out.println(user);

2.10 selectBatchIds 根据批量id查询

  List<Integer> list = Arrays.asList(1, 2, 3, 4);
        List<User> list1 = userMapper.selectBatchIds(list);
        list1.forEach(item-> System.out.println());

2.11 selectByMap 根据Map对应的key value拼接where条件查询

     Map<String,Object>  map =new HashMap();
        map.put("name","Jack");
        map.put("age","19");
        List<User> list = userMapper.selectByMap(map);
        list.forEach(e-> System.out.println());

2.12 selectOne 使用条件构造器

        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        QueryWrapper<User > query = Wrappers.query();
        queryWrapper.apply(true,"name Like BINARY  '%J%' ").eq("age",18);
        User user = userMapper.selectOne(queryWrapper);
        System.out.println(user);

2.13 exists 使用条件构造器 判断是否存在记录

 QueryWrapper<User> query = Wrappers.query();
        query.eq("id",1682270611774357505L);
        boolean update = userMapper.exists(query);
        System.out.println(update);

2.14 selectCount 使用条件构造器 查询总记录数

QueryWrapper<User> query = Wrappers.query();
        query.like("name","j");
        Long update = userMapper.selectCount(query);
        System.out.println(update);

2.15 selectList 使用条件构造器 查询多条记录

        /**
         * 名字中包含J并且年龄小于21的
         */
        /**
         * 两种构造形式
         */
        QueryWrapper<User> queryWrapper=new QueryWrapper<>();
        QueryWrapper<User > query = Wrappers.query();
        queryWrapper.apply(true,"name Like BINARY  '%J%' ").lt("age",21);
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(e-> System.out.println());

在这里插入图片描述

在这里插入图片描述

2.16 selectMaps 使用条件构造器 查询你需要的字段,根据你的条件构造器传入来确定配合select使用

QueryWrapper<User> query = Wrappers.query();
        query.like("name","j");
        List<Map<String, Object>> userMaps = userMapper.selectMaps(query);
        for (Map<String, Object> userMap : userMaps) {
            for (Map.Entry<String, Object> entry : userMap.entrySet()) {
                String columnName = entry.getKey();
                Object columnValue = entry.getValue();
                System.out.println(columnName + ": " + columnValue);
            }
        }

2.17 selectObjs 使用条件构造器 只返回查询条件的第一个字段的值

  QueryWrapper<User> query = Wrappers.query();
        query.like("name","j");
        List<Object> objects = userMapper.selectObjs(query);
        for (Object obj : objects) {
            // 使用 obj 进行进一步的类型转换和处理
            Long userId = (Long) obj;  // 假设 obj 是 Long 类型
            System.out.println("User ID: " + userId);
            // 进一步处理...
        }

在这里插入图片描述

2.18 selectPage 使用条件构造器 查询分页记录

        QueryWrapper<User> query = Wrappers.query();
        Page<User> userPage = userMapper.selectPage(new Page<>(2, 2), query);
        System.out.println(userPage.getRecords());
        System.out.println(userPage.getTotal());

2.19 selectMapsPage 使用条件构造器

QueryWrapper<User> query = Wrappers.query();
        Page<Map<String, Object>> mapPage = userMapper.selectMapsPage(new Page<>(1, 2), query);
        List<Map<String, Object>> records = mapPage.getRecords();
        for (Map<String, Object> record : records) {
            for (Map.Entry<String, Object> entry  : record.entrySet()) {
                String columnName = entry.getKey();
                Object columnValue = entry.getValue();
                System.out.println(columnName + ": " + columnValue);
            }
        }

3. 条件选择器使用

nested 嵌套使用

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.nested(i->i.gt("age",40).or().isNotNull("email")).likeRight("name","j");
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);

select 排除 不需要展示的字段or需要展示字段

       QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("age",Arrays.asList(13,18,16,17,28)).last("limit 1")
                .select(User.class,info->!info.getColumn().equals("age")&&!info.getColumn().equals("name"));
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);

condition作用 是否拼接语句的条件

     QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        String name="J";
        queryWrapper.likeRight(ObjectUtils.isNotEmpty(name),"name",name);
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);

在这里插入图片描述
在这里插入图片描述

实体作为 条件构造器构造方法的参数

        User user=new User().setName("Jone").setAge(18);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);

Alleq 用法

        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();
        map.put("name", "Jone");
        map.put("age", 18);
        queryWrapper.allEq(map);
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);
  /**
         * 过滤掉name的参数
         */
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();
        map.put("name", "Jone");
        map.put("age", 18);
        queryWrapper.allEq((k,v)->!k.equals("name"),map);
        List<User> list = userMapper.selectList(queryWrapper);
        list.forEach(System.out::println);

group by 使用

在这里插入图片描述

4. lambda条件构造器使用 好处:防误写 写错数据库字段列

        /**
         * 创建Lambda构造器的几种方式
         */
        //直接new
//        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        //QueryWrapper.lambda
//        LambdaQueryWrapper<User> userQueryWrapper=new QueryWrapper<User>().lambda();
        //Wrappers工具类
        LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
        query.likeRight(User::getName,"j").gt(User::getAge,18);
        List<User> list = userMapper.selectList(query);
        list.forEach(System.out::println);

LambdaQueryChainWrapper

 List<User> userList = new LambdaQueryChainWrapper<User>(userMapper).likeRight(User::getName, "j")
                .gt(User::getAge, 18).list();

        userList.forEach(System.out::println);

5. 自定义sql及分页查询

5.1 自定义sql

public interface UserMapper extends BaseMapper<User> {
    @Select("select * from user ${ew.customSqlSegment}")
    List<User> selectAll(@Param(Constants.WRAPPER)Wrapper<User> wrapper);
}

 LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
        query.likeRight(User::getName,"j").gt(User::getAge,18);

        List<User> userList = userMapper.selectAll(query);
        userList.forEach(System.out::println);

在这里插入图片描述

5.2 分页查询

selectPage
LambdaQueryWrapper<User> query = Wrappers.lambdaQuery();
        //第三个参数传递false则 不会执行 select count(1) from table 查询总记录数的语句
        Page<User> page = new Page<>(2, 2,false);

        IPage<User> userPage = userMapper.selectPage(page, query);
        System.out.println("总页数 =="+userPage.getPages());
        System.out.println("总记录数 =="+userPage.getTotal());
        userPage.getRecords().forEach(System.out::println);
selectMapsPage

6. AR模式、主键策略和基本配置

在这里插入图片描述

 User user=new User();
        user.setName("孙悟空");
        user.setAge(999);
        boolean insert = user.insert();
        System.out.println(insert);

7. 通用Service 提供的方法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青北念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值