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);