mybatis plus配置postgreSQL及映射數組


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中做實體類映射的時候,成功的將其作為數組接收到呢?步驟如下:

  1. 定義實體類
@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包下的簡化getset函數的注解,不會的同學可以學一下,或者直接補全getset,而其他的注解也相當重要,一個都不能少,如
@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語句,不知道為什么,有知道的小伙伴可以告知一下謝謝;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM