03_Mybatis-Plus入門CRUD

03_Mybatis-Plus入門CRUD


通用的CRUD(入門DEMO)

  1. 提出問題:


    假設(shè)我們已經(jīng)存在一張tbl_employee表,且已有對應(yīng)的實(shí)體類Employee际插,實(shí)現(xiàn)tbl_employee表的CRUD操作我們需要做什么巡李?
  2. 實(shí)現(xiàn)方式:

  • 基于Mybatis:
    • 需要編寫EmployeeMapper接口眉反,并手動編寫CRUD方法琅轧。
    • 提供EmployeeMapper.xml映射文件,并手動編寫每個(gè)方法對應(yīng)的SQL語句虏等。
  • 基于MP
    • 只需要創(chuàng)建EmployeeMapper接口,并繼承BaseMapper接口适肠,這就是使用MP需要完成的所有操作霍衫,甚至不用創(chuàng)建SQL映射文件。
  1. 具體實(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操作所需要做的事情逛揩。

  1. 測試:
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注解。相對麻煩裕循,如果用全局配置臣嚣,則一步到位。

  1. 字段駝峰原則
  2. 配置全局主鍵策略
  3. 配置全局表前綴策略
  4. 后續(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ì)

  1. employeeMapper的本質(zhì):org.apache.ibatis.binding.MapperProxy
  2. MapperProxy中顺囊,有一個(gè)sqlSession-->SqlSessionFactory。
  3. SqlSessionFactory-->Configuration-->MappedStatements蕉拢,(每一個(gè)MappedStatement都表示Mapper接口中的一個(gè)方法與Mapper映射文件中的一個(gè)SQL)特碳。在這里面-->sqlSource-->sql里面就是要執(zhí)行的sql語句诚亚。


    也就是說,MP在啟動的時(shí)候會挨個(gè)分析XxxMapper中的方法午乓,并且將對應(yīng)的SQL語句處理好站宗,保存到Configuration對象的MappedStatements中。
本質(zhì)

對象介紹:

  1. sqlMethod:枚舉對象益愈,MP支持的SQL方法
  2. TableInfo:數(shù)據(jù)庫表反射信息梢灭,可以獲取到數(shù)據(jù)庫表相關(guān)的信息。
  3. sqlSource:SQL語句處理對象
  4. 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)造流程

  1. AutoSqlInjector(SQL自動注入器)
  2. injectDeleteByIdSql方法構(gòu)建出SqlSource(languageDriver.createSqlSource(configuration,sql,modelClass;)
  3. this.addDeleteMappedStatement(mapperClass,sqlMethod.getMethod(),sqlSource)
  4. builderAssistant.addMappedStatement->configuration.addMappedStatement(statement);最終注入到configuration中耳鸯。

總結(jié)

  1. 以上是基本的CRUD操作,我們僅僅需要繼承一個(gè)BaseMapper接口膀曾,就可以實(shí)現(xiàn)大部分的單標(biāo)CRUD操作县爬。BaseMapper提供了多達(dá)17個(gè)方法給我們使用,可以很方便的實(shí)現(xiàn)單一添谊、批量财喳、分頁等操作。極大減少開發(fā)負(fù)擔(dān)斩狱,難道這就是MP的強(qiáng)大之處嗎耳高?
  2. 提出需求:

    現(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遏考。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慈鸠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子灌具,更是在濱河造成了極大的恐慌青团,老刑警劉巖像棘,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異壶冒,居然都是意外死亡缕题,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門胖腾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烟零,“玉大人,你說我怎么就攤上這事咸作∠前ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵记罚,是天一觀的道長墅诡。 經(jīng)常有香客問我,道長桐智,這世上最難降的妖魔是什么末早? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮说庭,結(jié)果婚禮上然磷,老公的妹妹穿的比我還像新娘。我一直安慰自己刊驴,他們只是感情好姿搜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捆憎,像睡著了一般舅柜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躲惰,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天致份,我揣著相機(jī)與錄音,去河邊找鬼礁扮。 笑死知举,一個(gè)胖子當(dāng)著我的面吹牛瞬沦,可吹牛的內(nèi)容都是我干的太伊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼逛钻,長吁一口氣:“原來是場噩夢啊……” “哼僚焦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曙痘,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤芳悲,失蹤者是張志新(化名)和其女友劉穎立肘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體名扛,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谅年,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肮韧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片融蹂。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弄企,靈堂內(nèi)的尸體忽然破棺而出超燃,到底是詐尸還是另有隱情,我是刑警寧澤拘领,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布意乓,位于F島的核電站,受9級特大地震影響约素,放射性物質(zhì)發(fā)生泄漏届良。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一圣猎、第九天 我趴在偏房一處隱蔽的房頂上張望伙窃。 院中可真熱鬧,春花似錦样漆、人聲如沸为障。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳍怨。三九已至,卻和暖如春跪妥,著一層夾襖步出監(jiān)牢的瞬間鞋喇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工眉撵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侦香,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓纽疟,卻偏偏與公主長得像罐韩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子污朽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言: mybatis在持久層框架中還是比較火的散吵,一般項(xiàng)目都是基于ssm。雖然mybatis可以直接在xml中通過...
    貪挽懶月閱讀 1,018,940評論 63 386
  • MyBatis是目前最流行的JDBC持久層框架,著名的ssm框架中的m矾睦。關(guān)于springboot集成mybatis...
    郭藝賓閱讀 1,198評論 0 2
  • 前言: 關(guān)于mybatis-plus的簡介以及基本使用晦款,我在《mybatis-plus的使用 ------ 入門》...
    貪挽懶月閱讀 161,674評論 58 178
  • 1. 簡介 1.1 什么是 MyBatis 勉盅? MyBatis 是支持定制化 SQL荣赶、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,456評論 0 4
  • 前言 項(xiàng)目開發(fā)一直使用MyBatis , 簡單价卤,方便淘讥,容易上手解藻,調(diào)優(yōu)比其他的ORM框架容易的多界牡。最近一次偶然的搜索...
    秋的藍(lán)閱讀 4,494評論 0 2