Mybatis-Plus基础入门知识详细讲解-mybatisplus极速入门版

简介: 简介MyBatis-Plus(简称MP )是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

简介

MyBatis-Plus(简称MP )是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

28a34ac352024eef9ee258085fe6bc43.png

从这张图中我们可以看出MP旨在成为MyBatis的最好搭档,而不是替换MyBatis,所以可以理解为MP是MyBatis的一套增强工具,它是在MyBatis的基础上进行开发的,我们虽然使用MP但是底层依然是MyBatis的东西,也就是说我们也可以在MP中写MyBatis的内容。

标准数据层开发

1.标准CRUD使用

对于标准的CRUD功能MP提供了这些方法可以使用。

image.png创建一个user实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
}

创建一个userdao接口

@Mapper
public interface UserDao extends BaseMapper<User> {
}

在测试类中测试

SpringBootTest
class MybatisplusApplicationTests {
    @Autowired
    private UserDao userDao;
//新增
    @Test
    void testsave() {
        User user=new User();
        user.setName("zhang");
        user.setPassword("111");
        user.setAge(11);
        user.setTel("1112");
        userDao.insert(user);
    }
    //删除
@Test
    void testdelete(){
        userDao.deleteById(1645347976381272065L);
}
//修改
@Test
    public void testupdate(){
        User user=new User();
        user.setId(1L);
        user.setName("lisi");
        userDao.updateById(user);
}
//查询
@Test
    public void testGetAll(){
    List<User> userList= userDao.selectList(null);
    System.out.println(userList);
}


分页功能

分页查询使用的方法是:

 IPage<T> selectPage(IPage<T> page, Wrapper<T> queryWrapper)

IPage:用来构建分页查询条件

Wrapper:用来构建条件查询的条件,目前我们没有可直接传为Null

IPage:返回值,你会发现构建分页条件和方法的返回值都是IPage

IPage是一个接口,我们需要找到它的实现类来构建它,具体的实现类,可以进入到IPage类中按ctrl+h,会找到其有一个实现类为Page。

调用方法传入参数获取返回值

@SpringBootTest
class Mybatisplus01QuickstartApplicationTests {
@Autowired
private UserDao userDao;
//分页查询
@Test
void testSelectPage(){
//1 创建IPage分页对象,设置分页参数,1为当前页码,3为每页显示的记录数
IPage<User> page=new Page<>(1,3);
//2 执行分页查询
userDao.selectPage(page,null);
//3 获取分页结果
System.out.println("当前页码值:"+page.getCurrent());
System.out.println("每页显示数:"+page.getSize());
System.out.println("一共多少页:"+page.getPages());
System.out.println("一共多少条数据:"+page.getTotal());
System.out.println("数据:"+page.getRecords());
}
}

设置分页拦截器

@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
//1 创建MybatisPlusInterceptor拦截器对象
MybatisPlusInterceptor mpInterceptor=new MybatisPlusInterceptor();
//2 添加分页拦截器
mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return mpInterceptor;
}
}

如果想查看MP执行的SQL语句,可以修改application.yml配置文件

mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印SQL日志到控制台

DQL编程控制

1.条件查询方式

需求:查询数据库表中,年龄在10岁到30岁之间的用户信息

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetAll(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(User::getAge, 30);
lqw.gt(User::getAge, 10);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
}

gt:大于(>),最终的SQL语句为

SELECT id,name,password,age,tel FROM user WHERE (age < ? AND age > ?)

需求:查询数据库表中,年龄小于10或年龄大于30的数据

lqw.lt(User::getAge, 10).or().gt(User::getAge, 30);

or()就相当于我们sql语句中的or关键字,不加默认是and,最终的sql语句为:

 SELECT id,name,password,age,tel FROM user WHERE (age < ? OR age > ?)

null的判断

private UserDao userDao;
@Test
void testGetAll(){
//模拟页面传递过来的查询数据
UserQuery uq = new UserQuery();
uq.setAge(10);
uq.setAge2(30);
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.lt(null!=uq.getAge2(),User::getAge, uq.getAge2());
lqw.gt(null!=uq.getAge(),User::getAge, uq.getAge());
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
}

3883139400804f23a502101333ad759c.png

2.查询投影

@SpringBootTest
class Mybatisplus02DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testGetAll(){
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
lqw.select(User::getId,User::getName,User::getAge);
List<User> userList = userDao.selectList(lqw);
System.out.println(userList);
}
}

3.查询条件设定

聚合函数查询:

count:总记录数

max:最大值

min:最小值

avg:平均值

sum:求和

范围匹配(> 、 = 、between)

模糊匹配(like)

空判定(null)

包含性匹配(in)

分组(group)

排序(order)

gt():大于(>)

ge():大于等于(>=)

lt():小于(<)

lte():小于等于(<=)

between():between ? and ?

like():前后加百分号,如 %J%

likeLeft():前面加百分号,如 %J

likeRight():后面加百分号,如 J%

4.字段映射与表名映射


5e6b808ff9a448fb9b43ee2934be465f.png

5e6b808ff9a448fb9b43ee2934be465f.png


ad8563c1b6614d48b6dd161ab2736f00.png



image.png

ID生成策略对比

介绍了这些主键ID的生成策略,我们以后该用哪个呢?

NONE: 不设置id生成策略,MP不自动生成,约等于INPUT,所以这两种方式都需要用户手动设

置,但是手动设置第一个问题是容易出现相同的ID造成主键冲突,为了保证主键不冲突就需要做很

多判定,实现起来比较复杂

AUTO:数据库ID自增,这种策略适合在数据库服务器只有1台的情况下使用,不可作为分布式ID使用

ASSIGN_UUID:可以在分布式的情况下使用,而且能够保证唯一,但是生成的主键是32位的字符

串,长度过长占用空间而且还不能排序,查询性能也慢

ASSIGN_ID:可以在分布式的情况下使用,生成的是Long类型的数字,可以排序性能也高,但是

生成的策略和服务器时间有关,如果修改了系统时间就有可能导致出现重复主键

综上所述,每一种主键策略都有自己的优缺点,根据自己项目业务的实际情况来选择使用才是最明

智的选择。

多记录操作

根据传入的id集合将数据库表中的数据删除掉(删除(根据ID 批量删除),参数是一个集合,可以存放多个id值。)。

@SpringBootTest
class Mybatisplus03DqlApplicationTests {
@Autowired
private UserDao userDao;
@Test
void testDelete(){
//删除指定多条数据
List<Long> list = new ArrayList<>();
list.add(1402551342481838081L);
list.add(1402553134049501186L);
list.add(1402553619611430913L);
userDao.deleteBatchIds(list);
}
}

逻辑删除

逻辑删除的本质其实是修改操作。如果加了逻辑删除字段,查询数据时也会自动带上逻辑删除字段。

执行的SQL语句为:UPDATE tbl_user SET deleted=1 where id = ? AND deleted=0

dd93f29e7bff4f5ab4b161eac9fa374e.png

美好的一天到此结束,下次继续努力!

相关文章
|
3月前
|
关系型数据库 Java 数据库连接
MyBatis-Plus简介和入门操作
【1月更文挑战第5天】 一、MyBatis-Plus简介 二、 MyBatis-Plus操作 1、准备数据库脚本 2、准备boot工程 3、导入依赖 4、配置文件和启动类 5、功能编码 6、测试和使用
105 1
|
5月前
|
SQL Java 数据库连接
Mybatis入门简介
Mybatis入门简介
56 0
|
3月前
|
SQL Java 数据库连接
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
90 0
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
|
1月前
|
Java 数据库连接 mybatis
|
2月前
|
XML Java 数据库连接
MyBatis入门配置
【2月更文挑战第9天】
MyBatis入门配置
|
3月前
|
Java 数据库连接 API
MyBatis入门操作
MyBatis入门操作
11 0
|
3月前
|
Java 数据库连接 测试技术
【MyBatis】操作数据库——入门
【MyBatis】操作数据库——入门
|
3月前
|
SQL Java 关系型数据库
一文彻底搞懂Mybatis系列(一)之mybatis入门
一文彻底搞懂Mybatis系列(一)之mybatis入门
|
4月前
|
SQL Java 数据库连接
MyBatis Plus 入门
MyBatis Plus 入门
50 0
|
4月前
|
SQL Java 数据库连接