完整的項(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功能。
全部方法
在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); }
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); }
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)容,拭目以待吧!














































