MP入門 HelloWorld

完整的項(xiàng)目結(jié)構(gòu)
通用 CRUD 場(chǎng)景設(shè)定
  • 提出問(wèn)題:
    假設(shè)我們已存在一張 tbl_employee 表,且已有對(duì)應(yīng)的實(shí)體類 Employee,實(shí)現(xiàn) tbl_employee 表的 CRUD 操作我們需要做什么呢?
  • 實(shí)現(xiàn)方式:
    (1)基于 Mybatis
    需要編寫 EmployeeMapper 接口,并手動(dòng)編寫 CRUD 方法 ;
    提供 EmployeeMapper.xml 映射文件,并手動(dòng)編寫每個(gè)方法對(duì)應(yīng)的 SQL 語(yǔ)句。
    (2)基于 MP
    只需要?jiǎng)?chuàng)建 EmployeeMapper 接口, 并繼承 BaseMapper 接口。
    這就是使用 MP 需要完成的所有操作,甚至不需要?jiǎng)?chuàng)建 SQL 映射文件。
準(zhǔn)備具體的Mapper接口

package com.neuedu.mp.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.neuedu.mp.beans.Employee;
/**
* Mapper接口
*     
* 基于Mybatis:  
*                  在Mapper接口中編寫CRUD相關(guān)的方法  
*                  提供Mapper接口所對(duì)應(yīng)的SQL映射文件 
*                  以及方法對(duì)應(yīng)的SQL語(yǔ)句. 
* 
* 基于MP:  
*            讓XxxMapper接口繼承 BaseMapper接口即可.
*           BaseMapper<T> : 泛型指定的就是當(dāng)前Mapper接口所操作的實(shí)體類類型 
* 
*/
public interface EmployeeMapper extends BaseMapper<Employee> {
  
}

BaseMapper:繼承該接口后,無(wú)需編寫 mapper.xml 文件,即可獲得CRUD功能。

全部方法

\color{red}{注意:}在applicationContext.xml文件中配置mapper接口掃描
添加配置

  <!--  配置 mybatis 掃描 mapper 接口的路徑   -->  
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
      <property name="basePackage" value="com.neuedu.mp.mapper"></property>
  </bean>
測(cè)試通用插入操作

①指定主鍵策略


  /*
   * @TableId:
   *   value: 指定表中的主鍵列的列名, 如果實(shí)體屬性名與列名一致,可以省略不指定. 
   *   type: 指定主鍵策略. 
   */
  @TableId(value="id" , type=IdType.AUTO)

MP支持以下4中主鍵策略,可根據(jù)需求自行選用:

序號(hào) 描述
1 IdType.AUTO 數(shù)據(jù)庫(kù)ID自增
2 IdType.INPUT 用戶輸入ID
3 IdType.ID_WORKER 全局唯一ID,內(nèi)容為空自動(dòng)填充(默認(rèn)配置)
4 IdType.UUID 全局唯一ID,內(nèi)容為空自動(dòng)填充

②實(shí)體類類名和數(shù)據(jù)庫(kù)表表名映射關(guān)聯(lián)


// MybatisPlus會(huì)默認(rèn)使用實(shí)體類的類名到數(shù)據(jù)中找對(duì)應(yīng)的表.
@TableName(value="tbl_employee")

表名注解 @TableName

序號(hào) 描述
1 value 表名( 默認(rèn)空 )
2 resultMap xml 字段映射 resultMap ID

③在測(cè)試類中獲取EmployeeMapper接口代理實(shí)現(xiàn)類


  // 獲取EmployeeMapper接口代理實(shí)現(xiàn)類
  private EmployeeMapper employeeMapper 
      = iocContext.getBean("employeeMapper", EmployeeMapper.class);

④測(cè)試通用插入操作insert方法

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee對(duì)象
      Employee employee  = new Employee();
      employee.setLastName("MP_01");
      employee.setEmail("mp_01@neusoft.com");
      employee.setGender(1);
      employee.setAge(23);
      
      // 向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)
      Integer result = employeeMapper.insert(employee);
      System.out.println(result);
      
  }

\color{red}{注意:}insert方法在插入時(shí), 會(huì)根據(jù)實(shí)體類的每個(gè)屬性進(jìn)行非空判斷,只有非空的屬性對(duì)應(yīng)的字段才會(huì)出現(xiàn)到SQL語(yǔ)句中。

⑤測(cè)試插入操作返回主鍵值(支持主鍵自增的數(shù)據(jù)庫(kù)插入數(shù)據(jù)獲取主鍵值)

  • Mybatis: 需要通過(guò) useGeneratedKeys 以及 keyProperty 來(lái)設(shè)置
  • MP: 自動(dòng)將主鍵值回寫到實(shí)體類中
代碼

結(jié)果

數(shù)據(jù)庫(kù)
  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee對(duì)象
      Employee employee  = new Employee();
      employee.setLastName("MP_02");
      employee.setEmail("mp_02@neusoft.com");
      employee.setGender(0);
      employee.setAge(42);
      
      // 向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)
      Integer result = employeeMapper.insert(employee);
      System.out.println(result);
      
      //獲取當(dāng)前數(shù)據(jù)在數(shù)據(jù)庫(kù)中的主鍵值
      Integer key = employee.getId();
      System.out.println("key:" + key);   
  }

⑥測(cè)試通用插入操作insertAllColumn方法

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 插入操作
   */
  @Test
  public void testCommonInsert() {
      
      //初始化Employee對(duì)象
      Employee employee  = new Employee();
      employee.setLastName("MP_03");
      employee.setEmail("mp_03@neusoft.com");
      
      // 向數(shù)據(jù)庫(kù)中添加數(shù)據(jù)
      Integer result = employeeMapper.insertAllColumn(employee);
      System.out.println(result); 
  }

\color{red}{注意:}insertAllColumn方法在插入時(shí), 不管屬性是否非空, 屬性所對(duì)應(yīng)的字段都會(huì)出現(xiàn)到SQL語(yǔ)句中。

通用更新操作

①測(cè)試通用更新操作updateById方法

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 更新操作
   */
  @Test
  public void testCommonUpdate() {
      //初始化修改對(duì)象
      Employee employee = new Employee();
      employee.setId(7);
      employee.setLastName("MP_03");
      employee.setEmail("mp_03@neusoft.com");
      employee.setGender(0);
      employee.setAge(33);
      
      // 更新ID為7的雇員的性別:null->0,Age->33
      Integer result = employeeMapper.updateById(employee);
      System.out.println("result: " + result);
  }

②測(cè)試通用更新操作updateAllColumnById方法

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 更新操作
   */
  @Test
  public void testCommonUpdate() {
      //初始化修改對(duì)象
      Employee employee = new Employee();
      employee.setId(7);
      employee.setLastName("MP_03");
      employee.setEmail("mp_03@東軟.com");
      employee.setGender(1);
      
      // 更新ID為7的雇員的性別:Email->mp_03@東軟.com,Gender->0,并且不寫Age屬性
      Integer result = employeeMapper.updateAllColumnById(employee);
      System.out.println("result: " + result);
  }
通用查詢操作

①測(cè)試通用查詢操作selectById方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

  /**
   * 通用 查詢操作
   */
  @Test
  public void testCommonSelect() {
      // 通過(guò)id查詢
      Employee employee = employeeMapper.selectById(7);
      System.out.println(employee);
  }

②測(cè)試通用查詢操作selectOne方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

  /**
   * 通用 查詢操作
   */
  @Test
  public void testCommonSelect() {
      // 通過(guò)多個(gè)列進(jìn)行查詢: id  +  lastName
      Employee  employee = new Employee();
      employee.setId(6);
      employee.setLastName("MP_02");
      
      Employee result = employeeMapper.selectOne(employee);
      System.out.println("result: " +result);
  }

③測(cè)試通用查詢操作selectBatchIds方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

  /**
   * 通用 查詢操作
   */
  @Test
  public void testCommonSelect() {
      // 通過(guò)多個(gè)id進(jìn)行查詢   
      List<Integer> idList = new ArrayList<>();
      idList.add(4);
      idList.add(5);
      idList.add(6);
      idList.add(7);
      List<Employee> emps = employeeMapper.selectBatchIds(idList);
      // 打印查詢的數(shù)據(jù)
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }

④測(cè)試通用查詢操作selectByMap方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

  /**
   * 通用 查詢操作
   */
  @Test
  public void testCommonSelect() {
      // 通過(guò)Map封裝條件查詢
      Map<String,Object> columnMap = new HashMap<>();
      columnMap.put("last_name", "Tom");
      columnMap.put("gender", 1);
      
      List<Employee> emps = employeeMapper.selectByMap(columnMap);
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }

⑤測(cè)試通用查詢操作selectPage方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

  /**
   * 通用 查詢操作
   */
  @Test
  public void testCommonSelect() {
      // 分頁(yè)查詢
      List<Employee> emps = employeeMapper.selectPage(new Page<>(3, 2), null);
      for (Employee employee : emps) {
          System.out.println(employee);
      }
  }
通用刪除操作

①測(cè)試通用刪除操作deleteById方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 刪除操作
   */
  @Test
  public void testCommonDelete() {
      // 根據(jù)id進(jìn)行刪除
      Integer result = employeeMapper.deleteById(7);
      System.out.println("result: " + result);
  }

②測(cè)試通用刪除操作deleteByMap方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 刪除操作
   */
  @Test
  public void testCommonDelete() {
      
      // 根據(jù) 多個(gè) 條件進(jìn)行刪除
      Map<String,Object> columnMap = new HashMap<>();
      columnMap.put("last_name", "MP_01");
      columnMap.put("email", "mp_01@neusoft.com");
      
      Integer result = employeeMapper.deleteByMap(columnMap);
      System.out.println("result: " + result);
  }

③測(cè)試通用刪除操作deleteBatchIds方法

數(shù)據(jù)庫(kù)

代碼

結(jié)果

數(shù)據(jù)庫(kù)

  /**
   * 通用 刪除操作
   */
  @Test
  public void testCommonDelete() {
      
      // 根據(jù)ID批量刪除
      List<Integer> idList = new ArrayList<>();
      idList.add(1);
      idList.add(2);
      idList.add(6);
      Integer result = employeeMapper.deleteBatchIds(idList);
      System.out.println("result: " + result );
  }
通用 CRUD 操作小結(jié)

以上就是基本的 CRUD 操作,如您所見(jiàn),我們僅僅需要繼承一個(gè) BaseMapper 即可實(shí)現(xiàn)大部分單表 CRUD 操作。BaseMapper 提供了多達(dá) 17 個(gè)方法給大家使用, 可以極其方便的實(shí)現(xiàn)單一、批量、分頁(yè)等操作。極大的減少開(kāi)發(fā)負(fù)擔(dān),難道這就是 MP 的強(qiáng)大之處了嗎?

  • 提出需求:
    現(xiàn)有一個(gè)需求,我們需要分頁(yè)查詢 tbl_employee 表中,年齡在 18~50 之間性別為男且姓名為 xx 的所有用戶,這時(shí)候我們?cè)撊绾螌?shí)現(xiàn)上述需求呢?
    MyBatis :需要在 SQL 映射文件中編寫帶條件查詢的 SQL,并基于 PageHelper 插件完成分頁(yè). 實(shí)現(xiàn)以上一個(gè)簡(jiǎn)單的需求,往往需要我們做很多重復(fù)單調(diào)的工作。普通的 Mapper 能夠解決這類痛點(diǎn)嗎?
    MP:依舊不用編寫 SQL 語(yǔ)句, MP 提供了功能強(qiáng)大的條件構(gòu)造器 EntityWrapper 。好了,接下來(lái)就學(xué)習(xí)這個(gè)內(nèi)容,拭目以待吧!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容