MyBatis Plus基础教程大全

时间:2025-03-10 09:37:59

id主键, mp默认对应的是雪花数字的字符串类型

mp字段默认的是驼峰

@TableName

指定表名和实体类名的关系(当表名为 xxx_user, 实体类的名为 user),这时在实体类上使用注解@TableName("xxx_user") 指定表和实体类的对应关系

 @TableId

指定主键与id的映射:当插入数据库时,mp的默认主键名为id,如果想换个主键名例如叫user_id,这时在实体类中主键的属性上使用@TableId注解,指定id主键

@TableField

指定字段与属性的映射:数据库表中有字段名为name,实体类中对应的属性为username,这时在实体类中的属性上使用注解@TableField("name"),指定两者之间的映射关系

 排除实体类中的临时字段

方式一:给属性加上 transient 关键字,表明此属性不参与对象序列化。示例:private transient String name;

方式二:给属性加上 static关键字,表明此属性是所属对象的唯一。示例:private static String name;

方式三(推荐):在属性上使用注解@TableField(exist = false),表明这个属性是额外扩展的

根据一个id查询一个对象

// sql为: where id = 123

Object obj = (123);

根据多个id查询对象list

// sql为: where id in (idList)

List<Object> objList = (idList);

根据条件查询一个对象

// sql为: where id = 123

QueryWrapper<Object> wrapper = new QueryWrapper<>();

("id", 123);//字段的方式

().eq(, 123);//lambda表达式的方式

Object obj = (wrapper);

根据条件查询对象list

// sql为: where name = 'zs'

QueryWrapper<Object> wrapper = new QueryWrapper<>();

("name", zs);//字段的方式

().eq(, zs);//lambda表达式的方式

List<Object> objList = (wrapper);

根据map查询对象list

// sql为: where name = 'zs' and sex = 1

Map<String, Object> map = new HashMap<>();

("name", "zs");// name为数据库表中的字段名, 不是实体类中的属性名

("sex", 1);

List<Object> objList = (map);

v 3.4.3 版本新增 ActiveRecord 模式,更加强大的 CRUD 操作

// 实体类,继承 Model

public class User extends Model<User> {

        private Long id;

}

// 插入  // 更多crud请查看Model类中提供的方法

boolean b = new User().setId(1L).insert();

条件构造器

QueryWrapper

QueryWrapper的两种创建方式:

1: QueryWrapper<User> queryWrapper= new QueryWrapper<>();

2: QueryWrapper<User> queryWrapper= Wrappers.<User>query();

like

// sql为: where 字段 like '%值%'

("字段", 值); //lambda表达式的方式: ().like(类名.get属性, 值)

// sql为: where 字段 like '值%'

("字段", 值);

// sql为: where 字段 like '%值'

("字段", 值);

=

("字段", 值);

<

("字段", 值);

>

("字段", 值);

between 20 and 30   // 小于等于并且大于等于

("age", 20, 30);

字段 is not null

("name");

and

("字段1", 值1).eq("字段2", "值2");

or

("字段1", "值1").or().eq("字段2", "值2");

in

("字段", objList);

order by 字段 asc

("字段");

order by 字段 desc

("字段");

limit 1

("limit 1"); // 查询集合中返回第一条, last在条件最后使用

date_format(time, '%Y-%m-d')

// sql为: where date_format(create_time, '%Y-%m-%d') = '2020-06-13'   // %Y-%m-%d %H:%M:%S

("date_format(create_time, '%Y-%m-%d') = {0}", "2020-06-13");

where user_id in (子查询语句)

("user_id", "子查询语句")

where name like '%zs%' and ( age < 30 or phone is not null)

("name", "zs").and(wq -> ("age", 30).or().isNotNull("phone"));

where name like '%zs%' or (age > 20 and age < 40 and phone is not null)

("name", "zs").or(wq -> ("age", 40).gt("age", 20).isNotNull("phone"));

where (age < 40 or phone is not null) and name like '%zs%'

(wq -> ("age", 40).or().isNotNull("phone")).like("name", "zs");

条件构造器

 UpdateWrapper

// 创建条件构造器

UpdateWrapper<User> updateWrapper= new UpdateWrapper<>();

根据id更新

User user = new User();

(123); // where条件

("张三"); // set

(user);

根据字段更新

方式一:

// where 条件

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();

("name", "张三");

// set

User user = new User();

(18);

(user, updateWrapper);

方式二:

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();

("name", "张三").set("age", 18);

(null, updateWrapper);

// sql语句为:update user set age = 18 where name = '张三'

只查询指定字段、不查询指定字段

只查询指定字段

("id", "name");

不查询指定字段

// 不查询 user表中的 password和phone字段

(, info -> !().equals("password") && !().equals("phone"));

condition

条件不为空时sql带上查询条件,条件为空时sql不带查询条件

((nickName), "nick_name", nickName);

实体类做为条件构造器的查询条件

// sql为: where name = 'zs'

User user = new User();

("zs");

QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);

// sql为: where name like '%zs%'

在实体对象的name属性上加上 @TableField(condition = ) 注解

使用函数(最大值、最小值、平均值等)

("avg(字段) 别名","min(字段) 别名", "max(字段) 别名");

只查询表中的首列,其他列舍弃

("字段");

List<Object> list = (queryWrapper);

 lambda

//查询

//创建lambda的三种方式

LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();

LambdaQueryWrapper<User> lambda = new LambdaQueryWrapper<>();

LambdaQueryWrapper<User> lambda = Wrappers.<User>lambdaQuery();

(User::getId, "123");

// 更新

LambdaUpdateWrapper<User> updateWrapper = ();

(User::getId, 123).set(User::getAge, 18);

(null, updateWrapper);

链式调用lambda

List<User> list = new LambdaQueryChainWrapper<User>(userMapper).eq(User::getId, "123").ge(User::getSex, 18).list();

IPage<User> list = new LambdaQueryChainWrapper<>(userMapper).eq(User::getId, "123").ge(User::getAge, 18).page(page); // 分页

boolean res = new LambdaUpdateChainWrapper<User>(userMapper).eq(User::getId, 123).set(User::getAge, 18).update(); // 更新,返回是否更新成功

自定义sql语句(一般用于多表查询)

//在mapper接口类中定义接口方法()

List<User> selectAll(@Param() Wrapper<User> wrapper);

//sql语句()

<select resultType="">

         select * from user ${}

</select>

//使用

List<User> list = (wrapper);

分页

// 使用mybatis plus需要先配置分页插件,配置如下:(物理分页)

@Configuration
public class MybatisPlusConfig {
   	@Bean
	public MybatisPlusInterceptor proMybatisPlusInterceptor() {
		MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        /*
		 * 分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
		 */
		(new PaginationInnerInterceptor());

		return interceptor;
	}
}

// 使用分页

Page<User> page = new Page<>(1, 10); // Page<User> page = new Page<>(1, 10, false); 不查询总记录数

Wrapper<User> queryWrapper = new QueryWrapper<>();

("id", "123");

IPage<User> list= (page, queryWrapper);

(); //总页数

(); //总记录数

(); //数据

自定义分页sql语句 Join的方式(一般用于多表查询)

//在mapper接口类中定义接口方法()

IPage<User> selectUserPage(Page<User> page, @Param() Wrapper<User> wrapper)

//sql语句()

<select resultType="">

         select u.*, i.* from user u left join info i on = i.u_id ${}

</select>

//使用

Page<User> page = new Page<>(1, 10);

Wrapper<User> queryWrapper = new QueryWrapper<>();

("", "123");

IPage<User> list = (page, wrapper);

自定义分页sql语句 ,逗号的方式

//在mapper接口类中定义接口方法()

IPage<User> selectUserPage(Page<User> page, @Param() Wrapper<User> wrapper)

//sql语句()

<select resultType="">

        select

                # 这里也可以使用 

                # ${}

                u.*, i.*         

        from

                user u,

                info i  

        ${}

</select>

//使用

Page<User> page = new Page<>(1, 10);

Wrapper<User> queryWrapper = new QueryWrapper<>();

queryWrapper

        // 使用  ${}的方式     

        //.select("u.*", "i.*")

        .apply(" = i.u_id")

        .eq("", "123");

IPage<User> list = (page, wrapper);