1. 程式人生 > 實用技巧 >Mybatis Plus 查詢方法

Mybatis Plus 查詢方法

一、普通查詢

@SpringBootTest
public class QueryTest {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void selectById() {
        User user = userMapper.selectById(1094592041087729666L);
        System.out.println(user);
    }

    @Test
    public void selectByIds() {
        List<Long> ids = Arrays.asList(1094592041087729666L, 1094590409767661570L);
        List
<User> list = userMapper.selectBatchIds(ids); list.forEach(System.out::println); } @Test public void selectByMap() { // 注意:key存的是資料庫中的列名,而不是類中的屬性名稱 Map<String, Object> columMap = new HashMap<>(); columMap.put("name", "王天風"); columMap.put(
"age", 25); List<User> list = userMapper.selectByMap(columMap); list.forEach(System.out::println); } }

二、以條件構造器為引數的查詢

/**
 * 1、名字中包含雨並且年齡小於40
 * name like '%雨%' and age<40
 */
@Test
public void selectByWrapper() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    
//QueryWrapper<User> queryWrapper = Wrappers.<User>query(); queryWrapper.like("name", "雨").lt("age", 40); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 2、名字中包含雨年並且齡大於等於20且小於等於40並且email不為空 * name like '%雨%' and age between 20 and 40 and email is not null */ @Test public void selectByWrapper2() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", "雨").between("age", 20, 40).isNotNull("email"); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 3、名字為王姓或者年齡大於等於25,按照年齡降序排列,年齡相同按照id升序排列 * name like '王%' or age>=25 order by age desc,id asc */ @Test public void selectByWrapper3() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("name", "王").or().ge("age", 25) .orderByDesc("age").orderByAsc("id"); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 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 '王%') */ @Test public void selectByWrapper4() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.apply("date_format(create_time,'%Y-%m-%d') = {0}", "2019-02-14") .inSql("manager_id", "select id from user where name like '王%'"); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 5、名字為王姓並且(年齡小於40或郵箱不為空) * name like '王%' and (age<40 or email is not null) */ @Test public void selectByWrapper5() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("name", "王") .and(wq -> wq.lt("age", 40).or().isNotNull("email")); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 6、名字為王姓或者(年齡小於40並且年齡大於20並且郵箱不為空) * name like '王%' or (age<40 and age>20 and email is not null) */ @Test public void selectByWrapper6() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("name", "王") .or(wq -> wq.lt("age", 40).gt("age", 20).isNotNull("email")); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 7、(年齡小於40或郵箱不為空)並且名字為王姓 * (age<40 or email is not null) and name like '王%' */ @Test public void selectByWrapper7() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.nested(wq -> wq.lt("age", 40).or().isNotNull("email")) .likeRight("name", "王"); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 8、年齡為30、31、34、35 * age in (30、31、34、35) */ @Test public void selectByWrapper8() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.in("age", Arrays.asList(30, 31, 34, 35)); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); } /** * 9、只返回滿足條件的其中一條語句即可 * limit 1 */ @Test public void selectByWrapper9() { QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.in("age", Arrays.asList(30, 31, 34, 35)).last("limit 1"); List<User> list = userMapper.selectList(queryWrapper); list.forEach(System.out::println); }

三、select 中欄位不全部出現

/**
 * 1、名字中包含雨並且年齡小於40
 * select id,name from user where name like '%雨%' and age<40
 */
@Test
public void selectByWrapperSupper() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //QueryWrapper<User> queryWrapper = Wrappers.<User>query();
    queryWrapper.select("id", "name").like("name", "").lt("age", 40);
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

/**
 * 1、名字中包含雨並且年齡小於40
 * select id,name,age,email from user where name like '%雨%' and age<40
 */
@Test
public void selectByWrapperSupper2() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    //QueryWrapper<User> queryWrapper = Wrappers.<User>query();
    queryWrapper.like("name", "").lt("age", 40)
            .select(User.class, info -> !info.getColumn().equals("create_time") && !info.getColumn().equals("manager_id"));
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

四、條件構造器中condition作用

如果condition為true,才會新增條件到sql語句中

@Test
public void testCondition(){
    String name = "王";
    String email = "";
    condition(name,email);
}

public void condition(String name, String email) {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    /*if (!ObjectUtils.isEmpty(name)) {
        queryWrapper.like("name", name);
    }
    if (!ObjectUtils.isEmpty(email)) {
        queryWrapper.like("email", email);
    }*/
    queryWrapper.like(!ObjectUtils.isEmpty(name),"name", name)
            .like(!ObjectUtils.isEmpty(email),"email", email);
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

五、建立條件構造器時傳入實體物件

傳入的實體物件的屬性會當作條件,和Wrapper的其他條件不衝突

@Test
public void selectByWrapperEntity(){
    User whereUser = new User();
    whereUser.setName("劉紅雨");
    whereUser.setAge(32);

    QueryWrapper<User> queryWrapper = new QueryWrapper<>(whereUser);
    queryWrapper.like("name","雨").lt("age",40);

    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

控制檯輸出:

DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name=? AND age=? AND name LIKE ? AND age < ? 
DEBUG==> Parameters: 劉紅雨(String), 32(Integer), %雨%(String), 40(Integer)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 1094592041087729666, 劉紅雨, 32, [email protected], 1088248166370832385, 2019-01-14 09:48:16
DEBUG<==      Total: 1
User(id=1094592041087729666, name=劉紅雨, age=32, [email protected], managerId=1088248166370832385, createTime=Mon Jan 14 09:48:16 CST 2019, remark=null)

有時候根據實體類查詢不是完全匹配,可能是模糊查詢,可以使用@TableField中condition屬性

@TableField(condition = SqlCondition.LIKE)
private String name;

@Test
public void selectByWrapperEntity(){
    User whereUser = new User();
    whereUser.setName("劉紅雨");
    whereUser.setAge(32);

    QueryWrapper<User> queryWrapper = new QueryWrapper<>(whereUser);
   
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

控制檯輸出:

DEBUG==>  Preparing: SELECT id,name,age,email,manager_id,create_time FROM user WHERE name LIKE CONCAT('%',?,'%') AND age=? 
DEBUG==> Parameters: 劉紅雨(String), 32(Integer)
TRACE<==    Columns: id, name, age, email, manager_id, create_time
TRACE<==        Row: 1094592041087729666, 劉紅雨, 32, [email protected], 1088248166370832385, 2019-01-14 09:48:16
DEBUG<==      Total: 1
User(id=1094592041087729666, name=劉紅雨, age=32, [email protected], managerId=1088248166370832385, createTime=Mon Jan 14 09:48:16 CST 2019, remark=null)

預設的幾種SqlCondition不滿足條件,也可以自定義,注意需要用轉義後的字元

@TableField(condition = "%s&lt;#{%s}")
private int age;

六、條件構造器中allEq用法

@Test
public void selectByWrapperAllEq() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    Map<String, Object> params = new HashMap<>();
    params.put("name", "王天風");
    params.put("age", null);
    //queryWrapper.allEq(params);// 會加入AND age IS NULL
    //queryWrapper.allEq(params,false);// 為null不加入條件語句中
    queryWrapper.allEq((k, v) -> !k.equals("name"), params);// 過濾器,該程式碼意思是:name欄位不加入到條件語句中
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

七、其他以條件構造器為引數的查詢方法

@Test
public void selectByWrapperMaps() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("id", "name").like("name", "雨").lt("age", 40);

    List<Map<String, Object>> mapList = userMapper.selectMaps(queryWrapper);
    mapList.forEach(System.out::println);
}

/**
 * 11、按照直屬上級分組,查詢每組的平均年齡、最大年齡、最小年齡。
 * 並且只取年齡總和小於500的組。
 * select avg(age) avg_age,min(age) min_age,max(age) max_age
 * from user
 * group by manager_id
 * having sum(age) <500
 */
@Test
public void selectByWrapperMaps2() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("manager_id", "avg(age) avg_age", "min(age) min_age", "max(age) max_age")
            .groupBy("manager_id").having("sum(age) < {0}", 500);
    List<Map<String, Object>> mapList = userMapper.selectMaps(queryWrapper);
    mapList.forEach(System.out::println);
}

@Test
public void selectByWrapperObjs() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.select("name", "id").like("name", "雨").lt("age", 40);

    List<Object> objectList = userMapper.selectObjs(queryWrapper);
    objectList.forEach(System.out::println);
}

@Test
public void selectByWrapperCount() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "雨").lt("age", 40);

    Integer count = userMapper.selectCount(queryWrapper);
    System.out.println("記錄數:" + count);
}

@Test
public void selectByWrapperOne() {
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.like("name", "劉紅雨").lt("age", 40);

    User user = userMapper.selectOne(queryWrapper);// 如果查詢出不止一條資料,就會報錯
    System.out.println(user);
}

八、Lambda條件構造器

@Test
public void selectLambda() {
    //LambdaQueryWrapper<User> lambda = new QueryWrapper<User>().lambda();
    //LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
    LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();
    lambdaQuery.like(User::getName, "雨").lt(User::getAge, 40);
    List<User> list = userMapper.selectList(lambdaQuery);
    list.forEach(System.out::println);
}

/**
 * 5、名字為王姓並且(年齡小於40或郵箱不為空)
 * name like '王%' and (age<40 or email is not null)
 */
@Test
public void selectLambda2() {
    LambdaQueryWrapper<User> lambdaQuery = Wrappers.<User>lambdaQuery();
    lambdaQuery.likeRight(User::getName, "王")
            .and(lqw -> lqw.lt(User::getAge, 40).or().isNotNull(User::getEmail));
    List<User> list = userMapper.selectList(lambdaQuery);
    list.forEach(System.out::println);
}

@Test
public void selectLambda3() {
    List<User> list = new LambdaQueryChainWrapper<User>(userMapper)
            .like(User::getName, "雨").ge(User::getAge, 20).list();
    list.forEach(System.out::println);
}