Back

Mybatis Plus入门学习-1

mp的基础使用,curd、iservice 和条件构造器

Mybatis Plus -1

写在前面:

介绍了mp的基础使用方法,看完即可简化mybatis的开发,实现一些初学阶段的curd

对于复杂情况的curd,可以对官网进行查阅,不断进行积累经验。

https://baomidou.com/getting-started/

一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生

支持任何能使用 Mybatis 进行 CRUD, 并且支持标准 SQL 的数据库。

官网:https://baomidou.com/

简单来说:就是简化mybatis的开发,内置了一些sql,不用每个CURD都手写。

入门案例

BaseMapper是MyBatis-Plus提供的模板mapper。

我们创建操作对应数据库的mapper 后,继承BaseMapper 即可。

1
2
@Mapper
public interface UserMapper extends BaseMapper<User>{}

记得添加 @Mapper 或在启动类添加 @MapperScan 指定对应的mapper,使其交给IOC容器管理。

测试:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
@SpringBootTest
class MybatisPlusDemoApplicationTests {
 	
    // 自动从IOC容器中装载对应的对象
    @Autowired
    private UserMapper userMapper;
 
    @Test
    public void testSelectList(){
        //UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
        //所以不填写就是无任何条件
        List<User> users = userMapper.selectList(null);
        users.forEach(user -> System.out.println(user));
    }
}

tips: 开启日志输出,输出在控制台。 方便检查sql 的执行情况以及找出错误。

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

基本的CURD

最基础的增删改查,在baseMapper中均已定义,可以直接使用。

insert

没什么好说的,传入一个实体类就会插入。返回受影响的行数。

1
int rangs = userMapper.insert(user);

值得一说的是:其id 策略默认是 基于雪花算法生成的。(可以在实体类中通过注解修改,或进行配置)

delete

  • deleteById
  • deleteBatchIds
  • deleteByMap 可以为删除设置条件。

Update

updateById 需要传入一个有id值的实体类对象。

Select

  • selectById
  • selectBatchIds
  • selectByMap
  • selectList 查询所有信息

BaseMapper中大多方法中都有Wrapper类型的形参,此为条件构造器

可针对于SQL语句设置不同的条件,若没有条件赋值null,即查询(删除/修改)所有数据

自定义功能

是对mybatis的增强,因此也可以自定义sql语句,创建对应的映射文件。

  1. 同包同名 resource下
  2. namspace属性 — mapper的全类名
  3. id属性 — 方法名

通用service - iservice

image-20241209185610595
image-20241209185610595

service 接口继承 iservice

1
public interface UserService extends iservice<User>{}

service接口

1
2
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

就可以使用内置的方法了。见官网

常用注解:

@tableName 解决实体类名和数据库表名不同。 也可以通过全局配置解决

@tableId: 解决属性名和数据库表id名不同。

如果表中的id名不为id 需用 value属性进行指定。type属性,指定主键策略。

  • dType.ASSIGN_ID(默认):基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
  • IdType.AUTO:使用数据库的自增策略,要确保数据库设置了id自增, 否则无效

也可以全局配置:

1
2
# 配置MyBatis-Plus的主键策略
mybatis-plus.global-config.db-config.id-type=auto

@tableField: 解决属性名和列名不同。

实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格

如实体类属性userName,表中字段user_name

此时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格,相当于在MyBatis中配置

如果是单纯的不一样,则需要通过该注解指定。

@TableLogic : 逻辑删除

表中有字段 is_delete, 如果执行了 delete 操作,就会将字段转化为0,而不是真的删除。

(例如回收站,可以恢复数据)

条件构造器和通用接口

字面意思:构造CURD的条件,搭配baseMapper 中的方法进行使用。

wrapper

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

使用

1
2
3
4
5
6
7
// 1 创建一个 wrapper 对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 2 条件构造
queryWrapper.like("name","a")
    .gt("age",20);
// 3 作为参数传递
userMapper.update(user,queryWrapper);

具体的可以参考官网: https://baomidou.com/guides/wrapper/

也就是构造自己想要的条件,需要什么去官网找(或者在idea中看源码)。用多了自然就会了。


Condition:

在开发过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果。

思路1: 可以用 if 语句进行判断。但是太冗余了。

思路2:使用带condition参数的重载方法构建查 询条件,简化代码的编写。

1
queryWrapper.like(StringUtils.isBlank(username),"name","a");

通过Lambda访问实体类属性对应的字段,避免使用字符串表示字段,防止运行时错误

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//组装set子句
//将用户名中包含有a并且(年龄小于24或邮箱为null)的用户信息修改
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper
        //Lambda表达式设置操作字段
        .set(User::getAge, 18)
        .set(User::getEmail, "user@test11.com")
        .like(User::getName, "a")
        //lambda表达式内的逻辑优先运算
        .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail));
User user = new User();
int result = userMapper.update(user, updateWrapper);
        
   

还可以对分页插件、乐观锁等插件、通用枚举、代码生成器、多数据源和MybatisX 进行学习.

author: rose
Built with Hugo
Theme Stack designed by Jimmy
© Licensed Under CC BY-NC-SA 4.0