MybatisPlus 通用方法
insert()方法 中,没有设置该字段的值,在insert语句中就不会插入该字段值。
比如 User 对象有字段 id,name,age。user对象只设置了id、name没有设置age值,在insert语句中就不会插入age字段值
MybatisPlus 字段上的常用注解
-
@TableName("t_user")
一般实体类会和数据库表名一致,当不一致时使用 @TableName("数据库表名") 加在类上。
比如: 数据库表会在前面加上 t_ 。 t_user 。可是实体类中类名是 User。加上 @TableName("t_user")指定表名是 t_user
-
@TableId private Long user_id;
mybatisPlus 默认会找到 字段名是id的属性作为主键ID。当主键名称不是 id,可以在字段上加上 @TableId. 比如:数据库中主键字段名为id ,在user 中主键为 user_id .
-
@TableField(value = "inviterNo")
指定实体类中字段与数据库字段的关联。指定数据库中字段为 inviterNo
@TableField(value = "inviterNo")
private String inviterNo123;
排除非表字段的三种方式:
实体类中 有些用于做一些临时数据保存。字段在数据库中没有。 mp 会做自动映射,结果就是报错,在数据库中找不到该字段。那么把该字段排除就行了。新添一个数据库中没有的字段: note
private String note;
三种排除方式:
- transient
private transient String note;
transient 标明的字段不参与序列化。如果实体类要序列化就不能用。
2. static 标明静态变量 mp会忽略不加入sql语句中,但是静态的就变成类变量了,不可取
private static String note;
public static String getNote() {
return note;
}
public static void setNote(String note) {
User.note = note;
}
3. ☆ @TableField(exist = false) ☆推荐这种方式
@TableField(exist = false)
private String note;
exist 这个值默认是 true。标明这个字段是在数据库中存在的。反之 false 就是不存在
MybatisPlus 普通查询
普通查询中根据 map 查询的,selectByMap key值为 数据库中的字段,并非实体类字段名。user_real_name 是数据库字段名称
-
条件构造器
AbstractWrapper 条件构造器父类,一下都是继承AbstractWrapper 。 这里我们使用 QueryWrapper
两种创建 QueryWrapper 的方式:
一、查询需求
1、名字中包含雨并且年龄小于40。 name like '%雨%' and age<40
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.like("name","雨").lt("age",40);
List<User> list = userMapper.selectList(qw);
2、名字中包含雨年并且龄大于等于20且小于等于40并且email不为空
name like '%雨%' and age between 20 and 40 and email is not null
qw.like("name","雨").between("age",20,40).isNotNull("email")
3、名字为王姓或者年龄大于等于25,按照年龄降序排列,年龄相同按照id升序排列
name like '王%' or age>=25 order by age desc,id asc likeRight 表示 % 在右边
qw.likeRight("name","王").or().ge("age",25).orderByDesc("age").orderByAsc("id")
4、创建日期为2019年2月14日并且直属上级为名字为王姓
date_format(create_time,'%Y-%m-%d')='2019-02-14' and manager_id in (select id from user where name like '王%')
使用 数据库中的date_format 函数需要用到 queryWrapper.apply(); in 需要用到 insql()
qw.apply("date_format(create_time,'%Y-%m-%d') = {0}","2019-09-09").
inSql("manager_id","select id from user where name like '王%'");
5、名字为王姓并且(年龄小于40或邮箱不为空)
name like '王%' and (age<40 or email is not null)
qw.likeRight("name","王").and(wq->wq.lt("age",40).or().isNotNull("email"));
6、名字为王姓或者(年龄小于40并且年龄大于20并且邮箱不为空)
name like '王%' or (age<40 and age>20 and email is not null)
qw.likeRight("name","王").
or(wq->wq.lt("age",40).gt("age",20).isNotNull("email"));
7、(年龄小于40或邮箱不为空)并且名字为王姓
(age<40 or email is not null) and name like '王%'
qw.nested(wq->wq.lt("age",40).or().isNotNull("email")).
likeRight("name","王")
8、年龄为30、31、34、35
age in (30、31、34、35)
qw.in("age", Arrays.asList(30,31,34,35));
9、只返回满足条件的其中一条语句即可
limit 1 last() 有sql 注入风险,不建议使用
qw.in("age", Arrays.asList(30,31,34,35)).last("limit 1 ");
- Select不列出全部字段,只查询需要的字段
比如查询只想查询出 id ,name 两个字段 :
qw.select("id","name") ;
qw.select("id,order_no,stall_id,pay_way,create_time"); 这两种都可以
qw.select("id,order_no,stall_id,pay_way,create_time");
排除字段:排除掉不需要查询的字段: create_time,manager_id
qw.like("name", "雨").lt("age", 40)
.select(User.class,info -> !info.getColumn().equals("create_time")
&& !info.getColumn().equals("manager_id"));
- condition 作用
使用的方法有一个传递 condition 参数。 该条件是否加入生成的sql 中。单位 true 就会加入执行。为false就不加入该条件(不会加入到where语句中)
什么样的环境会用到:
比如传入多个参数来,我们肯定要进行非空校验。
String name = "";
qw.likeRight(StringUtils.isEmpty(name),"name","王");
StringUtils.isEmpty(name) 返回一个 boolean
- 实体类作为条件构造器构造方法的参数
实体类有值的字段会作为条件,为null的字段会忽略。传递的实体类会作为where后面的查询条件。并且和下面那条单独的 查询语句相互独立不影响。
编译后的查询语句两者条件都会有:
条件构造器中传递的实体类属性默认是 equal,就是 where 后的 =等于。如果想改成其他的,比如 like ,设置 @TableField:
如果这里没有我们需要的,也可以自定义。参考下他们写的。比如
小于:
"%s<#{%s}