概念
QBC即Quary By Criteria,Criteria是Criterion的复数,译为规则,准则,在sql语句中相当于查询条件。QBC查询是将查询条件通过Java对象进行模块化封装。
演示
用一个小例子来演示一下,这个例子是查询所有age为18的user,下面是日志打印出来的sql和例子演示:
SELECT id,user_id,user_name,age FROM sys_user WHERE ( age = ? )
public void testQBC(){
//先创建一个Example,实例化的参数为想查询的那个实体类,这个地方也就确定了是从哪张表查询
Example example = new Example(User.class);
//创建criteria,用criteria来构建查询条件
Example.Criteria criteria = example.createCriteria();
//调用andEqualTo方法,前一个参数表示字段名,后一个参数表示条件值
criteria.andEqualTo("age",18);
//调用selectByExample方法,即自动调用了criteria
List<User> users = userMapper.selectByExample(example);
for (User user : users) {
System.out.println(user);
}
}
其他需要讲明的地方
- 实体类:
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "sys_user")
public class User {
@KeySql(genId = GenerateUUID.class)
private String id;
@Id
private Integer userId;
@Column("sys_user_name")
private String userName;
private Integer age;
}
在这里面,@Table注解的值就是数据库中的表,@Colum注解把数据库表中的字段名和实体类的成员属性绑定,@Id在用到primaryKey的时候产生作用。
- Example的其他属性:
作用见注释
@Test
public void testQbcOthers(){
Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
criteria.andLessThanOrEqualTo("age",18);
//使用orderBy asc desc
example.orderBy("userId").asc().orderBy("age").desc();
//去重
example.setDistinct(true);
//设置查询的字段
example.selectProperties("userId","userName","age");
List<User> users = userMapper.selectByExample(example);
for (User user : users) {
System.out.println(user);
}
}
日志sql:
SELECT distinct user_id , user_name , age FROM sys_user WHERE ( age <= ? ) order by user_id ASC,age DESC
补充:
- Mybatis 使用 ResultMapWithBLOBs 来接收有长字段的查询结果,所以如果数据库有长字段,要用 selectByExampleWithBLOBs 方法查询,没有长字段时,使用 selectByExample 方法即可。