(依旧叠甲,我也是菜鸟,悉知我的功力还很浅薄,如果有哪里做的不行欢迎批评指正,大部分代码都是借助AI辅助编写的,可能会有些问题,遇到可留言指正)
        Day 2:

一、配置后端环境

1、JDK配置

        trea不像IDEA一样有默认工程配置,trea是一个轻量级的ide,所以我们来看看怎么配置我们需要的配置环境

        首先我们下载jdk(我用的21,下载地址:Java Downloads | Oracle),然后在trea中配置JAVA环境,步骤 1:安装 Java 扩展(必须) 在 Trae 中按 Ctrl+Shift+X 打开扩展面板,搜索并安装以下扩展:

 步骤 2:配置 JDK 路径
方法一:通过命令面板配置(推荐)

1. 按 Ctrl+Shift+P 打开命令面板
2. 输入 Java: Configure Java Runtime
3. 点击 "Installed JDKs" 下的 "Add"
4. 选择你的 JDK 路径:

方法二:通过 settings.json 配置

按 Ctrl+Shift+P → 输入 Preferences: Open Settings (JSON) ,添加:

//json:

{
    "java.home": "D:\\JAVA",
    "java.jdt.ls.java.home": "D:\\JAVA"
}

2、maven配置

        trea会自动识别maven的路径,所以我们可以只配置一下maven本地jar包存放的路径,具体步骤如下:1、先找到settings.xml 文件,在你的C:\Users\zhou0\.m2\settings.xml

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 
                              https://maven.apache.org/xsd/settings-1.2.0.xsd">

    <localRepository>D:\my_maven_Local_repository</localRepository>

    <mirrors>
        <mirror>
            <id>aliyunmaven</id>
            <name>阿里云公共仓库</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <mirrorOf>central</mirrorOf>
        </mirror>
    </mirrors>

    <profiles>
        <profile>
            <id>default</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <maven.compiler.source>21</maven.compiler.source>
                <maven.compiler.target>21</maven.compiler.target>
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            </properties>
        </profile>
    </profiles>

</settings>

第七行是Maven 下载的 jar 包存到哪个地址记得自己改一下

3、新建spring boot项目

Trae 扩展(如果你已安装 Spring Boot Extension Pack)
1. 按 Ctrl+Shift+P
2. 输入 Spring Initializr: Generate a Maven Project
3. 按提示选择版本、依赖等

项目语言就选JAVA

两个名字设置,一个com.history一个gismap

Type,默认的就是Maven Project,Maven工程管理jar包很便捷。

java21

选上这几个依赖
4. 选择项目保存位置

目前的文件结构,我们按照规范给它完善一下。

需要添加controller层、dao层、model层、service层(内有Impl层)。

在com.history.gismap上右键——new——package,依次新建package,注意层级关系。

像这样:

其中MapService是接口(interface),MapServiceImpl是它的实现类(class)

MapService长这样

MapServiceImpl长这样

接下来我们再来完善依赖

把pom.xml打开,缺依赖加依赖,缺配置加配置。

<?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">
    <modelVersion>4.0.0</modelVersion>

    <!-- 变更:spring-boot-starter-parent 版本升级到 3.5.14 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.14</version>
        <relativePath/>
    </parent>

    <groupId>com.history</groupId>
    <artifactId>gismap</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gismap</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>21</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 变更:mybatis-spring-boot-starter 版本升级为 3.0.5 (兼容 Spring Boot 3.5.x) -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </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>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <!-- 变更:pagehelper 升级至 2.1.1 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <!-- 变更:Druid 升级至 1.2.25 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-3-starter</artifactId>
            <version>1.2.25</version>
        </dependency>

        <!-- 变更:JTS 升级至 1.20.0 -->
        <dependency>
            <groupId>org.locationtech.jts</groupId>
            <artifactId>jts-core</artifactId>
            <version>1.20.0</version>
        </dependency>

        <!-- 变更:Fastjson 升级至 2.0.61 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.61</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

依赖变更清单总结

  1. spring-boot-starter-parent → 3.5.14

  2. java.version → 21

  3. MyBatis Starter → 3.0.5

  4. PostgreSQL 驱动版本交由 BOM 管理(移除 <version> 和注释)

  5. Lombok 版本交由 BOM 管理(移除 <version>

  6. 删除多余的 Jackson 依赖(已包含在 web starter 中)

  7. PageHelper → 2.1.1

  8. Druid → druid-spring-boot-3-starter:1.2.25(artifactId 变化)

  9. JTS → org.locationtech.jts:jts-core:1.20.0(groupId 和包名变化)

  10. Fastjson → 2.0.61

保存就会自动下载,我们用Maven for Java 插件查看一下

至此我们的spring boot配置的差不多了

4、连接数据库

把    MyMap\java\gismap\src\main\resources\application.properties删掉,properties有时候连接不上datasource。

新建   MyMap\java\gismap\src\main\resources\application.yml文件。

内容如下:

server:
  port: 8080

spring:
  datasource:
    # 变更:使用 druid-spring-boot-3-starter 会自动配置连接池,可不提供 type,
    # 但为了明确,仍可保留,Driver 类名不变
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.postgresql.Driver   # 驱动类不变(注意 yml 中驼峰写法也可以)
    url: jdbc:postgresql://127.0.0.1:5432/postgres
    username: postgres
    password: 123456
    druid:
      initial-size: 8
      min-idle: 5
      max-active: 10
      query-timeout: 6000
      transaction-query-timeout: 6000
      remove-abandoned-timeout: 1800
      filters: stat,config   # 保持不变
  # 以下为日志配置(后续加入)
  # logging: ...

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.history.gismap.model

# 日志配置文件引用(后面会单独配置)
logging:
  config: classpath:logback-boot.xml

其中数据库url、username、password根据自己的写。

Mybatis是映射配置,sql语句都写在xml文件中。

在application.yml的同路径下,新建一个文件夹mapper,右键——New——Directory,  \java\gismap\src\main\resources\mapper

在mapper下新建一个文件HistoryGISMapper.xml,右键——New——File,\java\gismap\src\main\resources\mapper\HistoryGISMapper.xml

如图:

至此,我们的配置到此结束,现在开始正式完善代码。

二、完善代码

BUT!

博主突发奇想,既然现在ai这么牛波,那我们要不要尝试一下vibe coding(当然我还是推荐大家先理解原理,能够一步步搭建出来,再使用ai),空想不如实干,我们将通过以下两种方式完善代码,代表两条流程,我们先git保存一下,到时候二次重干的时候减少很多麻烦

1、vibe coding

1、准备提示词

我们先准备一个文档,干甚莫用呢,我们先把 老师(知乎:才华横溢吴道简)所有相关的教程给复制下来,然后拷给ai,让ai给我们生成一个提示ai生成代码的提示词(有点绕哈哈)。

我用的是最近出的DeepSeekv4,先将老师(知乎:才华横溢吴道简)的教程弄成一个文档,发给它

然后,把文档喂给ai并附上“目前我刚做到编写基本代码,生成一套提示词,能让我用vibe coding的方式完成这个后端的搭建”

2、SOLO模式编写代码

然后我们依次输入提示词(模型记得不要auto,我选的GLM-5.1,宁愿排会队 也别自动)

提示词 1:验证基本 CRUD 能跑通

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL 项目,包名 com.history.gismap。

我刚完成了基本代码编写,包括:
- PointModel(gId, nameCh, geometry)
- MapDao 接口(getCntyPoint, insertCntyPoint, updateCntyPoint, deleteCntyPoint)
- MapService 接口 + MapServiceImpl 实现类
- MapController(/history/pointmodel?gid=1)
- HistoryGISMapper.xml(基础 CRUD)
- GismapApplication 启动类(@MapperScan("com.history.gismap.dao"))
- application.yml 已配置 PostgreSQL 连接

现在我想先验证基本查询能跑通。请帮我:
1. 检查 MapServiceImpl 是否正确注入了 MapDao
2. 检查 MapController 的 getPoint 方法逻辑是否正确
3. 检查 HistoryGISMapper.xml 的 namespace 是否指向 com.history.gismap.dao.MapDao
4. 检查 resultMap 是否正确映射了 gId、nameCh、geometry 三个字段
5. 如果 geometry 字段目前还没用 TypeHandler,先用普通 String 类型接收,确保基础查询能通

把有问题的地方直接修正后,输出需要改动的完整文件代码。

提示词 2:编写 GeometryTypeHandler

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

pom.xml 中已有依赖:org.locationtech.jts:jts-core:1.19.0

现在需要在 com.history.gismap.mybatis 包下新建 GeometryTypeHandler.java,实现 PostgreSQL geometry 字段与 JTS Geometry 对象的互转。

要求:
1. 继承 BaseTypeHandler<Geometry>,加 @MappedTypes(Geometry.class)
2. setNonNullParameter:用 PGobject 写入,type 设为 "geometry",value 设为 geometry.toString()
3. getNullableResult(ResultSet, String):从 ResultSet 获取 PGobject,用 WKBReader 解析(先 hexToBytes 再 read)
4. getNullableResult(ResultSet, int):同上逻辑
5. getNullableResult(CallableStatement, int):同上逻辑
6. 所有 JTS 类的 import 必须是 org.locationtech.jts,不能是 com.vividsolutions.jts
7. 返回 null 时做空值判断

请生成完整的 GeometryTypeHandler.java。


提示词 3:更新 Mapper XML 支持 Geometry TypeHandler

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

我已有 GeometryTypeHandler(com.history.gismap.mybatis.GeometryTypeHandler)。

现在需要更新 HistoryGISMapper.xml,让 geometry 字段通过 TypeHandler 正确读写。

数据库表:v6_time_cnty_pts_utf_wgs84
字段:gid(主键)、name_ch、geom(PostgreSQL geometry 类型)

请生成完整的 HistoryGISMapper.xml,要求:
1. resultMap 中 gid 映射到 gId,name_ch 映射到 nameCh,geom 映射到 geometry 并指定 typeHandler
2. select 查询根据 gid 查询,返回完整 resultMap
3. insert 语句写入 geom 时使用 typeHandler
4. update 语句写入 geom 时使用 typeHandler
5. delete 语句根据 gid 删除
6. namespace 指向 com.history.gismap.dao.MapDao

请输出完整 XML。

提示词 4:新增 GeometryModel 实体类

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

现在需要在 com.history.gismap.model 包下新建 GeometryModel.java,用于后续缓存和 GeoJSON 输出。

要求:
1. 使用 Lombok @Getter @Setter @ToString
2. 字段:
   - gId (Integer)
   - namePy (String)
   - nameCh (String)
   - nameFt (String)
   - geometry (org.locationtech.jts.geom.Geometry)
3. JTS import 必须是 org.locationtech.jts

请生成完整代码。


提示词 5:新增 GeometryModel 对应的 Mapper 查询

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

已有 GeometryModel(gId, namePy, nameCh, nameFt, geometry)。

数据库表仍然是 v6_time_cnty_pts_utf_wgs84,字段包括 gid、name_py、name_ch、name_ft、geom。

现在需要:
1. 在 MapDao 接口中新增方法:
   - List<GeometryModel> getAllGeometry();
   - List<GeometryModel> getDynastyGeom(@Param("category") String category, @Param("start") Integer start, @Param("end") Integer end);
2. 在 HistoryGISMapper.xml 中新增对应的 select 语句:
   - getAllGeometry 查询所有记录
   - getDynastyGeom 根据 category 和时间范围查询(假设表中有 time_start 和 time_end 字段用于范围筛选)
3. resultMap 新增一个 geometryModelMap,映射所有字段,geometry 使用 TypeHandler

请生成 MapDao 新增部分 + HistoryGISMapper.xml 新增部分的完整代码。
 

提示词 6:引入 gt-geojson 依赖

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目。

现在需要在 pom.xml 中引入 geotools 的 gt-geojson 依赖,用于将 JTS Geometry 转为 GeoJSON。

请告诉我需要在 pom.xml 中添加什么内容,包括:
1. geotools 的 Maven 仓库配置(osgeo 仓库)
2. gt-geojson 依赖声明(版本 31.0)

只需要输出需要添加的 XML 片段,不需要完整的 pom.xml。
 

提示词 7:Controller 返回 GeoJSON

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

已有:
- GeometryModel(gId, namePy, nameCh, nameFt, geometry)
- MapDao 中有 getDynastyGeom(category, start, end) 方法
- MapService 接口需要新增对应方法
- pom.xml 已引入 gt-geojson:31.0

现在需要修改 MapController,新增 GeoJSON 输出接口:

要求:
1. 路径:GET /history/geometry
2. 参数:@RequestParam String category, @RequestParam Integer start, @RequestParam Integer end
3. 逻辑:
   - 调用 MapService 获取 List<GeometryModel>
   - 用 org.geotools.geojson.geom.GeometryJSON 将每个 geometry 转为 GeoJSON 字符串(用 StringWriter 接收)
   - 组装 JSONObject:包含 "number"(数量)和 "list"(JSONArray,每项包含属性字段 + geometry 的 GeoJSON)
   - 用 @ResponseBody 返回
4. 用 @Slf4j 加日志,try-catch 包裹,失败时 log.error

同时请补全:
- MapService 接口中新增 getDynastyGeom 方法签名
- MapServiceImpl 中新增对应实现

请生成 MapController、MapService、MapServiceImpl 三个文件的完整代码。
 

提示词 8:InitializingBean 启动加载本地缓存

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

已有:
- GeometryModel
- MapDao 中有 getAllGeometry() 方法
- MapService 中有对应方法

现在需要在 com.history.gismap.service.impl 包下新建 GeometryCache.java:

要求:
1. @Service 注解
2. 实现 InitializingBean 接口
3. @Slf4j 注解
4. 注入 MapService(或直接注入 MapDao)
5. 在 afterPropertiesSet() 中:
   - 查询所有 GeometryModel 数据
   - 按某个分类字段(如 namePy 的前缀或某个 category 字段)分组存入 Map<String, List<GeometryModel>>
   - log.info 打印加载了多少条数据
6. 提供 public 方法:
   - List<GeometryModel> getCategoryData(String category)
   - Map<String, List<GeometryModel>> getAllCache()

请生成完整的 GeometryCache.java。


提示词 9:Controller 改用缓存

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

已有 GeometryCache(@Service,实现了 InitializingBean,提供 getCategoryData 方法)。

现在需要修改 MapController:
1. 注入 GeometryCache(用 @Autowired)
2. getGeometry 方法改为从 GeometryCache 查询数据,不再直接调 MapService 查数据库
3. 保留 GeoJSON 转换逻辑不变
4. @Slf4j 注解
5. 所有接口方法都用 try-catch 包裹
6. 成功时 log.info,失败时 log.error 并返回错误 JSON

请生成完整的 MapController.java 最终版。
 

提示词 10:最终检查

我是 Spring Boot 3.5.14 + MyBatis + PostgreSQL + JTS 项目,包名 com.history.gismap。

所有代码已写完,请帮我做最终检查:

1. pom.xml 中所有依赖版本是否兼容 Spring Boot 3.5.14:
   - mybatis-spring-boot-starter 3.0.3
   - postgresql 42.7.1
   - druid-spring-boot-3-starter 1.2.23
   - pagehelper-spring-boot-starter 2.1.0
   - fastjson 2.0.42
   - commons-lang3 3.12.0
   - gt-geojson 31.0
   - jts-core 1.19.0

2. 所有 Java 文件中 JTS 的 import 是否全部是 org.locationtech.jts(不能有 com.vividsolutions.jts)

3. application.yml 中数据库配置是否完整(url、username、password、driver-class-name、type、mybatis 配置)

4. 启动类 @MapperScan 路径是否正确

5. 列出启动项目前需要确认的所有检查项清单

如果有问题,请直接修正并输出修正后的代码。
 

OK,今天就到这了,主要就是配置剩下的后端环境,和vibe coding环节,下篇开始手搓一遍,进行后端搭建,大家心急的可以先看大佬的教程,我们下篇见,拜拜!

该项目并非原创(侵权了私聊删QAQ),而是翻新一个知乎上的大佬的spring boot 2 + vue 2 的项目, 项目教程:知乎的才华横溢吴道简 大佬的教程 
 

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐