快速入門
入門案例
使用MybatisPlus的基本步驟:
1.引入MybatisPlus的起步依賴
MybatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且實現(xiàn)了自動裝配效果。因此,可以使用MybatisPlus的starter代替Mybatis的starter。
pom.xml
<!--mybatisplus依賴-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
2.自定義的Mapper繼承MybatisPlus提供的BaseMapper接口
public interface UserMapper extends BaseMapper<User> {
}
3.在實體類上添加注解聲明表信息
4.在application.yml中根據(jù)需要添加配置
注:如果application.yml沒有顯示綠葉,可以按照以下步驟進行添加:
File --> Project Structure --> Facets --> “+” Spring --> 右上角小綠葉 Customize Spring Boot --> 將項目中的application.yml添加進去即可
常見注解
MybatisPlus是如何獲取實現(xiàn)CRUD的數(shù)據(jù)庫信息的?
- 默認以類名駝峰轉(zhuǎn)下劃線作為表名
- 默認把名為id的字段作為主鍵
- 默認把變量名駝峰轉(zhuǎn)下劃線作為表的字段名
MybatisPlus通過掃描實體類,并基于反射獲取實體類信息作為數(shù)據(jù)庫表信息。
MybatisPlus中比較常用的幾個注解如下:
-
@TableName
:用來指定表名 -
@TableId
:用來指定表中的主鍵字段信息IdType
枚舉:
①AUTO
:數(shù)據(jù)庫自增長
②INPUT
:通過set
方法自行輸入
③ASSIGN_ID
:分配ID,接口IdentifierGenerator
的方法nextId
來生成id -
@TableField
:用來指定表中的普通字段信息
使用場景:
①成員變量名與數(shù)據(jù)庫字段名不一致
②成員變量名以is開頭,且是布爾值
③成員變量名與數(shù)據(jù)庫關(guān)鍵字沖突,如“order”,在@TableField
中要用轉(zhuǎn)義字符括起來
⑩成員變量不是數(shù)據(jù)庫字段,@TableField(exist = false)
常用配置
MyBatisPlus的配置項繼承了MyBatis原生配置和一些自己特有的配置。
application.yml
mybatis-plus:
type-aliases-package: com.wmy.mp.domain.po # 別名掃描包
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址 默認值
configuration:
map-underscore-to-camel-case: true # 是否開啟下劃線和駝峰的映射
cache-enabled: false # 是否開啟二級緩存
global-config: # 全局配置 優(yōu)先級低于局部的配置
db-config:
id-type: assign_id # id為雪花算法生成
update-strategy: not_null # 更新策略:只更新非空字段
MybatisPlus官方文檔
核心功能
條件構(gòu)造器
MybatisPlus支持各種復雜的where條件,可以滿足日常開發(fā)的所有需求。在MybatisPlus中BaseMapper接口是用來提供增刪改查功能的,其中一些比較特殊的方法的參數(shù)都不再是簡單的id,而是一個Wrapper類型的參數(shù),所謂的Wrapper就是條件構(gòu)造器,用以構(gòu)造復雜的sql語句。Wrapper并不是一個簡單的類,而是類似于Collection,具備一個復雜的繼承體系。
比如說:QueryWrapper
就是在父類基礎(chǔ)上拓展了select相關(guān)的功能,允許構(gòu)造SQL語句時能指定select哪些字段;UpdateWrapper
就是在父類基礎(chǔ)上拓展了set相關(guān)的功能,它的setSql(boolean , String ) : UpdateWrapper<T>
方法允許將set部分的字符串當做參數(shù)傳遞進去,后邊可以拼接到SQL語句中。
基于QueryWrapper的查詢案例
需求
①查詢出名字中帶"o"的,存款大于等于1000元的人的id、username、info、balance字段。
SQL語句
SELECT id,username,info,balance
FROM user
WHERE username LIKE ? AND balance >= ?
QueryWrapper查詢:UserMapperTest.java
@Test
void testQueryWrapper(){
//1.構(gòu)件查詢條件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.select("id", "username", "info", "balance")
.like("username", "o")
.ge("balance", 1000);
//2.查詢
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
//或者
@Test
void testLambdaQueryWrapper(){
//1.構(gòu)件查詢條件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.select(User::getId, User::getUsername, User::getInfo, User::getBalance)
.like(User::getUsername, "o")
.ge(User::getBalance, 1000);
//2.查詢
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::println);
}
加粗樣式
②更新用戶名為jack的用戶的余額為2000。
SQL語句
UPDATE user
SET balance = 2000
WHERE (username = "jack")
QueryWrapper查詢
@Test
void testUpdateByQueryWrapper() {
//1.要更新的數(shù)據(jù)
User user = new User();
user.setBalance(2000);
//2.更新的條件
QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");
//3.執(zhí)行更新
userMapper.update(user, wrapper);
}
基于UpdateWrapper的更新案例
需求
更新id為1,2,4的用戶的余額,扣200
SQL語句
UPDATE user
SET balance = balance - 200
WHERE id in (1, 2, 4)
UpdateWrapper查詢:UserMapperTest.java
@Test
void testUpdateWrapper(){
List<Long> ids = List.of(1L ,2L ,4L);
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance - 200")
.in("id" , ids);
userMapper.update(null , wrapper);
}
小結(jié)
- QueryWrapper和LambdaQueryWrapper通常用來構(gòu)建select、delete、update的where條件部分
- UpdateWrapper和LambdaUpdateWrapper通常只有在set語句比較特殊才使用
- 盡量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬編碼
自定義SQL
從條件構(gòu)造器的學習中可以看出,雖然MybatisPlus提供了非常靈活的關(guān)于Where條件的SQL語句拼接方式,但是它是在業(yè)務邏輯層完成的,違背了企業(yè)開發(fā)的一些規(guī)范,如果不使用的話自己在xml文件中編寫完整的SQL語句又會很麻煩。因此,我們可以利用MyBatisPlus的Wrapper來構(gòu)建復雜的Where條件,然后自定義SQL語句中剩下的部分。我們需要想一種辦法把mp構(gòu)建好的條件往下傳遞給mapper層,在xml中最終實現(xiàn)SQL語句的組裝。
步驟:
1.基于Wrapper構(gòu)建where條件
UserMapperTest.java
@Test
void testCustomSqlUpdate() {
//1.更新條件
List<Long> ids = List.of(1L , 2L , 4l);
int amount = 200;
//2.定義條件
QueryWrapper<User> wrapper = new QueryWrapper<User>().in("id" , ids);
//3.調(diào)用自定義SQL方法
userMapper.updateBalanceByIds(wrapper, amount);
}
2.在mapper方法參數(shù)中用Param注解聲明wrapper變量名稱,必須是ew
UserMapper.java
void updateBalanceByIds(@Param("ew") QueryWrapper<User> wrapper, @Param("amount") int amount);
3.自定義SQL,并使用Wrapper條件
UserMapper.xml
<update id="updateBalanceByIds">
UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
Service接口
Service接口類似于BaseMapper接口,包含了一些基本的增刪改查的代碼,跟BaseMapper相比,只多不少。
基本用法
自定義接口需要實現(xiàn)IService
接口,自定義實現(xiàn)類需要繼承IService
的實現(xiàn)類ServiceImpl
。
IUserService.java
public interface IUserService extends IService<User>{
}
UserServiceImpl.java
@Service
public class UserServiceImpl extends IServiceImpl<UserMapper, User> implements IUserService {
}
批量新增
IUserServiceTest.java文章來源:http://www.zghlxwxcb.cn/news/detail-806816.html
//方式一:普通for循環(huán)插入 提交了100000次網(wǎng)絡(luò)請求
@Test
void testSaveOneByOne(){
long b = System.currentTimeMillis();
for(int i = 1; i <= 100000 ; i++ ){
userService.save(builderUser(i));
}
long e = System.currentTimeMillis();
System.out.println("耗時:" + (e - b));
}
//方式二:IService的批量插入 每次批量插入1000條數(shù)據(jù) 插入100次即10萬條數(shù)據(jù)
@Test
void testSaveBatch(){
//1.準備一個容量為1000的集合
List<User> list = new ArrayList<>(1000);
long b = System.currentTimeMillis();
for (int i = 1; i <= 100000 ; i++){
//2.添加一個user
list.add(buildUser(i));
//3.每1000條批量插入一次
if (i % 1000 == 0){
userService.saveBatch(list);
//4.清空集合 準備下一批數(shù)據(jù)
list.clear();
}
}
}
方式二相較于方式一,采用的是批處理的方式,速度快了近十倍,方拾貳需要向網(wǎng)絡(luò)請求100次,但是由于在預編譯的過程中,每次的1000條數(shù)據(jù)是被編譯成了1000條SQL語句,所以MySQL在執(zhí)行的過程中就是逐條執(zhí)行的,所以方式二仍然有改進空間,可以通過配置jdbc參數(shù),在application.yaml的url后面拼接上一個參數(shù)rewriteBatchedStatements=true
,開啟該參數(shù)之后,相當于把100000條插入語句變成了一個包含了100000條插入值的語句,只需要執(zhí)行一次,速度上會快很多,這才是真正意義上的批處理。文章來源地址http://www.zghlxwxcb.cn/news/detail-806816.html
到了這里,關(guān)于MybatisPlus框架入門級理解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!