参考:

SpringBoot2.7.4(6):集成MyBatis连接PostGIS数据库_postgis-jdbc_碰碰qaq的博客-CSDN博客

一、依赖

需要导入的依赖有:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- 补充mybatis缺少的JDBC-Type如postGis中的geometry类型 -->
    <dependency>
        <groupId>net.postgis</groupId>
        <artifactId>postgis-jdbc</artifactId>
        <version>2.5.0</version>
    </dependency>
</dependencies>

二、配置文件

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/shuiwen
    username: postgres
    password: 123456
    driver-class-name: org.postgresql.Driver

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.example.entity
  configuration:
    # 开启驼峰命名
    map-underscore-to-camel-case: true
    # 控制台打印SQL语句
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  type-handlers-package: com.example.mybatis

三、项目结构

在这里插入图片描述

3.1 Mybatis转换类

package com.example.mybatis;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.postgis.Geometry;
import org.postgis.PGgeometry;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * @author King
 * @description: 映射Geometry类与数据库中的Geometry类型
 * @create 2023-04-01-12:47-
 */
public abstract class AbstractGeometryTypeHandler<T extends Geometry> extends BaseTypeHandler<T> {

    // 数据到数据库的回调方法
    public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
        PGgeometry geometry = new PGgeometry();
        geometry.setGeometry(parameter);
        ps.setObject(i, geometry);
    }

    // 字符串类型转换为Java的Type类型的方法
    public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
        PGgeometry pGgeometry = (PGgeometry) rs.getObject(columnName);
        if (pGgeometry == null) {
            return null;
        }
        return (T) pGgeometry.getGeometry();
    }

    public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        PGgeometry pGgeometry = (PGgeometry) rs.getObject(columnIndex);
        if (pGgeometry == null) {
            return null;
        }
        return (T) pGgeometry.getGeometry();
    }

    public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        PGgeometry pGgeometry = (PGgeometry) cs.getObject(columnIndex);
        if (pGgeometry == null) {
            return null;
        }
        return (T) pGgeometry.getGeometry();
    }
}
package com.example.mybatis;

import org.apache.ibatis.type.MappedTypes;
import org.postgis.Point;

/**
 * @author King
 * @description: 映射Point类与数据库中的Point类型
 * @create 2023-04-01-12:47-
 */
@MappedTypes(Point.class)
public class PointTypeHandler extends AbstractGeometryTypeHandler<Point> {
}

3.2 实体类

package com.example.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.postgis.Point;

/**
 * @author King
 * @description:
 * @create 2023-04-01-12:49-
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Station {
    private Integer gid;
    private String district;
    private String address;
    private String basin;
    private String riversys;
    private String river;
    private String station;
    private String type;
    private Double lng;
    private Double lat;
    private Point geometry;
}

3.3 Mapper接口

package com.example.mapper;

import com.example.entity.Station;
import org.apache.ibatis.annotations.Mapper;

/**
 * @author King
 * @description:
 * @create 2023-04-01-12:51-
 */
@Mapper
public interface StationMapper {
    // 通过监测站点名称查询监测站点的信息
    Station getInfoByStation(String station);
}

3.4 Mapper文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.StationMapper">

    <resultMap id="station" type="com.example.entity.Station">
        <id column="gid" property="gid"/>
        <result column="address" jdbcType="VARCHAR" property="address"/>
        <result column="station" jdbcType="VARCHAR" property="station"/>
        <result column="district" jdbcType="VARCHAR" property="district"/>
        <result column="basin" jdbcType="VARCHAR" property="basin"/>
        <result column="type" jdbcType="VARCHAR" property="type"/>
        <result column="river" jdbcType="VARCHAR" property="river"/>
        <result column="riversys" jdbcType="VARCHAR" property="riversys"/>
        <result column="lat" jdbcType="DOUBLE" property="lat"/>
        <result column="lng" jdbcType="DOUBLE" property="lng"/>
        <result column="geom" jdbcType="OTHER" property="geometry"
        typeHandler="com.example.mybatis.PointTypeHandler"/>
    </resultMap>

    <select id="getInfoByStation" resultMap="station">
        select * from station where station = #{station}
    </select>
</mapper>

3.5 测试

package com.example;

import com.example.entity.Station;
import com.example.mapper.StationMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class JtsApplicationTests {

    @Autowired
    private StationMapper stationMapper;

    @Test
    void contextLoads() {
        Station st = stationMapper.getInfoByStation("石门");
        System.out.println(st.toString());
    }

}

测试结果:

JDBC Connection [HikariProxyConnection@873002645 wrapping org.postgresql.jdbc.PgConnection@2b6a0ea9] will not be managed by Spring
==>  Preparing: select * from station where station = ?
==> Parameters: 石门(String)
<==    Columns: gid, district, address, basin, riversys, river, station, type, lng, lat, geom
<==        Row: 1, 河南省 南阳市, 南阳市西峡县城郊乡十亩地村, 长江, 丹江, 老灌河, 石门, 水库站, 111.475200000000001, 33.369799999999998, 0101000020E6100000CAC342AD69DE5B40C8073D9B55AF4040
<==      Total: 1

Station(gid=1, district=河南省 南阳市, address=南阳市西峡县城郊乡十亩地村, basin=长江, riversys=丹江, river=老灌河, station=石门, type=水库站, lng=111.4752, lat=33.3698, geometry=SRID=4326;POINT(111.4752 33.3698))
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐