Mybatis-Plus

本文详细介绍了Mybatis-Plus的使用,包括快速入门、通用CRUD操作、配置、条件构造器、服务封装、代码生成器以及MybatisX插件。通过创建数据库、设置配置、编写POJO和Mapper接口,展示了Mybatis-Plus的插入、更新、删除和查询功能,同时讲解了SQL注入原理和代码生成器的使用,旨在提高开发效率。
摘要由CSDN通过智能技术生成

目录

1 、Mybatis-Plus简介

2 、快速入门

2.1、 创建数据库及表

2.2 工程搭建

2.2.1 创建springBoot工程

2.2.2 导入依赖

2.2.3 配置application.yml

2.2.4 启动类

2.2.4 编写pojo

2.2.5 编写mapper接口和配置文件

2.2.6 编写测试用例,加入junit的依赖,测试类不能使用Test类名,测试类的包目录和启动类的路径一致

3 通用CRUD

3.1插入操作

3.1.1、方法定义:

3.1.2、测试用例: 

3.1.4、@TableField

3.2、更新操作 

3.2.1、根据id更新

3.2.2、根据条件更新

3.3、删除操作 

3.3.1、deleteById

3.3.2、deleteByMap  

 3.3.3、delete

3.3.4、deleteBatchIds  

 3.4、查询操作

3.4.1、selectById单个查询

3.4.2、selectBatchIds  批量查询

3.4.3、selectOne  根据条件查询一条数据

3.4.4、selectCount  根据条件,查询总条数

 3.4.5、selectList 根据条件查询全部记录

 3.4.6、selectPage 根据条件查询全部并分页

 3.5、SQL注入的原理

4、配置

4.1、基本配置

4.1.1、confifigLocation

4.1.2、mapperLocations

4.1.3、typeAliasesPackage

4.2、进阶配置

4.2.1、mapUnderscoreToCamelCase 是否自动开启驼峰命名映射

4.3、DB 相关策略配置

4.3.1、idType

4.3.2、tablePrefifix

5、条件构造器

5.1、allEq

 5.2、基本比较操作

5.3、模糊查询  

 5.4、排序

 5.5、逻辑查询

5.6、select

5.7、lambda 

6、Mybatisplus的service的封装

6.1、com.baomidou.mybatisplus.extension.service.IService接口

6. 2、com.baomidou.mybatisplus.extension.service.impl.ServiceImpl类

6.3、测试用例

6.3.1、 自定义业务层接口,继承IService

6.3.2、自定义业务层实现类,继承ServiceImpl:

6.3.3、测试类:

7、代码生成器

7.1、 代码生成说明

7.2、 代码生成

7.2.1、导入依赖

7.2.2、代码生成是基于模板做的,这里采用的freemark模块来生成,把template文件夹放到resources  

7.2.3、编写生产代码的类CodeGenerator

7.2.4、生成代码

8、MybatisX 快速开发插件



1 、Mybatis-Plus简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。该框架由baomidou(苞米豆)组织开发并且开源的。官网:mybatis.plushttps://mp.baomidou.com/,码云地址:baomidou: 苞米豆,为提高生产率而生!

2 、快速入门

2.1、 创建数据库及表

 

-- 创建测试表
CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(20) NOT NULL COMMENT '密码',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

-- 插入测试数据
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('1', 'zhangsan', '123456', '张三', '18', 'test1@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('2', 'lisi', '123456', '李四', '20', 'test2@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('3', 'wangwu', '123456', '王五', '28', 'test3@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('4', 'zhaoliu', '123456', '赵六', '21', 'test4@chen.cn');
INSERT INTO `tb_user` (`id`, `user_name`, `password`, `name`, `age`, `email`) VALUES ('5', 'sunqi', '123456', '孙七', '24', 'test5@chen.cn');

2.2 工程搭建

2.2.1 创建springBoot工程

2.2.2 导入依赖

 <!-- 继承Spring boot工程 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--简化代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.1</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.1.2</version>
        </dependency>

    </dependencies>

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

 log4j.properties:

log4j.rootLogger=DEBUG,A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n

2.2.3 配置application.yml

spring:
  application:
    name: mybatisplusspringboot
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123
  # 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置
mybatis-plus:
  mapper-locations: classpath*:mybatis/*.xml
  # 设置别名包扫描路径,通过该属性可以给包中的类注册别名
  type-aliases-package: com.chen.mp.pojo

2.2.4 启动类

package com.chen;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author:CHENFAN
 * @Date:2021/12/1418:54
 */
@SpringBootApplication
@MapperScan(basePackages = "com.chen.mp.mapper")//用于扫描mapper接口文件
public class MpApplication {
    public static void main(String[] args) {
        System.out.println("ss");
        SpringApplication.run(MpApplication.class,args);
    }
}

2.2.4 编写pojo

package com.chen.mp.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @Author:CHENFAN
 * @Date:2021/12/1419:00
 */
@Data//使用lombok完成get和set
@TableName("tb_user")//对应数据库的表名
public class User {
    @TableId(value = "ID",type = IdType.AUTO)
    private Long id;
    @TableField("USER_NAME")//此属性名称和数据库中字段名称不符合,所以显示的映射
    private String userName;//此属性名称和数据库中字段名称相同,所以隐式的映射
    private String password;
    private String name;
    private Integer age;
    private String email;
}


2.2.5 编写mapper接口和配置文件

package com.chen.mp.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.chen.mp.pojo.User;
import org.apache.ibatis.annotations.Mapper;

/**
 * @Author:CHENFAN
 * @Date:2021/12/1419:11
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {
}

在resources目录下新建一个文件夹mybatis,专门存放mapper配置文件,用于扩展自定义的sql

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chen.mapper.UserMapper">

</mapper>

2.2.6 编写测试用例,加入junit的依赖,测试类不能使用Test类名,测试类的包目录和启动类的路径一致

package com.chen;



import com.chen.mp.mapper.UserMapper;
import com.chen.mp.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

/**
 * @Author:CHENFAN
 * @Date:2021/12/1419:07
 */
@RunWith(SpringRunner.class)//使用springrunner运行器
@SpringBootTest(classes = MpApplication.class)//启用springboot测试,加载Springboot配置文件
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;
    //查询所有
    @Test
    public void testSelectAll(){
        List<User> userList = userMapper.selectList(null);
        System.out.println(userList);
    }

    //查询一个
    @Test
    public void testSelectOne(){
        User user = userMapper.selectById(1);
        System.out.println(user);
    }

    //保存
    @Test
    public void testSave(){
        User user = new User();
        user.setUserName("xiaozhao");
        user.setAge(40);
        user.setPassword("xiaozhao");
        user.setName("小赵");
        user.setEmail("xiaozhao@email.com");
        userMapper.insert(user);
    }

    //修改
    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(1228242594492923909l);
        user.setName("老赵");
        userMapper.updateById(user);
    }

    //删除
    @Test
    public void testDelete(){
        int i = userMapper.deleteById(1228242594492923909l);
    }


}

3 通用CRUD

完成了demo的搭建,接下来查看我们继承的BaseMapper中的单表操作

3.1插入操作

3.1.1、方法定义:

3.1.2、测试用例: 

@Autowired private UserMapper userMapper; 
@Test 
public void testInsert(){ 
User user = new User(); 
user.setAge(20); 
user.setEmail("test@itcast.cn"); 
user.setName("曹操"); 
user.setUserName("caocao"); 
user.setPassword("123456"); 
//返回的result是受影响的行数,并不是自增后的id
int result = this.userMapper.insert(user);  
System.out.println("result = " + result); 
System.out.println(user.getId()); //自增后的id会回填到对象中

如何设置id的生成策略 ,MP支持的id策略(查看IdType类):

package com.baomidou.mybatisplus.annotation;

public enum IdType {
    /**
      * 数据库ID自增 
      */ 
    AUTO(0), 
    /**
      * 该类型为未设置主键类型 
      */ 
    NONE(1), 
    /**
      * 用户输入ID 
      * <p>该类型可以通过自己注册自动填充插件进行填充</p> 
      */ 
    INPUT(2), 
    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 
     */ 
    /**
      * 全局唯一ID (idWorker) 
      */ 
    ID_WORKER(3), 
    /**
      * 全局唯一ID (UUID) 
      */ 
    UUID(4),
    /**
      * 字符串全局唯一ID (idWorker 的字符串表示) 
      */ 
    ID_WORKER_STR(5);
   
    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

3.1.4、@TableField

 在MP中通过@TableField注解可以指定字段的一些属性,常常解决的问题有2个:

  1. 对象中的属性名和字段名不一致的问题(非驼峰)
  2. 对象中的属性字段在表中不存在的问题

3.2、更新操作 

 MP中,更新操作有2种,一种是根据id更新,另一种是根据条件更新。

3.2.1、根据id更新

方法定义:

 测试:

@Autowired 
private UserMapper userMapper; 
@Test 
public void testUpdateById() { 
User user = new User(); 
user.setId(6L); //主键 
user.setAge(21); //更新的字段 
//根据id更新,更新不为null的字段 
userMapper.updateById(user); }

3.2.2、根据条件更新

方法定义:

 测试:

第一种:通过QueryMapper对象

@Autowired private UserMapper userMapper; 
@Test 
public void testUpdate() {
User user = new User(); 
user.setAge(22); //更新的字段 
 
QueryWrapper<User> wrapper = new QueryWrapper<>(); 
//更新的条件
wrapper.eq("id", 6); 
//执行更新操作 
int result = this.userMapper.update(user, wrapper); 
System.out.println("result = " + result);

第二种: UpdateWrapper对象

@Test 
public void testUpdate() { 
//更新的条件以及字段 
UpdateWrapper<User> wrapper = new UpdateWrapper<>(); 
wrapper.eq("id", 6).set("age", 23); 
//执行更新操作 
int result = this.userMapper.update(null, wrapper); 
System.out.println("result = " + result); 
}

3.3、删除操作 

3.3.1deleteById

方法定义:

 测试用例:

@Autowired 
private UserMapper userMapper; 
@Test 
public void testDeleteById() { 
//执行删除操作 
int result = this.userMapper.deleteById(6L); 
System.out.println("result = " + result); 
}

3.3.2deleteByMap  

方法定义:

测试:

@Autowired 
private UserMapper userMapper; 
@Test 
public void testDeleteByMap() { 
Map<String, Object> columnMap = new HashMap<>(); 
columnMap.put("age",20); 
columnMap.put("name","张三"); 
//将columnMap中的元素设置为删除的条件,多个之间为and关系 
//执行的sql语句:DELETE FROM tb_user WHERE name = ? AND age = ?
int result = this.userMapper.deleteByMap(columnMap); 
System.out.println("result = " + result); 
}

 3.3.3delete

方法定义:

 测试:

@Test 
public void testDeleteByMap() { 
User user = new User(); 
user.setAge(20); 
user.setName("张
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值