一篇文章帶你學(xué)習(xí)Mybatis-Plus(新手入門(mén))
Mybatis-Plus
1.快速入門(mén)地址:安裝 | MyBatis-Plus (baomidou.com)
2.創(chuàng)建數(shù)據(jù)庫(kù)mybatis-plus
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主鍵ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年齡',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES (1, 'Jone', 18, 'test1@baomidou.com'), (2, 'Jack', 20, 'test2@baomidou.com'), (3, 'Tom', 28, 'test3@baomidou.com'), (4, 'Sandy', 21, 'test4@baomidou.com'), (5, 'Billie', 24, 'test5@baomidou.com');
以上數(shù)據(jù)的運(yùn)行均在cmd命令運(yùn)行
3.創(chuàng)建springboot項(xiàng)目,配置yml文件
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis_plus?userSSL=false&Unicode=true&CharacterEncoding=utf-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
4.導(dǎo)入依賴
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.sxau</groupId>
<artifactId>mybatis_plus</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mybatis_plus</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- mysql-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.創(chuàng)建pojo包,新建User實(shí)體類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
//主鍵自增配合 數(shù)據(jù)庫(kù)主鍵自增使用
@TableId(type = IdType.AUTO)
private Long id;
private String name;
private int age;
private String email;
}
6.創(chuàng)建mapper包,新建UserMapper實(shí)體類
package com.sxau.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sxau.pojo.User;
import org.springframework.stereotype.Repository;
@Repository
public interface Usermapper extends BaseMapper<User> {
//所有CRUD操作已經(jīng)完成
//不需要一大堆的。xml配置文件
}
7.在主啟動(dòng)類中加上Mapperscan注解掃描mapper映射文件
@MapperScan("com.sxau.mapper")
8.查詢所有數(shù)據(jù)測(cè)試類
package com.sxau.mybatis_plus;
import com.baomidou.mybatisplus.annotation.IdType;
import com.sxau.mapper.Usermapper;
import com.sxau.pojo.User;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@MapperScan("com.sxau.mapper")
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
Usermapper usermapper;
@Test
void contextLoads() {
List<User> users = usermapper.selectList(null);
users.forEach(System.out::println);
}
}
遇到這種情況,直接解決


9.開(kāi)啟mybatis-plus日志配置文件
#mybatis-plus日志配置文件
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

10.主鍵生成策略
默認(rèn) ID_WORKER 全局唯一id 對(duì)應(yīng)數(shù)據(jù)庫(kù)中的主鍵(uuid.自增id.雪花算法.redis.zookeeper)
分布式系統(tǒng)唯一id生成:https://www.cnblogs.com/haoxinyue/p/5208136.html
雪花算法😦Twitter的snowflake算法)
snowflake是Twitter開(kāi)源的分布式ID生成算法,結(jié)果是一個(gè)long型的ID。其核心思想是:使用41bit作為毫秒數(shù),10bit作為機(jī)器的ID(5個(gè)bit是數(shù)據(jù)中心,5個(gè)bit的機(jī)器ID),12bit作為毫秒內(nèi)的流水號(hào)(意味著每個(gè)節(jié)點(diǎn)在每毫秒可以產(chǎn)生 4096 個(gè) ID),最后還有一個(gè)符號(hào)位,永遠(yuǎn)是0.可以保證幾乎全球唯一
public enum IdType {
AUTO(0),//數(shù)據(jù)庫(kù)ID自增
NONE(1),//該類型為未設(shè)置主鍵類型
INPUT(2),//手動(dòng)輸入ID
//該類型可以通過(guò)自己注冊(cè)自動(dòng)填充插件進(jìn)行填充
//以下3種類型、只有當(dāng)插入對(duì)象ID 為空,才自動(dòng)填充。
ID_WORKER(3),//全局唯一ID (idWorker)
UUID(4),//全局唯一ID (UUID)
ID_WORKER_STR(5);//字符串全局唯一ID (idWorker 的字符串表示)
}
11.增加數(shù)據(jù)測(cè)試類
//主鍵自增配合 數(shù)據(jù)庫(kù)主鍵自增使用 @TableId(type = IdType.AUTO)

自增搭配使用

12.修改數(shù)據(jù)測(cè)試類
@Test
void updateUser(){
User user = new User();
user.setId(new Long(201916129));
// user.setName("張三");
user.setAge(18);
usermapper.updateById(user);
}
動(dòng)態(tài)拼接sql—簡(jiǎn)化了平常動(dòng)態(tài)配置sql的麻煩問(wèn)題


13.自動(dòng)填充
方式一:數(shù)據(jù)庫(kù)級(jí)別
設(shè)置默認(rèn)時(shí)間,在navicat創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候想要該字段的值為插入數(shù)據(jù)時(shí)候的時(shí)間:
在default中寫(xiě):CURRENT_TIMESTAMP即可


private Date createTime; //開(kāi)始時(shí)間
private Date updateTime; //更新時(shí)間

方式 二:代碼級(jí)別

全部設(shè)置為null
@TableField(fill = FieldFill.INSERT) private Date createTime; //開(kāi)始時(shí)間 @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; //更新時(shí)間
編寫(xiě)handle包,新建myMetaObjectHandle.java
package com.sxau.handle;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component //把處理器加到IOC容器中
public class myMetaObjectHandle implements MetaObjectHandler {
//插入時(shí)的填充策略
@Override
public void insertFill(MetaObject metaObject) {
log.info("Start insert fill.... ");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新時(shí)的填充策略
@Override
public void updateFill(MetaObject metaObject) {
log.info("Start update fill.... ");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
非常關(guān)鍵的一步
在springboot啟動(dòng)的主類上加載component組件
@ComponentScan("com.sxau.handle")
測(cè)試類
@Test
void insertUser(){
User user = new User();
// user.setId(new Long(201916127));
user.setName("渣渣輝");
user.setAge(10);
user.setEmail("1016942589@qq.com");
usermapper.insert(user);
System.out.println(user.toString());
}
@Test
void updateUser(){
User user = new User();
user.setId(new Long(201916137));
user.setName("李麗");
user.setAge(20);
usermapper.updateById(user);
}

14.樂(lè)觀鎖&悲觀鎖
樂(lè)觀鎖: 顧名思義十分樂(lè)觀,他總是認(rèn)為不會(huì)出現(xiàn)問(wèn)題,無(wú)論干什么都不去上鎖!如果出現(xiàn)了問(wèn)題,再次更新值測(cè)試
悲觀鎖;顧名思義十分悲觀,他總是認(rèn)為出現(xiàn)問(wèn)題,無(wú)論干什么都會(huì)上鎖!再去操作!
我們這里主要講解 樂(lè)觀鎖機(jī)制!
樂(lè)觀鎖實(shí)現(xiàn)方式:
- 取出記錄時(shí),獲取當(dāng)前version
- 更新時(shí),帶上這個(gè)version
- 執(zhí)行更新時(shí),set version = newVersion where version = oldVersion
- 如果version不對(duì),就更新失敗
15.查詢操作
//測(cè)試批量查詢
@Test
public void selectByBatchId(){
List<User> users = usermapper.selectBatchIds(Arrays.asList(1, 2, 3));
users.forEach(System.out::println);
}
//多條件查詢用map
@Test
public void selectByBatchIds(){
HashMap<String, Object> map = new HashMap<>();
map.put("age",20);
List<User> users = usermapper.selectByMap(map);
for (User user : users) {
System.out.println(user);
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
springboot 配置日志 打印不出來(lái)sql的解決方法
這篇文章主要介紹了springboot 配置日志 打印不出來(lái)sql的解決方法,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-11-11
通過(guò)Java創(chuàng)建Socket連接到服務(wù)器方式
這篇文章主要介紹了通過(guò)Java創(chuàng)建Socket連接到服務(wù)器方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
解決使用mybatis-plus時(shí),生成的SQL大寫(xiě)變小寫(xiě)加下劃線問(wèn)題
這篇文章主要介紹了解決使用mybatis-plus時(shí),生成的SQL大寫(xiě)變小寫(xiě)加下劃線問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Spring中的@ConfigurationProperties在方法上的使用詳解
這篇文章主要介紹了Spring中的@ConfigurationProperties在方法上的使用詳解,@ConfigurationProperties應(yīng)該經(jīng)常被使用到,作用在類上的時(shí)候,將該類的屬性取值?與配置文件綁定,并生成配置bean對(duì)象,放入spring容器中,提供給其他地方使用,需要的朋友可以參考下2024-01-01
Java二維數(shù)組與稀疏數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)詳解
在某些應(yīng)用場(chǎng)景中需要大量的二維數(shù)組來(lái)進(jìn)行數(shù)據(jù)存儲(chǔ),但是二維數(shù)組中卻有著大量的無(wú)用的位置占據(jù)著內(nèi)存空間,稀疏數(shù)組就是為了優(yōu)化二維數(shù)組,節(jié)省內(nèi)存空間2022-09-09
SWT(JFace)體驗(yàn)之GridLayout布局
GridLayout 布局的功能非常強(qiáng)大,也是筆者常用的一種布局方式。GridLayout是網(wǎng)格式布局,它把父組件分成一個(gè)表格,默認(rèn)情況下每個(gè)子組件占據(jù)一個(gè)單元格的空間,每個(gè)子組件按添加到父組件的順序排列在表格中。2009-06-06
使用Mybatis-plus實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的內(nèi)部字段進(jìn)行比較
這篇文章主要介紹了使用Mybatis-plus實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)表的內(nèi)部字段進(jìn)行比較方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07

