实现逻辑查询:
1)and:其实如果只是想实现and查询,只是需要连续调用对应的方法或者是通过wrapper对象实现两次调用即可
2)and的嵌套:假设现在有这样一条语句
select * from user where username="张三" and (age>26 or userID <19),这条SQL语句实际上在执行的时候会先执行括号内的语句,那么这就出现了and的嵌套情况,通过mybatis-plus下面的代码如下:
@Test void run() { LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>(); wrapper.eq(User::getUsername,"张三").and(new Consumer<LambdaQueryWrapper<User>>() { @Override public void accept(LambdaQueryWrapper<User> userLambdaQueryWrapper) { userLambdaQueryWrapper.gt(User::getAge,26).or().lt(User::getUserID,19); } }); List<User> list=mapper.selectList(wrapper); System.out.println(list); } }
3)or:
4)嵌套的or查询:select * from user where username="张三" or (age>90 and userID=1)
@Test void run() { LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<>(); wrapper.eq(User::getUsername,"张三").or(new Consumer<LambdaQueryWrapper<User>>() { @Override public void accept(LambdaQueryWrapper<User> userLambdaQueryWrapper) { userLambdaQueryWrapper.ge(User::getAge,20).eq(User::getUserID,1); } }); List<User> list=mapper.selectList(wrapper); System.out.println(list); }
5)逻辑查询:直接讲条件拼接在where语句的后面
6)自定义条件查询: 对于一些复杂的条件,可以不通过API的方式来进行调用,可以直接将查询条件作为一个字符串:
7)last查询:可以通过wrapper中的last方法来进行传递一个字符串,然后mybatis-plus就会将这个字符串拼接到SQL的末尾,可以实现分页查询
8)exists:
select * from user where exists(select * from user where age>90)
notexists的用法恰好相反
select * from user where not exists(select * from user where age>90);
exists上面SQL语句的意思是如果括号中的结果是false,也就是说无法查询出语句,那么where前面的select * from user也是失效的,不会展现出任何结果,如果括号中的结果是true,也就是说后面括号中的语句成功的查询出了结果,那么前面的语句正常执行
9)select查询:可以有效地指明我们要查询哪些信息,由此可知select只是用于查询特定的字段,select没有指明的字段是不会进行查询的
主键自增策略的问题:
如果进行了水平分表,那么此时主键还是应该保证是自增的,主键在不同表中还是不可以重复的