在使用mybatis的過程中,我們會發現需要自己寫很多的mapper和mapper.xml配置文件,很多時候會寫到相當多的重復代碼,特別是普通的增刪改查,這樣不僅會影響我們的開發效率,也會使得代碼變的冗余且可讀性較差。雖然前面使用了mybatis的自動生成插件generator,但是generator對基類繼承顯得不太友好。而mybatis-plus對此會有非常友好的支持,使用也很方便簡單
簡單的說,Mybatis-Plu(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。
這個測試案例使用的是SpringBoot
的示例,配置方式使用yml文件格式,項目的Git地址為: git@gitee.com:zhoutao825638/mybatisplus_usage_method.git
(或者直接訪問網址:https://gitee.com/zhoutao825638/mybatisplus_usage_method) 使用Intelij IDEA 直接打開即可。
POM文件引入依賴
- spring-boot-starter-web
- mysql-connector-java
- spring-boot-starter-test
- mybatisplus-spring-boot-starter
- mybatis-plus
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</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>mybatisplus-spring-boot-starter</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.1.9</version>
</dependency>
</dependencies>
創建數據庫
為了演示常見的功能,我們這里創建了一個數據庫
表結構
DROP TABLE IF EXISTS `tb_area`;
CREATE TABLE `tb_area` (
`area_id` int(2) NOT NULL AUTO_INCREMENT COMMENT '自增id',
`area_name` varchar(200) NOT NULL COMMENT '區域名稱',
`priority` int(2) NOT NULL DEFAULT '0' COMMENT '優先級',
`create_time` datetime DEFAULT NULL COMMENT '創建時間',
`update_time` datetime DEFAULT NULL COMMENT '最后修改時間',
PRIMARY KEY (`area_id`),
UNIQUE KEY `UK_AREA` (`area_name`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
插入數據
BEGIN;
INSERT INTO `tb_area` VALUES (1, '蕪湖', 10, NULL, NULL);
INSERT INTO `tb_area` VALUES (2, '合肥', 1, NULL, NULL);
INSERT INTO `tb_area` VALUES (3, '亳州', 2, NULL, NULL);
INSERT INTO `tb_area` VALUES (4, '安慶', 3, NULL, NULL);
COMMIT;
配置application.yml文件
# 配置數據源
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=true
username: root
password: administrator
driver-class-name: com.mysql.jdbc.Driver
# Mybatis-plus配置內容
mybatis-plus:
#掃描resource目錄下的mapper文件夾中的xml文件
mapper-locations: classpath:/mapper/*.xml
global-config:
#主鍵類型 0:"數據庫ID自增", 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID";
id-type: 3
#字段策略 0:"忽略判斷",1:"非 NULL 判斷"),2:"非空判斷"
field-strategy: 2
#駝峰下划線轉換
db-column-underline: true
refresh-mapper: true
#邏輯刪除配置
logic-delete-value: 0
logic-not-delete-value: 1
Bean配置文件
- MapperScan注解配置了Mapper文件的地址
@Configuration
@MapperScan("com.tao.mybatis_plus.mapper*")
public class MybatisPlusConfig {
/**
* mybatis-plus SQL執行效率插件【生產環境可以關閉】
*/
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* mybatis-plus分頁插件<br>
* 文檔:http://mp.baomidou.com<br>
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 開啟 PageHelper 的支持
paginationInterceptor.setLocalPage(true);
return paginationInterceptor;
}
/**
* 注入主鍵生成器
*/
@Bean
public IKeyGenerator keyGenerator() {
return new H2KeyGenerator();
}
/**
* 注入sql注入器
*/
@Bean
public ISqlInjector sqlInjector() {
return new LogicSqlInjector();
}
}
三層架構模式
Bean實體對象
- 首先創建了一個實體基類,里面保存了一些基本的數據類型,比如創建時間,更新時間等
public class BaseEntity<T extends Model> extends Model<T> {
private Date createTime;
private Date updateTime;
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "BaseEntity{" +
"createTime=" + createTime +
", updateTime=" + updateTime +
'}';
}
@Override
protected Serializable pkVal() {
return null;
}
}
- 然后創建新的實體繼承,注意需要使用注解標注表名
@TableName("tb_area")
public class Book extends BaseEntity<Book> implements Serializable {
@TableId
private int areaId;
private String areaName;
private int priority;
public int getAreaId() {
return areaId;
}
public void setAreaId(int areaId) {
this.areaId = areaId;
}
public String getAreaName() {
return areaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
@Override
public String toString() {
return "Book{" +
"areaId=" + areaId +
", areaName='" + areaName + '\'' +
", priority=" + priority +
'}';
}
}
DAO數據持久層
- 數據持久層創建了兩個文件 SuperMapper,作為基類Mapper
import com.baomidou.mybatisplus.mapper.BaseMapper;
public interface SuperMapper<T> extends BaseMapper<T>{
}
- 另外一個BookMapper,繼承了SuperMapper
public interface BookMapper extends SuperMapper<Book> {
}
Service層
- Service層使用接口的方式,創建以下文件
//注意繼承MyBatis-Plus的基類Service IService<Book>
public interface IBookService extends IService<Book> {
}
Service實現了上面的接口
@Service
public class BookServerImpl extends ServiceImpl<BookMapper,Book> implements IBookService {
}
Controller層
@RestController
@RequestMapping("/book")
public class IndexController {
@Autowired
private IBookService bookServer;
/**
* 查詢圖書列表
* @param index 索引
* @param page 數量
* @return String
*/
@GetMapping("/list/{index}/{page}")
public String index(@PathVariable("index") int index,@PathVariable("page") int page){
//已經集成了分頁的功能
Page<Book> bookPage = bookServer.selectPage(new Page<Book>(index, page));
return JSONObject.toJSONString(bookPage).toString();
}
}