在spring framework
所支持的orm
框架中,mybatis
相比 hibernate
,spring
自己提供的支持是相對少的,這在開發過程當中對使用mybatis
進行開發的程序員來講無疑產生不少難處。java
爲此,開源上也產生了不少三方對mybatis
的一些加強工具,好比ourbatis
、mybatis-generator
等等。這篇咱們主要來講下功能豐富、如今還在迭代的一款國人開發的加強工具mybatis-plus
。就像官方文檔說的那樣mysql
咱們的願景是成爲 MyBatis 最好的搭檔,就像 魂鬥羅 中的 1P、2P,基友搭配,效率翻倍。git
能夠看出,mybatis-plus
是了爲了提升效率和簡化配置而生的。下面就來展現下在springboot
下如何整合mybatis-plus
程序員
首先是建立一個springboot
工程github
引入相關依賴(springboot
相關、mybaits
、mybatis-plus
等等)web
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot對mybaits的自動配置依賴 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mybatis-plus相關依賴 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
</dependencies>
複製代碼
使用mybaits-plus
的代碼生成器映射生成代碼,咱們這裏所使用的數據庫爲mysql
。這個在另一篇文章上說明,這裏就不講述了。spring
在這裏,mybaits-plus
提供了BaseMapper
、BaseService
這些基類來提供一些操做的支持,好比sql
save(T t)
saveOrUpdate(T t)
update(T t, Wrapper<T> wrapper)
page(IPage<T> page, Wrapper<T> queryWrapper)
等等。數據庫
下面,咱們就簡單介紹下springboot
中怎麼運用mybaits-plus
小程序
首先是說到配置,這裏默認以yml
文件來進行對mybaits-plus
的配置。
mybatis-plus:
#MyBatis Mapper 所對應的 XML 文件位置
mapper-locations: classpath*:mapper/*.xml
# MyBaits 別名包掃描路徑,經過該屬性能夠給包中的類註冊別名,
#註冊後在 Mapper 對應的 XML 文件中能夠直接使用類名,而不用使用全限定的類名(即 XML 中調用的時候不用包含包名)
typeAliasesPackage: com.luwei.models
# 與 typeAliasesPackage 一塊兒使用,僅掃描以該類做爲父類的類
# type-aliases-super-type: java.lang.Object
# 配置掃描通用枚舉,配置該屬性,會對枚舉類進行注入
typeEnumsPackage: com.luwei.demo.mybatisplusdemo.envm
# 該包下的類註冊爲自定義類型轉換處理類,用於屬性類型轉換
# type-handlers-package: com.luwei.demo.mybatisplusdemo.handler
# 指定 mybatis 處理器
# executorType: simple
configuration:
#使用駝峯法映射屬性,配置這個resultType能夠映射
map-underscore-to-camel-case: true
global-config:
db-config:
# 配置代表前綴,例如表設計時錶名爲tb_manager,對應entity爲Manager
table-prefix: tb_
#邏輯已刪除值
logic-delete-value: 1
#邏輯未刪除值
logic-not-delete-value: 0
# 是否開啓like查詢,即對 stirng 字段是否使用 like,默認不開啓
# column-like: false
logging:
level:
# 日誌級別,顯示操做sql
com.luwei.demo.mybatisplusdemo.mapper: debug
複製代碼
基本上這些配置都能知足通常的應用了。
上面說到,BaseMapper
和BaseService
已經實現了一些基本操做,下面簡單說下這些接口的用法
查詢中Mybatis-plus
提供多種封裝好的方式,包括對主鍵查詢、指定條件查詢、分頁查詢等。
Manager manager1 = managerService.getById(1);
Assert.assertNotNull(manager1);
LambdaQueryWrapper<Manager> wrapper = new LambdaQueryWrapper<Manager>().like(Manager::getName, "na");
List<Manager> managerList = managerService.list(wrapper);
Assert.assertFalse(managerList.isEmpty());
//先配置page分頁插件配置
Page page = new Page<>(1, 2);
IPage<Manager> managerPage = managerService.page(page, wrapper);
Assert.assertFalse(managerPage.getRecords().isEmpty());
//獲取map對象
Map<String, Object> map = managerService.getMap(wrapper);
System.out.println(map);
Object obj = managerService.getObj(wrapper);
System.out.println(obj);
try {
//如有多個結果,拋出異常
managerService.getOne(wrapper, true);
}catch (RuntimeException e) {
e.printStackTrace();
System.out.println("異常捕獲");
}
複製代碼
save(T t)
方法,實際就是將對象持久化到數據庫中,這裏會產生一條insert語句,並執行。
@Transactional
public void add() {
Manager manager = new Manager();
manager.setAccount("account");
manager.setRole(RoleEnum.ROOT);
manager.setPassword("password");
manager.setName("name");
save(manager);
}
複製代碼
日誌輸出:
==> Preparing: INSERT INTO tb_manager ( account, name, password, role ) VALUES ( ?, ?, ?, ? )
==> Parameters: account(String), name(String), password(String), 0(Integer)
<== Updates: 1
複製代碼
提供的update
、updateOrSave
、upateById
均可以實現數據更新。 各自的區別在於
update
:根據條件篩選並更新指定字段updateOrSave
:對對象進行更新,對未存儲的對象進行插入updateById
:根據id對對象進行更新@Transactional
public void updateManager() {
Manager manager = getById(1);
manager.setName("testUpdate");
updateById(manager);
//saveOrUpdate(manager);
//update(new Manager(), new UpdateWrapper<Manager>().lambda().set(Manager::getName, "test").eq(Manager::getManagerId, 1));
}
複製代碼
在刪除中,除了通常的物理刪除外,mybaits-plus
還提供了邏輯刪除的支持。
若是須要使用邏輯刪除,除了上述配置外,還須要添加一個配置bean來裝配插件。
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
複製代碼
這樣在使用刪除時,會對記錄中標記爲刪除標識的字段進行更改,在查詢和更新時,也只是針對刪除標識爲未刪除的記錄。
public void deleteManager() {
LambdaQueryWrapper<Manager> wrapper = new LambdaQueryWrapper<Manager>().eq(Manager::getManagerId, 4);
System.out.println(baseMapper.delete(wrapper));
/*Map<String, Object> deleteMap = new HashMap<>(); //使用表字段名 deleteMap.put("manager_id", 4); baseMapper.deleteByMap(deleteMap);*/
/*baseMapper.deleteById(4);*/
//屬於service下的方法
/*LambdaQueryWrapper<Manager> wrapper = new LambdaQueryWrapper<Manager>().eq(Manager::getManagerId, 4); remove(wrapper);*/
}
複製代碼
在查詢、更新、刪除這些操做中,咱們每每須要定義條件或者設置屬性,也就是where
子句和set
語句,若是不是直接經過sql去處理,在mybatis-plus
中,也提供了一種包裝器來實現。
AbstractWrapper
囊括了幾乎知足平常須要的條件操做,和jpa
的specification
同樣,它支持動態產生條件,也支持使用lambda
表達式去組裝條件。他是QueryWrapper
和UpdateWrapper
的父類
一些經常使用的wrapper
方法
Map<String, Object> conditionMap = new HashMap<>();
//使用表字段名
conditionMap.put("name", "name");
conditionMap.put("manager_id", 1);
//allEq(BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull)
//filter:忽略字段
//null2IsNull:爲true則在map的value爲null時調用 isNull 方法,爲false時則忽略value爲null的
QueryWrapper<Manager> queryWrapper = new QueryWrapper<Manager>().allEq((r, v) -> r.indexOf("name") > 0, conditionMap, true);
managerService.list(queryWrapper);
複製代碼
//like(R column, Object val) -> column like '%na%'
//likeLeft -> column like '%na'
//likeRight -> column like 'na%'
//and(Function<This, This> func) -> and (column = val)
LambdaQueryWrapper<Manager> lambdaWrapper = new LambdaQueryWrapper<Manager>().like(Manager::getName, "na").and((r) -> r.eq(Manager::getDisabled, false));
managerService.list(lambdaWrapper);
複製代碼
//orderBy(boolean condition, boolean isAsc, R... columns) -> order by columns isAsc
LambdaQueryWrapper<Manager> lambdaWrapper = new LambdaQueryWrapper<Manager>().orderBy(true, false, Manager::getManagerId);
managerService.list(lambdaWrapper);
複製代碼
//select 用於挑選屬性
LambdaQueryWrapper<Manager> lambdaWrapper = new LambdaQueryWrapper<Manager>().select(Manager::getName, Manager::getDisabled);
managerService.list(lambdaWrapper);
複製代碼
//set(R column, Object val) -> update T set colunm = val
managerService.update(new Manager(), new UpdateWrapper<Manager>().lambda().set(Manager::getName, "newName").eq(Manager::getManagerId, 4));
複製代碼
諸如還有其餘像eq
,lte
,isNull
,orderBy
,or
,exists
等限定方法,這裏就不一一介紹了。
引入分頁,除了配置上,還須要添加插件bean
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
複製代碼
在使用時,自定義查詢中,參數中添加Page
對象,並要求放在參數中的第一位
IPage<ManagerPageVO> selectManagerPage(Page page, @Param("roleEnum")RoleEnum roleEnum, @Param("managerId") Integer managerId, @Param("name") String name);
複製代碼
<select id="selectManagerPage" resultType="com.luwei.pojos.manager.ManagerPageVO">
<![CDATA[
select manager_id, account, name, role, disabled, create_time, last_login_time from tb_manager where role = #{roleEnum} and deleted = false
]]>
<if test="name != null">
<![CDATA[
and (name like CONCAT('%',#{name},'%') or account like CONCAT('%',#{name},'%'))
]]>
</if>
<if test="managerId != null">
<![CDATA[
and manager_id = #{managerId}
]]>
</if>
</select>
<select id="selectForSpecialCondition" resultType="com.luwei.entity.Manager">
select
<include refid="Base_Column_List" />
from tb_manager
where name like '%admin%'
</select>
複製代碼
在mybaits-plus
中,有多種主鍵生成策略,它們分別是
因爲咱們公司使用的是mysql
自己的自增策略,因此選擇使用 IdType.AUTO。
@ApiModelProperty(value = "管理員id")
@TableId(value = "manager_id", type = IdType.AUTO)
private Integer managerId;
複製代碼
至於 ID_WORKER 和 UUID 的不一樣,在於它們的惟一鍵生成策略不一樣,ID_WORKER 按照官方的介紹,是使用Sequence
做爲基礎產生惟一鍵。
爲了讓mybaits
更好地使用枚舉,mybatis-plus
提供了枚舉掃描注入
具體配置,首先是配置掃描路徑
# 配置掃描通用枚舉,配置該屬性,會對枚舉類進行注入
typeEnumsPackage: com.luwei.demo.mybatisplusdemo.envm
複製代碼
在枚舉類中實現接口,用於獲取具體值
//實現此接口用於獲取值
public interface BaseEnum<E extends Enum<?>, T> {
T getValue();
String getDisplayName();
}
複製代碼
這樣,基本上就能夠在mybatis
上使用枚舉類型了。
上面描述了mybitis-plus
基本用法,其實除了以上,它還提供了不少方便的插件和應用,包括xml熱加載、樂觀鎖插件、性能分析插件等,這些因爲篇幅和主題的緣由我就不在這裏闡述了。但願這篇能夠帶你很快地上手這個當前熱門的mybaits
加強工具,提升開發效率。
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
---|---|---|---|---|---|---|---|---|
掘金 | segmentfault | V2EX | 知乎 | 博客園 | 開源中國 | github | 簡書 | 蘆葦科技 |
廣州蘆葦科技Java開發團隊
蘆葦科技-廣州專業軟件外包服務公司
提供微信小程序、APP應用研發、UI設計等專業服務,專一於互聯網產品諮詢、品牌設計、技術研發等領域
訪問 www.talkmoney.cn 瞭解更多
萬能說明書 | 早起日記Lite | 凹凸壁紙 | 言財