Mybatis Example的高級用法詳解

Mybatis Example的高級用法

近幾個項目一直使用的mybatis來對數據庫做查詢,期間用到瞭很多高效簡潔的查詢方法,特此記錄和分享。

一. mapper接口中的函數及方法

方法名 功能
int countByExample(UserExample example) 按條件計數
int deleteByPrimaryKey(Integer id) 按主鍵刪除
int deleteByExample(UserExample example) 按條件查詢
String/Integer insert(User record) 插入數據(返回值為ID)
User selectByPrimaryKey(Integer id) 按主鍵查詢
ListselectByExample(UserExample example) 按條件查詢
ListselectByExampleWithBLOGs(UserExample example) 按條件查詢(包括BLOB字段)。隻有當數據表中的字段類型有為二進制的才會產生。
int updateByPrimaryKey(User record) 按主鍵更新
int updateByPrimaryKeySelective(User record) 按主鍵更新值不為null的字段
int updateByExample(User record, UserExample example) 按條件更新
int updateByExampleSelective(User record, UserExample example) 按條件更新值不為null的字段

二. example實例方法

example 用於添加條件,相當於where後面的部分,理論上單表的任何復雜條件查詢都可以使用example來完成。

方法 說明
example.setOrderByClause(“字段名 ASC”); 添加升序排列條件,DESC為降序
example.setDistinct(false) 去除重復,boolean型,true為選擇不重復的記錄。
example.and(Criteria criteria) 為example添加criteria查詢條件,關系為與
example.or(Criteria criteria) 為example添加criteria查詢條件,關系為或
criteria.andXxxIsNull 添加字段xxx為null的條件
criteria.andXxxIsNotNull 添加字段xxx不為null的條件
criteria.andXxxEqualTo(value) 添加xxx字段等於value條件
criteria.andXxxNotEqualTo(value) 添加xxx字段不等於value條件
criteria.andXxxGreaterThan(value) 添加xxx字段大於value條件
criteria.andXxxGreaterThanOrEqualTo(value) 添加xxx字段大於等於value條件
criteria.andXxxLessThan(value) 添加xxx字段小於value條件
criteria.andXxxLessThanOrEqualTo(value) 添加xxx字段小於等於value條件
criteria.andXxxIn(List<?>) 添加xxx字段值在List<?>條件
criteria.andXxxNotIn(List<?>) 添加xxx字段值不在List<?>條件
criteria.andXxxLike(“%”+value+”%”) 添加xxx字段值為value的模糊查詢條件
criteria.andXxxNotLike(“%”+value+”%”) 添加xxx字段值不為value的模糊查詢條件
criteria.andXxxBetween(value1,value2) 添加xxx字段值在value1和value2之間條件
criteria.andXxxNotBetween(value1,value2) 添加xxx字段值不在value1和value2之間條件

三. 使用案例

1.基本字段查詢

      // 1.使用criteria
      Example example = new Example(User.class);
            Criteria criteria = example.createCriteria();
            criteria.andEqualTo("name", name);
            criteria.andNotEqualTo("id", id);
            criteria.andEqualTo("userId", uid);
            List<User> list = userMapper.selectByExample(example);
            
            // 不使用criteria,實則example.and()本質底層還是返回的criteria,倒是可以簡便寫法。
            Example example = new Example(User.class);
   example.and()
                .andEqualTo("name", name)
                .andEqualTo("id", id)
                .andEqualTo("userId", uid);
    List<User> list = userMapper.selectByExample(example);
  等效於:select * from user where name = #{name} and id = #{id} and uid = #{uid}

2. and or 查詢

  Example example = new Example(User.getClass());
        // where 條件
        Criteria criteria = example.createCriteria();
        Criteria criteria1 = example.createCriteria();
        
        criteria.andIn("id", ids);
        criteria1.orLike("des", "%" + des + "%");
        criteria1.orLike("name", "%" + name + "%");
        example.and(criteria1);
        example.and().andEqualTo("status", staus)
 等效於:where id in ( #{ids} ) and ( name like concat(‘%', #{name} ,'%') or des like concat(‘%', #{des} ,'%') ) and status = #{status} 

註意:如果不加 example.and(criteria1);,則默認example隻添加生成的第一個criteria,criteria1 將不會加到此條件中

3. 數組參數的條件查詢

public Example test(List<String> names, String sex) {
  Example example = new Example(User.getClass());
  example.and().andEqualTo("sex", sex)
        Example.Criteria criteria = example.createCriteria();
        for (String str : names) {
             criteria.orLike("name", str);
         }
         example.and(criteria);
         List<User> list = userMapper.selectByExample(example);
            
 等效於:where sex = #{sex} and ( name like concat(‘%', #{name1} ,'%') or name like concat(‘%', #{name2} ,'%') )
}

說說Mybatis Example常見用法

一. 說明

我們在使用mybatis example做業務 增/刪/改/查時,會遇到一些場景。做一下記錄。

二. 排序查詢

使用mybatis example方式做查詢時候,業務需要按照條件排序,比如:創建時間倒序

example.setOrderByClause("create_time desc");

2.1 示例:

 @Override
    public UpgradeNotifyInfoDTO queryLatestNotify(Integer appType) {
        UpgradeNotifyInfoDTO notifyDTO=new UpgradeNotifyInfoDTO();
        SportAppUpgradeNotifyExample example = new SportAppUpgradeNotifyExample();
        example.setOrderByClause("`create_time` desc");
        SportAppUpgradeNotifyExample.Criteria criteria =  example.createCriteria();
        criteria.andAppTypeEqualTo(appType);
        // 0- 禁用 1-啟用
        criteria.andStatusEqualTo(1);
        List<SportAppUpgradeNotify> list = upgradeNotifyMapper.selectByExample(example);
        if (!CollectionUtils.isEmpty(list)){
            BeanUtils.copyProperties(list.get(0),notifyDTO);
        }
        return notifyDTO;
    }

註: 多條件排序寫法如下:

   ReservationProductOrderDetailExample example = new ReservationProductOrderDetailExample();
        example.setOrderByClause("`reservate_time` desc,`reservate_start_time` desc, `create_time` desc");
        ReservationProductOrderDetailExample.Criteria criteria = example.createCriteria();

三. 查詢limit, 隻返回前50條數據

3.1 借助PageHelper

我們通過Pagehelper做分頁查詢,那麼limit同樣可以使用Pagehelper。如下,查詢符合條件中的前50條。這裡不會返回數據總數 count

PageHelper.startPage(1, 50);
 public List<ShopCityInfoRespDTO> queryShopList(String shopCityName,String shopCityId) {
        List<ShopCityInfoRespDTO> shopCityList = new ArrayList<>();
        ShopInfoExample example = new ShopInfoExample();
        ShopInfoExample.Criteria criteria =  example.createCriteria();
        criteria.andStatusEqualTo("0");
        if(!StringUtils.isEmpty(shopCityId)) {
            criteria.andShopIdEqualTo(shopCityId);
        }
        if(!StringUtils.isEmpty(shopCityName)) {
            criteria.andShopNameLike("%" + shopCityName + "%");
        }
        // 這裡限制查詢50條數據,但不能返回總數
        PageHelper.startPage(1, 50);
        List<ShopInfo>  shopInfoList = shopInfoMapper.selectByExample(example);
        if(CollectionUtils.isEmpty(shopInfoList)){
           return shopCityList;
        }
        for (ShopInfo shopInfo : shopInfoList){
            ShopCityInfoRespDTO  respDTO = new ShopCityInfoRespDTO();
            respDTO.setCompanyId(shopInfo.getCompanyId());
            respDTO.setShopCityId(shopInfo.getShopId());
            respDTO.setShopCityName(shopInfo.getShopName());
            respDTO.setShopCityCode(shopInfo.getShopCode());
            respDTO.setShopType(1);
            shopCityList.add(respDTO);
        }
        return shopCityList;
    }

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: