MyBaits-Plus

本文作者:範佳龍,叩丁狼高級講師。原創文章,轉載請註明出處。

MyBaits-Plus

MyBatis的優點

Mybatis 是一款優秀的持久層框架,它支持定製化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。

MyBatis的缺點

但mybatis有個讓我比較頭疼的一個問題是sql工作量很大,尤其是字段多的時候。雖然說單表的增刪改查操作可以通過mybatis generator工具來生成(或者自己寫模板工具生成),但項目開發的過程中總免不了要新添加新字段,這些工具就幫不了我了,我得把新字段寫到原來的所有增刪改查的sql中。這是個痛苦的過程,特別是當你重複了很多次之後。

mybatis的單表操作也是賊麻煩的事,因爲篩選的條件可能會各種各樣,所以你不得不寫很多動態sql來兼容查詢條件,這也讓我不能集中精力去處理業務。

每當這時候,我懷念Hibernate了。嘿嘿,Hibernate加字段就賊簡單,單表操作也是賊方便。但我依然不喜歡用Hibernate,哈哈。

MyBatis-Plus

簡介

Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,爲簡化開發、提高效率而生。這是官方給的定義,關於mybatis-plus的更多介紹及特性,可以參考mybatis-plus官網。那麼它是怎麼增強的呢?其實就是它已經封裝好了一些crud方法,我們不需要再寫xml了,直接調用這些方法就行,就類似於JPA。

mybatis-plus這樣一個框架,一種集mybatis與hibernate的優點一起的框架。它提供了hibernate的單表CRUD操作的方便同時,又保留了mybatis的特性。

常用註解的介紹

看文檔https://mybatis.plus/guide/annotation.html#tablename

@TableName:數據庫表相關
@TableId:表主鍵標識
@TableField:表字段標識別

spring整合mybatis-plus:

正如官方所說,mybatis-plus在mybatis的基礎上只做增強不做改變,因此其與spring的整合亦非常簡單。只需把mybatis的依賴換成mybatis-plus的依賴,再把sqlSessionFactory換成mybatis-plus的即可。接下來看具體操-

  • 導入依賴
<!-- mp 依賴 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>2.3</version>
        </dependency>
  • 修改SqlSessionFactory
<!-- 配置SessionFactory -->
	<bean id="sessionFactory"
		class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
		<!-- 1:連接池 -->
		<property name="dataSource" ref="dataSource" />
		<!-- 2:讀取MyBatis總配置文件 -->
		<property name="configLocation" value="classpath:mybatis.xml"/>
		<!-- 3:配置別名掃描 -->
		<property name="typeAliasesPackage" value="cn.wolfcode.rbac.domain"/>
		<!-- 4:加載mapper文件 -->
		<property name="mapperLocations" value="classpath:cn/wolfcode/rbac/mapper/*Mapper.xml"/>
	</bean>

MyBatis-Plus的CRUD

模型

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString
@TableName("t_user")
public class User {
    @TableId(value = "id",type = IdType.AUTO)
    private Long id;
    private String name;
    private String sn;
}
  • mapper
public interface UserMapper extends BaseMapper<User> {
}

這樣就完成了mybatis-plus與spring的整合。首先是把mybatis和mybatis-spring依賴換成mybatis-plus的依賴,然後把sqlsessionfactory換成mybatis-plus的,然後實體類中添加@TableName@TableId等註解,最後mapper繼承BaseMapper即可。

需求:
存在一張 t_user 表,且已有對應的實體類 User,實現tb_user 表的 CRUD 操作我們需要做什麼呢?
基於 Mybatis:
需要編寫 UserMapper 接口,並在 UserMapper.xml 映射文件中手動編寫 CRUD 方法對應的sql語句。
基於 MP:
只需要創建 UserMapper 接口, 並繼承 BaseMapper 接口。
我們已經有了User、tb_user了,並且Usermapper也繼承了BaseMapper了,接下來就使用crud方法。

insert

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml"})
public class test {
    @Autowired
    private EmployeeMapper employeeMapper;
    @Test
    public void testInsert(){
        User user = new User();
        user.setName("東方不敗");
        user.setSn("[email protected]");
       
        userMapper.insert(user);
        //mybatisplus會自動把當前插入對象在數據庫中的id寫回到該實體中
        System.out.println(user.getId());
    }
}

update

@Test
public void testUpdate(){
        User user = new User();
        user.setId(1);
        user.setName("更新測試");
        //emplopyeeDao.updateById(employee);//根據id進行更新
        emplopyeeDao.updateAllColumnById(employee);//根據id進行更新,沒傳值的屬性就更新爲null
}

**注:**注意這兩個update操作的區別,updateById方法,沒有傳值的字段不會進行更新,比如只傳入了lastName,那麼age、gender等屬性就會保留原來的值;updateAllColumnById方法,顧名思義,會更新所有的列,沒有傳值的列會更新爲null。

Select

**(1)、**根據id查詢:

User user = userMapper.selectById(1);

**(2)、**根據條件查詢一條數據:

User userCondition = new User();
userCondition.setId(1);
userCondition.setName("更新測試");
//若是數據庫中符合傳入的條件的記錄有多條,那就不能用這個方法,會報錯
User user = userMapper.selectOne(userCondition);

**注:**這個方法的sql語句就是where id = 1 and last_name = 更新測試,若是符合這個條件的記錄不止一條,那麼就會報錯。

**(3)、**根據查詢條件返回多條數據:

當符合指定條件的記錄數有多條時,上面那個方法就會報錯,就應該用這個方法。

Map<String,Object> columnMap = new HashMap<>();
columnMap.put("name","東方不敗");//寫表中的列名
columnMap.put("sn","1");
List<User> users = userMapper.selectByMap(columnMap);
System.out.println(users.size());

**注:**查詢條件用map集合封裝,columnMap,寫的是數據表中的列名,而非實體類的屬性名。比如屬性名爲lastName,數據表中字段爲last_name,這裏應該寫的是last_name。selectByMap方法返回值用list集合接收。

**(4)、**通過id批量查詢:

List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List<User> users = userMapper.selectBatchIds(idList);
System.out.println(users);

**注:**把需要查詢的id都add到list集合中,然後調用selectBatchIds方法,傳入該list集合即可,該方法返回的是對應id的所有記錄,所有返回值也是用list接收。

**(5)、**分頁查詢:

List<User> users = userMapper.selectPage(new Page<>(1,2),null);
System.out.println(users);

**注:**selectPage方法就是分頁查詢,在page中傳入分頁信息,後者爲null的分頁條件,這裏先讓其爲null.

delete

**(1)、**根據id刪除:

emplopyeeDao.deleteById(1);

**(2)、**根據條件刪除:

Map<String,Object> columnMap = new HashMap<>();
columnMap.put("gender",0);
columnMap.put("age",18);
emplopyeeDao.deleteByMap(columnMap);

**注:**該方法與selectByMap類似,將條件封裝在columnMap中,然後調用deleteByMap方法,傳入columnMap即可,返回值是Integer類型,表示影響的行數。

**(3)、**根據id批量刪除:

 List<Integer> idList = new ArrayList<>();
 idList.add(1);
 idList.add(2);
 emplopyeeDao.deleteBatchIds(idList);

**注:**該方法和selectBatchIds類似,把需要刪除的記錄的id裝進idList,然後調用deleteBatchIds,傳入idList即可。

條件構造器

以上基本的 CRUD 操作,我們僅僅需要繼承一個 BaseMapper 即可實現大部分單表 CRUD 操作。BaseMapper 提供了多達 17 個方法供使用, 可以極其方便的實現單一、批量、分頁等操作,極大的減少開發負擔。但是mybatis-plus的強大不限於此,請看如下需求該如何處理:

需求:
我們需要分頁查詢 user 表中,年齡在 18~50 之間性別爲男且姓名爲 xx 的所有用戶,這時候我們該如何實現上述需求呢?

**使用MP:**依舊不用編寫 SQL 語句,MP 提供了功能強大的條件構造器 ------ EntityWrapper。

1、分頁查詢年齡在18 - 50且gender爲男、姓名爲will的用戶:

List<User> employees = userMapper.selectPage(new Page<User>(1,3),
     new EntityWrapper<User>()
        .between("age",18,50)
        .eq("gender",0)
        .eq("name","tom")
);

**注:**由此案例可知,分頁查詢和之前一樣,new 一個page對象傳入分頁信息即可。至於分頁條件,new 一個EntityWrapper對象,調用該對象的相關方法即可。between方法三個參數,分別是column、value1、value2,該方法表示column的值要在value1和value2之間;eq是equals的簡寫,該方法兩個參數,column和value,表示column的值和value要相等。注意column是數據表對應的字段,而非實體類屬性字段。

2、查詢gender爲0且名字中帶有老師、或者郵箱中帶有a的用戶:

List<User> users = userMapper.selectList(
                new EntityWrapper<User>()
               .eq("gender",0)
               .like("last_name","老師")
                //.or()//和or new 區別不大
               .orNew()
               .like("email","a")
);

**注:**未說分頁查詢,所以用selectList即可,用EntityWrapper的like方法進行模糊查詢,like方法就是指column的值包含value值,此處like方法就是查詢last_name中包含“老師”字樣的記錄;“或者”用or或者orNew方法表示,這兩個方法區別不大,用哪個都可以,可以通過控制檯的sql語句自行感受其區別。

3、查詢gender爲0,根據age排序,簡單分頁:

List<User> users = userMapper.selectList(
                new EntityWrapper<User>()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 1,3")//在sql語句後面追加last裏面的內容(改爲降序,同時分頁)
);

**注:**簡單分頁是指不用page對象進行分頁。orderBy方法就是根據傳入的column進行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是將last方法裏面的value值追加到sql語句的後面,在該案例中,最後的sql語句就變爲select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以進行降序排序和分頁。

4、分頁查詢年齡在18 - 50且gender爲0、姓名爲tom的用戶:
條件構造器除了EntityWrapper,還有Condition。用Condition來處理一下這個需求:

 List<User> users = userMapper.selectPage(
                new Page<User>(1,2),
                Condition.create()
                        .between("age",18,50)
                        .eq("gender","0")
 );

歡迎使用Markdown編輯器

你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支持,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫博客:

  1. 全新的界面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設置你喜愛的代碼高亮樣式,Markdown 將代碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支持甘特圖的mermaid語法1 功能;
  6. 增加了 多屏幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設置 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入代碼:Ctrl/Command + Shift + K
插入鏈接:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替換:Ctrl/Command + G

合理的創建標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支持6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文本的樣式

強調文本 強調文本

加粗文本 加粗文本

標記文本

刪除文本

引用文本

H2O is是液體。

210 運算結果是 1024.

插入鏈接與圖片

鏈接: link.

圖片: Alt

帶尺寸的圖片: Alt

居中的圖片: Alt

居中並且帶尺寸的圖片: Alt

當然,我們爲了讓用戶更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的代碼片

博客設置頁面,選擇一款你喜歡的代碼片高亮樣式,下面展示同樣高亮的 代碼片.

// An highlighted block
var foo = 'bar';

生成一個適合你的列表

  • 項目
    • 項目
      • 項目
  1. 項目1
  2. 項目2
  3. 項目3
  • 計劃任務
  • 完成任務

創建一個表格

一個簡單的表格是這麼創建的:

項目 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants將ASCII標點字符轉換爲“智能”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

創建一個自定義列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何創建一個註腳

一個具有註腳的文本。2

註釋也是必不可少的

Markdown將文本轉換爲 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表達式 KaTeX:

Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過歐拉積分

Γ(z)=0tz1etdt. \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的信息 LaTeX 數學表達式here.

新的甘特圖功能,豐富你的文章

Mon 06Mon 13Mon 20已完成 進行中 計劃一 計劃二 現有任務Adding GANTT diagram functionality to mermaid
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖:

張三李四王五你好!李四, 最近怎麼樣?你最近怎麼樣,王五?我很好,謝謝!我很好,謝謝!李四想了很長時間,文字太長了不適合放在一行.打量着王五...很好... 王五, 你怎麼樣?張三李四王五

這將產生一個流程圖。:

鏈接
長方形
圓角長方形
菱形
  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支持flowchart的流程圖:

Created with Raphaël 2.2.0開始我的操作確認?結束yesno
  • 關於 Flowchart流程圖 語法,參考 這兒.

導出與導入

導出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章導出 ,生成一個.md文件或者.html文件進行本地保存。

導入

如果你想加載一篇你寫過的.md文件,在上方工具欄可以選擇導入功能進行對應擴展名的文件導入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章