MyBatis-Plus 常用API-2

攻城獅07發表於2019-10-11

=========================================================

四、詳細拆解CRUD

    在測試之前需要注意一些要點,如下放程式碼所示需要在yml配置檔案中加入下面的程式碼塊。這樣在測試的時候會在控制檯列印sql語句供參考:

//#在控制檯列印sql語句
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
複製程式碼
baseMapper中的方法: 
insert 

deleteById  deleteByMap  delete  deleteBatchIds

updateById  update

selectById  selectBatchIds  selectByMap  selectOne  selectCount  
selectList  selectMaps  selectObjs  selectPage  selectMapsPage 
複製程式碼
/**
 * 分頁查詢測試
 */
@Test
public void selectPageLoads() {
    Page<User> page = new Page<>(1,5);
    IPage<User> lstUser = mapper.selectPage(page, null);//null代表的是條件構造器
    System.out.println("return selectPageLoads value = " + lstUser);
}
想實現mybatis-plus分頁首先需要確定配置了分頁外掛配置方法
/**
 * 分頁外掛
 */
@Bean
public PaginationInterceptor paginationInterceptor() {
    return new PaginationInterceptor();
}
在配置類或啟動類中增加上面的bean就可以使用了,如不不新增分頁不成功查詢所有內容
複製程式碼
baseMapper原始碼介紹的都是基本的CRUD :
package com.baomidou.mybatisplus.core.mapper;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;

/**
 * <p>
 * Mapper 繼承該介面後,無需編寫 mapper.xml 檔案,即可獲得CRUD功能
 * </p>
 * <p>
 * 這個 Mapper 支援 id 泛型
 * </p>
 *
 * @author hubin
 * @since 2016-01-23
 */
public interface BaseMapper<T> {

    /**
     * <p>
     * 插入一條記錄
     * </p>
     *
     * @param entity 實體物件
     */
    int insert(T entity);//√

    /**
     * <p>
     * 根據 ID 刪除
     * </p>
     *
     * @param id 主鍵ID
     */
    int deleteById(Serializable id);//√

    /**
     * <p>
     * 根據 columnMap 條件,刪除記錄
     * </p>
     *
     * @param columnMap 表欄位 map 物件
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);//√

    /**
     * <p>
     * 根據 entity 條件,刪除記錄
     * </p>
     *
     * @param queryWrapper 實體物件封裝操作類(可以為 null)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * <p>
     * 刪除(根據ID 批量刪除)
     * </p>
     *
     * @param idList 主鍵ID列表(不能為 null 以及 empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);//√

    /**
     * <p>
     * 根據 ID 修改
     * </p>
     *
     * @param entity 實體物件
     */
    int updateById(@Param(Constants.ENTITY) T entity);//√

    /**
     * <p>
     * 根據 whereEntity 條件,更新記錄
     * </p>
     *
     * @param entity        實體物件 (set 條件值,不能為 null)
     * @param updateWrapper 實體物件封裝操作類(可以為 null,裡面的 entity 用於生成 where 語句)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * <p>
     * 根據 ID 查詢
     * </p>
     *
     * @param id 主鍵ID
     */
    T selectById(Serializable id);//√

    /**
     * <p>
     * 查詢(根據ID 批量查詢)
     * </p>
     *
     * @param idList 主鍵ID列表(不能為 null 以及 empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);//√

    /**
     * <p>
     * 查詢(根據 columnMap 條件)
     * </p>
     *
     * @param columnMap 表欄位 map 物件
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);//√

    /**
     * <p>
     * 根據 entity 條件,查詢一條記錄
     * </p>
     *
     * @param queryWrapper 實體物件
     */
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * <p>
     * 根據 Wrapper 條件,查詢總記錄數
     * </p>
     *
     * @param queryWrapper 實體物件
     */
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * <p>
     * 根據 entity 條件,查詢全部記錄
     * </p>
     *
     * @param queryWrapper 實體物件封裝操作類(可以為 null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * <p>
     * 根據 Wrapper 條件,查詢全部記錄
     * </p>
     *
     * @param queryWrapper 實體物件封裝操作類(可以為 null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * <p>
     * 根據 Wrapper 條件,查詢全部記錄
     * 注意: 只返回第一個欄位的值
     * </p>
     *
     * @param queryWrapper 實體物件封裝操作類(可以為 null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * <p>
     * 根據 entity 條件,查詢全部記錄(並翻頁)
     * </p>
     *
     * @param page         分頁查詢條件(可以為 RowBounds.DEFAULT)
     * @param queryWrapper 實體物件封裝操作類(可以為 null)
     */
    IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);//√

    /**
     * <p>
     * 根據 Wrapper 條件,查詢全部記錄(並翻頁)
     * </p>
     *
     * @param page         分頁查詢條件
     * @param queryWrapper 實體物件封裝操作類
     */
    IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}
複製程式碼
原文連結:https://blog.csdn.net/m0_37034294/article/details/82908527
複製程式碼

=========================================================

五、強大的條件構造器queryWrapper、updateWrapper

1、條件構造器關係介紹

MyBatis-Plus 常用API-2
wapper介紹 :

Wrapper : 條件構造抽象類,最頂端父類,抽象類中提供4個方法西面貼原始碼展示
AbstractWrapper : 用於查詢條件封裝,生成 sql 的 where 條件
AbstractLambdaWrapper : Lambda 語法使用 Wrapper統一處理解析 lambda 獲取 column。
LambdaQueryWrapper :看名稱也能明白就是用於Lambda語法使用的查詢Wrapper
LambdaUpdateWrapper : Lambda 更新封裝Wrapper
QueryWrapper : Entity 物件封裝操作類,不是用lambda語法
UpdateWrapper : Update 條件封裝,用於Entity物件更新操作
複製程式碼

2、條件構造器表示式

MyBatis-Plus 常用API-2

原文連結:https://blog.csdn.net/m0_37034294/article/details/82917234
複製程式碼

=========================================================

六、實現多表聯查分頁3.X版本

    MP推薦使用的是一種苞米豆團隊自己封裝好的分頁外掛,也就是PaginationInterceptor分頁攔截器,那麼下面整合分頁外掛

1、配置分頁外掛

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@Configuration
@MapperScan("com.lqf.multitable.dao.*")
public class MybatisPlusConfig {
    /**
     * mybatis-plus SQL執行效率外掛【生產環境可以關閉】
     */
    @Bean
    public PerformanceInterceptor performanceInterceptor() {
        return new PerformanceInterceptor();
    }

    /*
     * 分頁外掛,自動識別資料庫型別 多租戶,請參考官網【外掛擴充套件】
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}
複製程式碼

    由於在多表聯查的情況下可能會出現返回不同表的欄位,當自動生成的表不能滿足你的返回條件時,需要我們自動生成一個返回實體。

2、建立返回實體

import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
 
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRoleVo {

    private Long userId;

    /**
     * 建立時間
     */
    private LocalDateTime createTime;

    /**
     * 修改時間
     */
    private LocalDateTime updateTime;

    /**
     * 賬號
     */
    private String username;

    /**
     * 密碼
     */
    private String password;

    /**
     * 姓名
     */
    private String realname;

    /**
     * 性別(0為女 1為男)
     */
    private Integer sex;

    /**
     * 手機號
     */
    private String mobile;

    /**
     * 密碼加密串
     */
    private String passwordMd5;

    /**
     * 開賬號人
     */
    private Long parentId;

    /**
     * 是否禁用 0否 1是
     */
    private Integer status;

    /**
     * 授權大區
     */
    private String authArea;

    /**
     * 授權城市
     */
    private String authCity;

    private Integer role;

    /**
     * 使用者剩餘卡數
     */
    private Integer residueCardNumber;

    /**
     * 最後登入時間
     */
    private LocalDateTime lastLoginTime;

    /**
     * 最後登入ip地址
     */
    private String lastLoginIp;

    /**
     * 最後登入次數
     */
    private Integer lastLoginCount;

    /**
     * 渠道
     */
    private String authChannel;

    /**
     * 0 外網 1 內網
     */
    private Integer internet;

    /**
     * 金幣
     */
    private Long goldCoin;

    private Long id;

    /**
     * 狀態
     */
    private String statusId;

    /**
     * 角色名
     */
    private String roleName;

    /**
     * 角色值
     */
    private String roleValue;

    /**
     * 能新增的下屬角色值
     */
    private String addibleValue;
}
複製程式碼

3、測試Test

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.service.crm.FyUserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisPlusMultiTableApplicationTests {

    @Autowired
    private FyUserService service;

    /**
     * 聯表查詢並分頁
     */
    @Test
    public void contextLoads() {
        // 當前頁,總條數 構造 page 物件
        Page<UserRoleVo> page = new Page<>(1, 10);
        page.setRecords(service.selectUserListPage(page));
        System.out.println(page);
    }
}
複製程式碼

4、service層

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.lqf.multitable.bean.crm.UserRoleVo;
import com.lqf.multitable.dao.crm.FyUserMapper;
import com.lqf.multitable.service.crm.FyUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 *  服務實現類
 */
@Service
public class FyUserServiceImpl extends ServiceImpl<FyUserMapper, FyUser> implements FyUserService {

    @Override
    public List<UserRoleVo> selectUserListPage(Page<UserRoleVo> page) {
        return this.baseMapper.selectUserListPage(page);
    }
}
複製程式碼

5、mapper層

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lqf.multitable.bean.crm.FyUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lqf.multitable.bean.crm.UserRoleVo;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 *  Mapper 介面
 */
@Repository
public interface FyUserMapper extends BaseMapper<FyUser> {
    @Select("SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id")
    List<UserRoleVo> selectUserListPage(Page<UserRoleVo> pagination);
}
複製程式碼

6、測試結果

==> Preparing: SELECT COUNT(1) FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id 
==> Parameters: 
<== Columns: COUNT(1)
<== Row: 391
==> Preparing: SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10 
==> Parameters: 
<== Columns: user_id, create_time, update_time, username, password, realname, sex, mobile, password_md5, parent_id, status, auth_area, auth_city, role, residue_card_number, last_login_time, last_login_ip, last_login_count, auth_channel, internet, gold_coin, id, status_id, create_time, update_time, role_name, role_value, addible_value

********* 這裡是查詢到的資訊,有隱私就不列印了
<== Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63c12e52]
com.baomidou.mybatisplus.extension.plugins.pagination.Page@5d2828c9
Time:61 ms - ID:com.lqf.multitable.dao.crm.FyUserMapper.selectUserListPage
Execute SQL:SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10
複製程式碼

    測試結果可以看出,總查詢條數391條,分頁後查詢limit 0,10, 查詢耗時 61ms。

原文連結:https://blog.csdn.net/m0_37034294/article/details/82935436
複製程式碼
作者:「青蛙與大鵝」
來源:CSDN
複製程式碼

相關文章