springboot版本
2.3.0
配置mybatis-plus與相關準備
1.導入相關依賴
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
2.springboot啓動類配置@MapperScan註解接口包
package com.example.homeManager;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.homeManager.mapper")
public class HomeManagerApplication {
public static void main(String[] args) {
SpringApplication.run(HomeManagerApplication.class, args);
}
}
3.編寫mapper類,添加註解以及繼承BaseMapper<T>類
package com.example.homeManager.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.homeManager.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
4.配置文件(application.properties)配置數據源
(我用的mysql是8.0.20版本,指定了時區,驅動名字有cj)
spring.datasource.url=jdbc:mysql://localhost:3306/home?serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
5.配置文件配置mybatis-plus日誌信息
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
6.編寫mybatis-plus配置類
這裏配置了樂觀鎖與分頁
package com.example.homeManager.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement
@Configuration
@MapperScan("com.example.homeManager.mapper")
public class MyBatisPlusConfig {
//樂觀鎖
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
//分頁
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 設置請求的頁面大於最大頁後操作, true調回到首頁,false 繼續請求 默認false
// paginationInterceptor.setOverflow(false);
// 設置最大單頁限制數量,默認 500 條,-1 不受限制
// paginationInterceptor.setLimit(500);
// 開啓 count 的 join 優化,只針對部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
7.編寫handler實現自動填充功能
package com.example.homeManager.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//自動填充
@Override
public void insertFill(MetaObject metaObject) {
System.out.println("插入時自動填充...");
this.setFieldValByName("createTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
System.out.println("更新時自動填充...");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
8.編寫實體類
時間屬性createTime與updateTime需要使用自動填充的功能。在設計數據庫表的時候應該要多增加幾個字段,一個是創建時間,另一個是修改時間,還有version樂觀鎖字段和是否刪除字段。
在添加一條數據的時候我們需要讓插件自動地幫我們填充新建的數據的創建時間字段數據,每當修改某條數據的時候自動幫我們修改表中修改時間的字段,因此時間屬性createTime與updateTime添加了fill屬性進行設置。
同時有version樂觀鎖字段。
還有deleted字段。
package com.example.homeManager.entity;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName(value = "sys_user")
@ApiModel(value = "User對象",description = "用戶")
public class User implements Serializable {
private static final long serialVersionUID = -2324485611576806000L;
// 數據庫的id自增方式:@TableId(value = "id",type = IdType.AUTO)
@TableId(value = "id",type = IdType.ID_WORKER_STR)
@ApiModelProperty(value = "用戶ID")
private String id;
@TableField(value = "accound")
@ApiModelProperty(value = "用戶賬號")
private String acc;
@ApiModelProperty(value = "用戶密碼")
private String password;
@ApiModelProperty(value = "用戶姓名")
private String name;
@TableField(value = "user_class")
@ApiModelProperty(value = "用戶類型")
private String userClass;
@TableField(value = "house_id")
@ApiModelProperty(value = "房間號")
private String houseId;
@TableField(value = "ruzhu_time")
@ApiModelProperty(value = "入住時間")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date ruzhuTime;
@TableField(value = "out_time")
@ApiModelProperty(value = "搬出時間",example = "2020-01-10 10:10:10")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date outTime;
@ApiModelProperty(value = "是否禁用",example = "2020-01-10 10:10:10")
private String ban;
//fill = FieldFill.INSERT自動填充數據庫表字段內容,結合MyMetaObjectHandler類
@TableField(value = "create_time",fill = FieldFill.INSERT)
@ApiModelProperty(value = "創建時間",example = "2020-01-10 10:10:10")
private Date createTime;
@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
@ApiModelProperty(value = "修改時間",example = "2020-01-10 10:10:10")
private Date updateTime;
@Version
@ApiModelProperty(value = "樂觀鎖")
private Integer version;
@TableField(value = "is_deleted")
@ApiModelProperty(value = "是否刪除")
@TableLogic
private boolean deleted;
// private UserClass userClassName;
}
9.數據庫表字段
create_time字段設置:
默認:CURRENT_TIMESTAMP
update_time字段:
類型timestamp,勾選時間戳
樂觀鎖version:
默認數據爲“1”
is_delete字段:
默認是 0;
編寫測試類:CRUDTest
測試類位置:
測試類:
package com.example.homeManager;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.homeManager.entity.User;
import com.example.homeManager.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@SpringBootTest
class CRUDTest {
@Autowired
private UserMapper userMapper;
@Test
void testInsert(){
User user = new User();
user.setAcc("super100");
user.setPassword("123456");
int insert = userMapper.insert(user);
System.out.println("影響行數:"+insert);
}
@Test
void testUpdateById(){
User user = new User();
user.setId("1263864523067252738");
user.setPassword("123455");
user.setRuzhuTime(new Date());
int result = userMapper.updateById(user);
System.out.println("影響行數:"+result);
}
@Test
void testOptimisticLocker(){
//注意:必須先查詢,獲取version的值
User user = userMapper.selectById("1263864523067252738");
//修改
user.setAcc("super101");
user.setName("lin");
//執行更新
int result = userMapper.updateById(user);
System.out.println("影響行數:"+result);
}
@Test
void testSelectMap(){
HashMap<String, Object> map = new HashMap<>();
map.put("id","1263864523067252738");
map.put("name","lin");
List<User> users = userMapper.selectByMap(map);
users.forEach(System.out::println);
}
@Test
void testSelect(){
//MP條件查詢
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("version","1")
.like("password","123");
List<User> users = userMapper.selectList(userQueryWrapper);
users.forEach(System.out::println);
}
@Test
void testSelectPage(){
/**
* 如果是關聯查詢表,則使用selectMapsPage()方法查詢
*/
Page<User> userPage = new Page<>(1,5);
QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.eq("version","1")
.like("password","123");
IPage<User> userIPage = userMapper.selectPage(userPage, userQueryWrapper);
long current = userIPage.getCurrent(); //當前頁碼
long pages = userIPage.getPages(); //總頁數
long size = userIPage.getSize(); //每頁記錄數
long total = userIPage.getTotal(); //總記錄數
System.out.println(current);
System.out.println(pages);
System.out.println(size);
System.out.println(total);
// List<User> records = userIPage.getRecords(); //當前頁的數據結合
// records.forEach(System.out::println);
}
@Test
void testDeleteById(){
int i = userMapper.deleteById("90");
System.out.println("影響行數:"+i);
}
@Test
void testDeleteBatchIds(){
int i = userMapper.deleteBatchIds(Arrays.asList("87", "88", "89"));
System.out.println("影響行數:"+i);
}
@Test
void testDeleteByMaps(){
HashMap<String, Object> map = new HashMap<>();
map.put("user_class","4");
map.put("name","哈哈");
int i = userMapper.deleteByMap(map);
System.out.println("影響行數:"+i);
}
@Test
void testLogicDelete(){
int i = userMapper.deleteById("85");
System.out.println("影響行數:"+i);
}
}
insert:
id:1265574906517786625後是 72
點擊第一個test方法運行:
插件打印數據。
查看數據庫數據:
時間屬性自動填充功能實現了
不帶樂觀鎖修改數據(第二個測試方法):
我們選擇剛剛創建的數據,修改其名字爲:zhangsan 等信息。
控制檯信息:
這裏的where條件還多了 is_delete=0
數據庫表查看數據:
成功修改數據,並且update_time字段也更新了
帶樂觀鎖修改數據(第三個測試方法):
更新的時候多了個條件version
數據庫表查看數據:
version字段也更新了
分頁(執行testSelectPage()方法):
刪除方法 id:1265583440424878081:
插件提供的delete方法其實是修改方法,這裏的刪除是邏輯刪除不是物理刪除!