MybatisPlus 基本运用

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;

三种排除方式:

  1. 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&lt;#{%s}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值