03_Mybatis-Plus入門CRUD
通用的CRUD(入門DEMO)
- 提出問題:
假設(shè)我們已經(jīng)存在一張tbl_employee表,且已有對應(yīng)的實(shí)體類Employee际插,實(shí)現(xiàn)tbl_employee表的CRUD操作我們需要做什么巡李? - 實(shí)現(xiàn)方式:
- 基于Mybatis:
- 需要編寫EmployeeMapper接口眉反,并手動編寫CRUD方法琅轧。
- 提供EmployeeMapper.xml映射文件,并手動編寫每個(gè)方法對應(yīng)的SQL語句虏等。
- 基于MP
- 只需要創(chuàng)建EmployeeMapper接口,并繼承BaseMapper接口适肠,這就是使用MP需要完成的所有操作霍衫,甚至不用創(chuàng)建SQL映射文件。
- 具體實(shí)現(xiàn)
首先要編寫Mapper接口:
package top.tomxwd.mp.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import top.tomxwd.mp.beans.Employee;
/**
* Mapper接口
*
* 基于Mybatis實(shí)現(xiàn):在Mapper接口中編寫CRUD相關(guān)方法侯养,還要提供對應(yīng)的SQL映射文件 以及方法對應(yīng)的sql語句
*
* 基于MP:讓XxxMapper接口繼承BaseMapper接口即可
* BaseMapper<T> : 泛型指定的就是當(dāng)前Mapper接口所操作的實(shí)體類類型
*
*/
public interface EmployeeMapper extends BaseMapper<Employee> {
}
第二步要在實(shí)體類上的主鍵打@TabledId注解
/**
* @TableId:
* value:指定表中的主鍵列的列名敦跌,如果實(shí)體屬性名和列名一致,可以省略
* type:指定主鍵策略
*/
@TableId(value="id",type=IdType.AUTO)
private Integer id;
第三步要在實(shí)體類上打@TableName注解
/*
* Mybatis-Plus會默認(rèn)使用實(shí)體類的類名到數(shù)據(jù)庫中找對應(yīng)的表
*/
@TableName(value="tbl_employee")
public class Employee {}
以上就是MP的CRUD操作所需要做的事情逛揩。
- 測試:
private ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper employeeMapper = ioc.getBean("employeeMapper",EmployeeMapper.class);
/**
* 通用的插入操作
* @throws Exception
*/
@Test
public void testCommonInsert() throws Exception {
// 初始化Employee對象
Employee employee = new Employee();
employee.setAge(18);
employee.setEmail("marry@tomxwd.top");
employee.setGender(0);
employee.setLastName("Marry");
// 插入到數(shù)據(jù)庫 返回受影響的條數(shù)
Integer result = employeeMapper.insert(employee);
System.out.println("result:" + result);
}
輸出結(jié)果:
省略其他日志信息之后:
DEBUG 06-08 17:41:51,646 ==> Preparing: INSERT INTO tbl_employee ( last_name, email, gender, age ) VALUES ( ?, ?, ?, ? ) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 17:41:51,679 ==> Parameters: Marry(String), marry@tomxwd.top(String), 0(Integer), 18(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 17:41:51,683 <== Updates: 1 (JakartaCommonsLoggingImpl.java:54)
result:1
主鍵策略以及@TableId注解
值 | 描述 |
---|---|
idType.AUTO | 數(shù)據(jù)庫ID自增 |
idType.INPUT | 用戶輸入ID |
idType.ID_WORKER | 全局唯一ID柠傍,內(nèi)容為空自動填充(默認(rèn)配置) |
idType.UUID | 全局唯一id,內(nèi)容為空自動填充 |
/**
* @TableId:
* value:指定表中的主鍵列的列名辩稽,如果實(shí)體屬性名和列名一致惧笛,可以省略
* type:指定主鍵策略
*/
@TableId(value="id",type=IdType.AUTO)
private Integer id;
如果實(shí)體類field名和表中的字段名一樣,則value可以不寫逞泄。
@TableName注解
表名注解患整。
值 | 描述 |
---|---|
value | 表名(默認(rèn)空) |
resultMap | xml字段映射resultMap的ID |
@TableField注解
字段注解:
其一:(value)比如遇到表中是last_name拜效,實(shí)體類屬性是lastName,而且全局策略配置沒有進(jìn)行配置各谚,則需要用到該字段紧憾,與@TableName類似,都是用來解決不統(tǒng)一的問題嘲碧。用value來指定表中的字段名稻励。
其二:(exist)里面有個(gè)exist屬性,表示這個(gè)是不是數(shù)據(jù)庫表里面的字段愈涩,因?yàn)橐院髸羞@種情況望抽。
MP全局策略配置(重要)
問題引出:
數(shù)據(jù)庫中的字段名是last_name,而實(shí)體類屬性名為lastName履婉,但是根據(jù)日志信息得到的插入信息確實(shí)是last_name字段煤篙,為什么?
而且在mybatis-config.xml文件里也沒有配置對應(yīng)的駝峰規(guī)則等毁腿,為什么辑奈?
說明MP幫我們?nèi)ソ鉀Q了這個(gè)問題。
定義Mybatis-Plus的全局策略配置
在spring配置文件(applicationContext.xml)中進(jìn)行配置已烤。
為什么要進(jìn)行全局配置鸠窗?
比如每個(gè)實(shí)體類都以tbl_開頭,那么每一個(gè)實(shí)體類都需要去聲明@TableName胯究,每一個(gè)主鍵id都需要配置自動遞增稍计,則需要每一個(gè)id字段去設(shè)置@TabledId注解。相對麻煩裕循,如果用全局配置臣嚣,則一步到位。
- 字段駝峰原則
- 配置全局主鍵策略
- 配置全局表前綴策略
- 后續(xù)會使用更多的策略來配置
<!-- 定義Mybatis-Plus的全局策略配置 -->
<!-- 定義Mybatis-Plus的全局策略配置 -->
<bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 2.3版本之后剥哑,dbColumnUnderline默認(rèn)就是true -->
<!-- 駝峰原則 -->
<property name="dbColumnUnderline" value="true"></property>
<!-- 配置全局主鍵策略 0為自動遞增 -->
<property name="idType" value="0"></property>
<!-- 全局的表前綴策略配置 -->
<property name="tablePrefix" value="tbl_"></property>
</bean>
切記硅则,在配置完全局策略配置之后,需要把改配置注入到Mybatis配置中去株婴,也就是SqlSessionFactorybean怎虫,此時(shí)才會生效。否則報(bào)錯(cuò)困介。
<!-- 配置MybatisSqlSessionFactoryBean -->
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<!-- 數(shù)據(jù)源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 別名處理 -->
<property name="typeAliasesPackage" value="top.tomxwd.mp.beans"></property>
<!-- 注入全局MP策略配置 -->
<property name="globalConfig" ref="globalConfiguration"></property>
</bean>
插入數(shù)據(jù)獲取主鍵值
以前的做法:
Integer insertEmployee(Employee employee)
<insert useGeneratedKeys="true" keyProperty="id">SQL...</insert>
MP的做法:
MP會自動把主鍵值回寫到實(shí)體類中大审。
insertAllColumn方法
普通的insert方法是使用非空來判斷是否插入值,而insertAllColumn方法是插入所有的字段逻翁。
/**
* insertAllColumn方法
* @throws Exception
*/
@Test
public void testInsertAllColumn() throws Exception {
Employee e = new Employee();
e.setLastName("Tony");
e.setEmail("tony@tomxwd.top");
e.setAge(50);
Integer result = employeeMapper.insertAllColumn(e);
System.out.println(result);
Integer id = e.getId();
System.out.println(id);
}
此時(shí)日志記錄為:
DEBUG 06-08 20:33:09,786 ==> Preparing: INSERT INTO tbl_employee ( last_name,email,gender,age ) VALUES ( ?,?,?,? ) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:33:09,820 ==> Parameters: Tony(String), tony@tomxwd.top(String), null, 50(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:33:09,824 <== Updates: 1 (JakartaCommonsLoggingImpl.java:54)
發(fā)現(xiàn)數(shù)據(jù)庫結(jié)果:gender為null饥努,沒有用到數(shù)據(jù)庫中的default值。
updateById方法
null則不更新八回,返回結(jié)果是影響條數(shù)酷愧。
相關(guān)代碼:
/**
* 通用更新操作
* @throws Exception
*/
@Test
public void testUpdateById() throws Exception {
Employee e = new Employee();
e.setId(9);
e.setGender(1);
Integer result = employeeMapper.updateById(e);
System.out.println(result);
}
日志輸出:
DEBUG 06-08 20:38:33,846 ==> Preparing: UPDATE tbl_employee SET gender=? WHERE id=? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:38:33,888 ==> Parameters: 1(Integer), 9(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:38:33,890 <== Updates: 1 (JakartaCommonsLoggingImpl.java:54)
updateAllColumnById方法
跟updateById的區(qū)別在于驾诈,null值也會插入到里面。
相關(guān)代碼:
/**
* UpdateAllColumnById方法
* @throws Exception
*/
@Test
public void testUpdateAllColumnById() throws Exception {
Employee e = new Employee();
e.setId(9);
e.setGender(1);
Integer result = employeeMapper.updateAllColumnById(e);
System.out.println(result);
}
日志輸出:
DEBUG 06-08 20:44:18,682 ==> Preparing: UPDATE tbl_employee SET last_name=?,email=?,gender=?,age=? WHERE id=? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:44:18,742 ==> Parameters: null, null, 1(Integer), null, 9(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:44:18,746 <== Updates: 1 (JakartaCommonsLoggingImpl.java:54)
selectById方法
相關(guān)代碼:
/**
* selectById方法
* @throws Exception
*/
@Test
public void testSelectById() throws Exception {
Employee employee = employeeMapper.selectById(8);
System.out.println(employee);
}
日志輸出:
DEBUG 06-08 20:48:39,273 ==> Preparing: SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE id=? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:48:39,308 ==> Parameters: 8(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:48:39,326 <== Total: 1 (JakartaCommonsLoggingImpl.java:54)
selectOne方法(條件查詢)
相關(guān)代碼:
/**
* 多個(gè)列來查詢
* SelectOne
* @throws Exception
*/
@Test
public void testSelectOne() throws Exception {
// 通過多個(gè)列進(jìn)行查詢 比如 id和lastName來查詢
Employee employee = new Employee();
employee.setId(7);
employee.setLastName("Marry");
Employee e = employeeMapper.selectOne(employee);
System.out.println(e);
}
日志輸出:
DEBUG 06-08 20:52:39,303 ==> Preparing: SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE id=? AND last_name=? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:52:39,348 ==> Parameters: 7(Integer), Marry(String) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 20:52:39,364 <== Total: 1 (JakartaCommonsLoggingImpl.java:54)
需要注意的是溶浴!該方法是查詢一條數(shù)據(jù)的乍迄,不可以返回多個(gè)數(shù)據(jù),否則報(bào)錯(cuò)J堪堋4沉健!
selectBatchIds方法(批量查詢根據(jù)ID)
相關(guān)代碼:
/**
* 批量查詢谅将,根據(jù)Id
* @throws Exception
*/
@Test
public void testSelectBatchIds() throws Exception {
ArrayList<Integer> Ids = new ArrayList<Integer>();
Ids.add(1);
Ids.add(2);
Ids.add(3);
List<Employee> list = employeeMapper.selectBatchIds(Ids);
System.out.println(list);
}
日志輸出:
DEBUG 06-08 21:06:49,409 ==> Preparing: SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE id IN ( ? , ? , ? ) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:06:49,440 ==> Parameters: 1(Integer), 2(Integer), 3(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:06:49,457 <== Total: 3 (JakartaCommonsLoggingImpl.java:54)
控制臺輸出:
[
Employee [id=1, lastName=Tom, email=tom@tomxwd.top, gender=1, age=22],
Employee [id=2, lastName=Jerry, email=jerry@tomxwd.top, gender=0, age=25],
Employee [id=3, lastName=Black, email=black@tomxwd.top, gender=1, age=30]
]
selectByMap方法(根據(jù)Map對象進(jìn)行條件查詢)
需要注意的是漾狼,Map中封裝的key是column名,也就是數(shù)據(jù)庫中的列名饥臂,而不是實(shí)體類的屬性名逊躁。
相關(guān)代碼:
/**
* 根據(jù)Map對象查詢,即是封裝為Map對象隅熙,條件查詢
* @throws Exception
*/
@Test
public void testSelectByMap() throws Exception {
Map<String,Object> columnMap = new HashMap<String, Object>();
columnMap.put("last_name", "Marry");
List<Employee> list = employeeMapper.selectByMap(columnMap);
System.out.println(list);
}
日志輸出:
DEBUG 06-08 21:13:16,779 ==> Preparing: SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee WHERE last_name = ? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:13:16,808 ==> Parameters: Marry(String) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:13:16,824 <== Total: 3 (JakartaCommonsLoggingImpl.java:54)
控制臺輸出:
[Employee [id=5, lastName=Marry, email=marry@tomxwd.top, gender=0, age=18], Employee [id=6, lastName=Marry, email=marry@tomxwd.top, gender=0, age=18], Employee [id=7, lastName=Marry, email=marry@tomxwd.top, gender=0, age=18]]
selectPage方法(分頁查詢)
第一個(gè)參數(shù):Page對象稽煤,繼承了Pagination對象,而Pagination對象又繼承了RowBounds對象(Mybatis的分頁對象)
第二個(gè)參數(shù)是條件對象囚戚,后續(xù)說明酵熙,此處不用。
相關(guān)代碼:
/**
* 分頁查詢
* 第一個(gè)對象為Page對象驰坊,繼承了Pagination對象匾二,而Pagination對象繼承RowBounds(Mybatis的分頁對象)
* 第二個(gè)對象是條件對象
* @throws Exception
*/
@Test
public void testSelectPage() throws Exception {
List<Employee> list = employeeMapper.selectPage(new Page<Employee>(2, 2), null);
System.out.println(list);
}
日志輸出:
DEBUG 06-08 21:20:29,110 ==> Preparing: SELECT id,last_name AS lastName,email,gender,age FROM tbl_employee (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:20:29,181 ==> Parameters: (JakartaCommonsLoggingImpl.java:54)
控制臺輸出:
[
Employee [id=3, lastName=Black, email=black@tomxwd.top, gender=1, age=30],
Employee [id=4, lastName=White, email=white@tomxwd.top, gender=0, age=35]
]
根據(jù)日志信息可知,并沒有看到limit子句庐橙,說明底層還是用了Mybatis提供的RowBounds分頁假勿。使用的是內(nèi)存的分頁方式借嗽。
如果想要做到真正的物理分頁(limit)還是要依賴一些分頁插件來做(PageHelper等)态鳖。
deleteById方法(根據(jù)id刪除)
相關(guān)代碼:
/**
* 根據(jù)id刪除數(shù)據(jù)
* @throws Exception
*/
@Test
public void testDeleteById() throws Exception {
Integer result = employeeMapper.deleteById(9);
System.out.println(result);
}
日志輸出:
DEBUG 06-08 21:30:41,429 ==> Preparing: DELETE FROM tbl_employee WHERE id=? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:30:41,470 ==> Parameters: 9(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:30:41,473 <== Updates: 1 (JakartaCommonsLoggingImpl.java:54)
控制臺輸出:
1
deleteByMap方法(map來封裝列名信息)
map的key是列名,而不是實(shí)體類的屬性名恶导。
相關(guān)代碼:
/**
* 根據(jù)columnMap條件刪除數(shù)據(jù)
* @throws Exception
*/
@Test
public void testDeleteByMap() throws Exception {
Map<String, Object> columnMap = new HashMap<String, Object>();
columnMap.put("last_name", "Marry");
columnMap.put("gender", 0);
Integer result = employeeMapper.deleteByMap(columnMap);
System.out.println(result);
}
日志輸出:
DEBUG 06-08 21:35:50,642 ==> Preparing: DELETE FROM tbl_employee WHERE gender = ? AND last_name = ? (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:35:50,674 ==> Parameters: 0(Integer), Marry(String) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:35:50,677 <== Updates: 3 (JakartaCommonsLoggingImpl.java:54)
控制臺輸出:
3
deleteBatchIds方法(根據(jù)Id批量刪除)
相關(guān)代碼:
/**
* 根據(jù)Id批量刪除
* @throws Exception
*/
@Test
public void testDeleteBatchIds() throws Exception {
List<Integer> Ids = new ArrayList<Integer>();
Ids.add(10);
Ids.add(11);
Integer result = employeeMapper.deleteBatchIds(Ids);
System.out.println(result);
}
日志輸出:
DEBUG 06-08 21:43:24,751 ==> Preparing: DELETE FROM tbl_employee WHERE id IN ( ? , ? ) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,838 ==> Parameters: 10(Integer), 11(Integer) (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,840 <== Updates: 2 (JakartaCommonsLoggingImpl.java:54)
控制臺輸出:
2
MP啟動注入SQL原理分析
問題:
XxxMapper繼承了BaseMapper<T>,BaseMapper中提供了通用的CRUD方法浆竭,方法來源于BaseMapper,有方法就必須有SQL惨寿,因?yàn)镸ybatis最終還是要通過SQL語句來操作數(shù)據(jù)邦泄。
前置知識:
Mybatis源碼中有比較重要的一些對象,Mybatis框架的執(zhí)行流程裂垦。
- Configuration 全局配置對象
- MappedStatement
- ......
通過現(xiàn)象看到本質(zhì)
- employeeMapper的本質(zhì):org.apache.ibatis.binding.MapperProxy
- MapperProxy中顺囊,有一個(gè)sqlSession-->SqlSessionFactory。
- SqlSessionFactory-->Configuration-->MappedStatements蕉拢,(每一個(gè)MappedStatement都表示Mapper接口中的一個(gè)方法與Mapper映射文件中的一個(gè)SQL)特碳。在這里面-->sqlSource-->sql里面就是要執(zhí)行的sql語句诚亚。
也就是說,MP在啟動的時(shí)候會挨個(gè)分析XxxMapper中的方法午乓,并且將對應(yīng)的SQL語句處理好站宗,保存到Configuration對象的MappedStatements中。
本質(zhì)
對象介紹:
- sqlMethod:枚舉對象益愈,MP支持的SQL方法
- TableInfo:數(shù)據(jù)庫表反射信息梢灭,可以獲取到數(shù)據(jù)庫表相關(guān)的信息。
- sqlSource:SQL語句處理對象
- MapperBuilderAssistant:用于緩存蒸其、SQL參數(shù)敏释、查詢返回結(jié)果集處理等。
通過MapperBuilderAssistant添加到Configrration中的mappedstatements中去摸袁。
DEBUG 06-08 21:43:24,522 Invoking afterPropertiesSet() on bean with name 'employeeMapper' (AbstractAutowireCapableBeanFactory.java:1670)
DEBUG 06-08 21:43:24,567 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.deleteById (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,570 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.deleteBatchIds (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,573 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.updateById (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,575 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.updateAllColumnById (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,575 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectById (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,576 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectBatchIds (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,579 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.insert (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,581 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.insertAllColumn (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,584 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.delete (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,586 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.deleteByMap (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,588 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.update (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,590 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.updateForSet (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,592 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectByMap (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,602 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectOne (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,604 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectCount (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,608 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectList (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,610 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectPage (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,612 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectMaps (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,614 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectMapsPage (JakartaCommonsLoggingImpl.java:54)
DEBUG 06-08 21:43:24,616 addMappedStatement: top.tomxwd.mp.mapper.EmployeeMapper.selectObjs (JakartaCommonsLoggingImpl.java:54)
從日志信息中可以看出颂暇,在啟動的時(shí)候,會把每一個(gè)方法構(gòu)建成每個(gè)MappedStatement但惶。
整個(gè)構(gòu)造流程
- AutoSqlInjector(SQL自動注入器)
- injectDeleteByIdSql方法構(gòu)建出SqlSource(languageDriver.createSqlSource(configuration,sql,modelClass;)
- this.addDeleteMappedStatement(mapperClass,sqlMethod.getMethod(),sqlSource)
- builderAssistant.addMappedStatement->configuration.addMappedStatement(statement);最終注入到configuration中耳鸯。
總結(jié)
- 以上是基本的CRUD操作,我們僅僅需要繼承一個(gè)BaseMapper接口膀曾,就可以實(shí)現(xiàn)大部分的單標(biāo)CRUD操作县爬。BaseMapper提供了多達(dá)17個(gè)方法給我們使用,可以很方便的實(shí)現(xiàn)單一添谊、批量财喳、分頁等操作。極大減少開發(fā)負(fù)擔(dān)斩狱,難道這就是MP的強(qiáng)大之處嗎耳高?
- 提出需求:
現(xiàn)在有一個(gè)需求,我們需要分頁查詢Employee表中所踊,年齡在18-50之間性別為難而且姓名為Xx的用戶泌枪,這時(shí)候我們怎么實(shí)現(xiàn)上述需求呢?
Mybatis:需要在SQL映射文件中編寫帶有條件查詢的SQL秕岛,并且基于PageHelper插件完成分頁碌燕。
實(shí)現(xiàn)上面一個(gè)簡單的需求,往往需要我們做很多重復(fù)單調(diào)的工作继薛。普通的Mapper能夠解決這類痛點(diǎn)嗎修壕?
MP:依舊不用編寫SQL語句,MP提供了功能強(qiáng)大的條件構(gòu)造器EntityWrapper遏考。