mybatis plus介紹
mybatis plus作為一款優秀的數據庫連接插件,在國內還是非常火爆的,其中的一些功能可以極大的提供開發人員的效率,詳情可以移步官網 https://mp.baomidou.com/guide/
mybatis在SpringBoot中的配置
基本可以參考如下的 pom.xml,這里面有MySQL和PGSQL的依賴
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>person-home-page</artifactId>
<groupId>com.heng</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>home-page-dynamicDB</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 單元測試 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- mysql驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.18</version>
</dependency>
<!-- jdbc啟動器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mybatis-plus啟動器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
連接PGSQL的信息
spring:
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://localhost:5432/Pudongtest
username: postgres
password: 123456
參照這個來基本是沒什么問題的,而難點在於 PGSQL
中存在着一個特殊的項:數組,如下:
注意,這不是字符串,而是PGSQL中的數組,具體的創建表的語句如下:
CREATE TABLE arr_test (
serial_id VARCHAR,
name VARCHAR[],
scores INTEGER[]
);
那么,如何在PGSQL中做實體類映射的時候,成功的將其作為數組接收到呢?步驟如下:
- 定義實體類
@TableName(value = "arr_test", autoResultMap = true)
@Data
public class ArrTest {
@TableField(value = "serial_id")
@TableId
String serialId;
@TableField(value = "name", jdbcType = JdbcType.ARRAY, typeHandler = ArrayTypeHandler.class)
String[] name;
@TableField(value = "scores", jdbcType = JdbcType.ARRAY, typeHandler = ArrayTypeHandler.class)
Integer[] scores;
}
注意啊,@Data
注解是lombok
包下的簡化get
和set
函數的注解,不會的同學可以學一下,或者直接補全get
和set
,而其他的注解也相當重要,一個都不能少,如
@TableName
中的autoResultMap = true
得開啟,然后 @TableField
中的 jdbcType = JdbcType.ARRAY
就是轉化數組的,而后面的 typeHandler = ArrayTypeHandler.class
中的類則是自定義的了,如下:
2. 添加自定義的轉化類
package com.jack.db.entity;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.sql.*;
public class ArrayTypeHandler extends BaseTypeHandler<Object[]> {
private static final Logger LOGGER = LoggerFactory.getLogger(ArrayTypeHandler.class);
private static final String TYPE_NAME_VARCHAR = "varchar";
private static final String TYPE_NAME_INTEGER = "integer";
private static final String TYPE_NAME_BOOLEAN = "boolean";
private static final String TYPE_NAME_NUMERIC = "numeric";
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object[] parameter, JdbcType jdbcType)
throws SQLException {
String typename = null;
if (parameter instanceof Integer[]) {
typename = TYPE_NAME_INTEGER;
} else if (parameter instanceof String[]) {
typename = TYPE_NAME_VARCHAR;
} else if (parameter instanceof Boolean[]) {
typename = TYPE_NAME_BOOLEAN;
} else if (parameter instanceof Double[]) {
typename = TYPE_NAME_NUMERIC;
}
if (typename == null) {
throw new TypeException("arraytypehandler parameter typename error, your type is " + parameter.getClass().getName());
}
// 這2行是關鍵的代碼,創建array,然后ps.setarray(i, array)就可以了
Array array = ps.getConnection().createArrayOf(typename, parameter);
ps.setArray(i, array);
}
@Override
public Object[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
return getArray(rs.getArray(columnName));
}
@Override
public Object[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return getArray(rs.getArray(columnIndex));
}
@Override
public Object[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return getArray(cs.getArray(columnIndex));
}
private Object[] getArray(Array array) {
if (array == null) {
return null;
}
try {
return (Object[]) array.getArray();
} catch (SQLException e) {
LOGGER.error("ArrayTypeHandler getArray SQLException",e);
}
return null;
}
}
可以直接拿去用,注意這里的類其實mybatis plus中也自帶了一個,但是實現的並不好,所以建議用自定義的
3. 測試
就直接在 @Test
里面測試即可,這就不細講了,如下:
@Test
public void get() {
IPage<ArrTest> arrTestIPage = new Page<>(1, 10);
IPage<ArrTest> iPage = iArrTestService.page(arrTestIPage);
List<ArrTest> arrTestList = iPage.getRecords();
arrTestList.forEach(System.out::println);
}
普及一下,上面的 IPage
是mybatis plus自帶的分頁插件,可以參考https://baomidou.com/guide/crud-interface.html#page,但是需要提前配置,配置方式如下:
4. mybatis plus配置分頁插件
(1) 在Springboot中添加配置類
@Configuration
@MapperScan("com.jack.db.mapper")
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.POSTGRE_SQL));
return interceptor;
}
}
(2) 在需要使用的地方創建IPage
(3) 解析結果,包括總記錄數和當前頁碼,結果等信息
官網配置鏈接https://baomidou.com/guide/page.html
PS:注意,使用數組功能時,對於數據庫的操作只能使用mybatis plus的API函數,而不能使用xml中的SQL語句,或者注解上面的SQL語句,不知道為什么,有知道的小伙伴可以告知一下謝謝;