基于vscode创建SpringBoot项目,连接postgresql数据库

1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客

2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客

3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客

4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAwesome_水w的博客-CSDN博客

目录

一、创建一个SpringBoot工程:通过IDEA的SpringInitializr创建

二、安装并创建PostgreSQL数据库

1 安装下载PostgreSQL

2 创建数据库,建表,插入数据

三、配置新创建的SpringBoot工程

0 启动项目,出现Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

1 编写application.properties,启动项目

解决报错:java: 错误: 无效的源发行版:17

解决报错:新建springboot项目时包导不进来org.springframework.boot:spring-boot-starter-parent:pom:2.7.10-SNAPSHOT failed to transfer from http://maven.aliyun.com/nexus/content/groups/public/ during a previous attempt.

四、Mybatis Generator工具

1、引入依赖

2、配置generator-config.xml生成规则

3、自动生成器

解决报错:不支援 10 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网路区段,以及驱动程序所支援的验证架构模式已被支援。

4、测试

 问题:为什么@Autowired 和private UserDOMapper userDOMapper有错但还能执行


一、创建一个SpringBoot工程:通过IDEA的SpringInitializr创建

左上角 File-New-Project-Spring Initializr,名称啥的自己设一下

Next->选择需要的依赖包,此处暂时是选择了Spring Web相关、mybatis相关以及postgresql相关包。

 

创建之后,项目建成之后目录结构是这样的:

这里会有一个叫xxxApplication的启动类,然后pom.xml里会有刚刚设置过的相关依赖包,不需要自己再引入,同时resources下会有一个application.properties,此时它是空的。

到这里一个SpringBoot项目就这么简单地创建好了,非常方便。

当然现在还是不能启动的,这个后面再说。

二、安装并创建PostgreSQL数据库

既然跟MySQL一样,同为关系型数据库,那么什么时候用MySQL,什么时候用PostgreSQL自然是我们需要去了解的。所以下面简单介绍一下,PostgreSQL相比于MySQL来说,都有哪些优势,如果你有这些需求,那么选择PostgreSQL就优于MySQL,反之则还是选择MySQL更佳:

  • 支持存储一些特殊的数据类型,比如:array、json、jsonb
  • 对地理信息的存储与处理有更好的支持,所以它可以成为一个空间数据库,更好的管理数据测量和几何拓扑分析
  • 可以快速构建REST API,通过PostgREST可以方便的为任何PostgreSQL数据库提供RESTful API的服务
  • 支持树状结构,可以更方便的处理具备此类特性的数据存储
  • 外部数据源支持,可以把MySQL、Oracle、CSV、Hadoop等当成自己数据库中的表来进行查询
  • 对索引的支持更强,PostgreSQL支持 B-树、哈希、R-树和 Gist 索引。而MySQL取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。
  • 事务隔离更好,MySQL 的事务隔离级别repeatable read并不能阻止常见的并发更新,得加锁才可以,但悲观锁会影响性能,手动实现乐观锁又复杂。而 PostgreSQL 的列里有隐藏的乐观锁 version 字段,默认的 repeatable read 级别就能保证并发更新的正确性,并且又有乐观锁的性能。
  • 时间精度更高,可以精确到秒以下
  • 字符支持更好,MySQL里需要utf8mb4才能显示emoji,PostgreSQL没这个坑
  • 存储方式支持更大的数据量,PostgreSQL主表采用堆表存放,MySQL采用索引组织表,能够支持比MySQL更大的数据量。
  • 序列支持更好,MySQL不支持多个表从同一个序列中取id,而PostgreSQL可以
  • 增加列更简单,MySQL表增加列,基本上是重建表和索引,会花很长时间。PostgreSQL表增加列,只是在数据字典中增加表定义,不会重建表。

1 安装下载PostgreSQL

如果有需要,请跳转到Windows下载安装 PostgreSQL和PostGIS工具,并解决The pgAdmin 4 server could not be contacted:_postgis下载安装_水w的博客-CSDN博客

安装postgresql后,使用自带的pgAdmin 4 访问数据库。 

2 创建数据库,建表,插入数据

(1)在开始菜单中找到pgAdmin 4,打开pgAdmin,需要输入密码【之前安装时设置的密码】,

然后,创建一个新的数据库【test-demo】,其中test-demo是数据库名,在Tables处右键-create-table,在弹出来的框里填写表名然后增加column的name和datatype就可以了。

注意:PostgreSQL本身大小写不敏感,但是在这里【非常不推荐】使用大写字母。首先带有大写字母的表的新建和查询时表名都必须带双引号,不然会报【error】postgresql relation does not exist。

  • 可以SELECT * FROM "MyUser",但是不可以SELECT * FROM MyUser
  • 如果仅仅是这样也还是没有问题的,但是如果有大写字母,在后面使用Mybatis Generator生成DO类的时候会报错:Table configuration with catalog null, schema public, and table xxx did not resolve to any tables.就是因为有大写字母引起的。

在这里我新建了一张叫【my_user】的表,两列为username和password,数据类型都为text,并设置username为主键。

(2)这里我使用的是Navicat链接postgresql数据库,输入密码开始连接,

然后,点击“新建查询”,进入之后,输入代码,在【my_user】的表中插入了一条数据,

INSERT INTO "my_user"
VALUES('alice','123456')

 

三、配置新创建的SpringBoot工程

0 启动项目,出现Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

(1) 修改pom.xml文件,设置maven检测的时候“跳过测试”,

<build>
  <plugins>
<!-- maven 打包时跳过测试 -->
   <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
       </plugins>
   <build>    

(2)然后点击右上角的绿色箭头,启动项目,

项目刚刚创建好的时候是不能运行的,运行会报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.

原因这个错误就是由于没有编写application.properties,找不到数据库的URL

1 编写application.properties,启动项目

(1)配置如下,其中Tomcat端口也可以不改,那就是8080,我是为了防止端口冲突,就随便改了一个。

  • url在数据为postgresql时是jdbc:postgresql://localhost:5432/[数据库名]
  • 后面是用户名和密码,我直接postgres登录的。
#更改Tomcat端口
server.port=8087
spring.datasource.url=jdbc:postgresql://localhost:5432/test-demo
spring.datasource.username=postgres
spring.datasource.password=123456

这个时候已经可以成功启动项目了,但是由于啥都还没写,所以访问localhost:8087(注意自己的端口号!)时,web页面上显示的会是Whitelabel Error Page。

解决报错:java: 错误: 无效的源发行版:17

场景复现:

原因:出现无效的源发行版 就是jdk版本环境不一致造成的。

解决方法

(1)先查看运行环境,确保 Project SDK 和 Project language level 版本一致 (我用的是jdk8版本)

(2)如果还没有解决 可以查看 Modules,确保版本一致(我的是1.8)

(2)还可以在Settings里面查看 java Compiler 里面的jdk版本是否一致(我的是1.8)

然后,发现问题了,这儿的版本不一致。

(4)springboot版本的问题 :springboot3.0 需要jdk17支持,如果没有安装jdk17 只需把springboot版本降低即可。

(5)所以我的解决方法是重新新建项目,

解决报错:新建springboot项目时包导不进来org.springframework.boot:spring-boot-starter-parent:pom:2.7.10-SNAPSHOT failed to transfer from http://maven.aliyun.com/nexus/content/groups/public/ during a previous attempt.

场景复现:IDEA导入maven项目后,下载jar包的时候,控制台报错,报错信息如下,

原因:大致是IDEA中的maven编译执行的时候,jar包导不进来。

解决方法

(1)在执行maven命令时忽略证书检查,

  • 在新建maven工程时,会自执行maven的各种命令
  • 在此处设置忽略证书检查
-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true

(2)在maven中央仓库(Central Repository:)中寻找,

(3)查看maven下载包的路径,

 (4)我之前创建项目的时候,选择的是版本,于是将springboot的版本改成2.1.7。

修改为2.7.7之后,重新maven配置,

修改并且load maven changes完成之后pom.xml文件可能还会爆红,这时候需要重启idea,发现成功了。

总结:如果maven中央仓库没有jar包,即使更换任意镜像,设置安全校验都不好使,可以现在maven中央仓库看是否有所缺的jar包

(2)我们对创建项目的时候生成对应的TestDemoApplication 文件稍微做一点修改,

原始的TestDemoApplication 文件如下:

加入注释@RestController,以及根目录下的方法home,

package com.example.testdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class TestDemoApplication {
    @RequestMapping("/")
    public String home(){
        return "Hello,world!";
    }
    public static void main(String[] args) {
        SpringApplication.run(TestDemoApplication.class, args);
    }

}

重新启动后再次进入就可以看到Hello World了。

四、Mybatis Generator工具

接下来需要集成持久层框架,也就是跟数据库打交道的这一层,通常持久层框架有两个:Mybatis和Hibernate, 其中Mybatis是半自动的,需要我们自己写sql,而Hibernate是全自动的,不需要咱们写sql,我记得当年ssh框架盛行时,学这玩意可费劲了,这里我们选择Mybatis。

Mybatis generator工具可以由数据库表自动生成相应的DO类、Dao类和Mapper文件。

作为一个基于 MyBatis 的独立工具,MyBatis Generator 能够通过简单的配置去帮我们生成数据表所对应的 PO、DAO、XML 等文件,减去我们手动去生成这些文件的时间,有效提高开发效率。MyBatis Generator 运行方式多样,主要可以通过以下几种方式来运行:

  1. 命令行
  2. Ant
  3. Maven
  4. Java
  5. Eclipse

1、引入依赖

既然要使用 MyBatis Generator,那么肯定我们的项目中已经配置了数据库和 MyBatis 的相关依赖,如果还没有配置,那么可以在 pom.xml 文件中进行配置,

打开原有自动生成的pom.xml,在<plugins>标签下添加新的<plugin>,添加完之后的xml文件:

<!-- mybatis generator 自动生成代码插件 -->
<plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.5</version>
        <dependencies>
            <dependency>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-core</artifactId>
                <version>1.3.5</version>
            </dependency>
            <dependency>
                <groupId>org.postgresql</groupId>
                <artifactId>postgresql</artifactId>
                <version>9.4-1201-jdbc4</version>
            </dependency>
        </dependencies>
        <executions>
            <execution>
                <id>mybatis generator</id>
                <phase>package</phase>
                <goals>
                    <goal>generate</goal>
                </goals>
            </execution>
        </executions>
        <configuration><!-- 允许移动生成的文件 -->
            <verbose>true</verbose>
            <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
        </configuration>
    </plugin>

 

完成上述步骤后,我们只是完成了 MyBatis Generator 的引入工作,要想让它正常工作,我们还需要对它进行配置,

2、配置generator-config.xml生成规则

其中代码生成的规则是依赖于这么一个xml文件:

 

所以咱们在这个指定src/main/resources的目录中新建这么一个文件:

 其内容这里是一个模板代码,如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="Mysql" targetRuntime="MyBatis3" defaultModelType="flat">

        <!-- 自动检查关键字,为关键字增加反引号 -->
        <property name="autoDelimitKeywords" value="true"/>
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!--覆盖生成XML文件-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
        <!-- 生成的实体类添加toString()方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>

        <!-- 不生成注释 -->
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost/wiki?serverTimezone=Asia/Shanghai"
                        userId="root"
                        password="你的密码">
        </jdbcConnection>

        <!-- domain类的位置 -->
        <javaModelGenerator targetProject="src/main/java"
                            targetPackage="com.cexo.wiki.domain"/>

        <!-- mapper xml的位置 -->
        <sqlMapGenerator targetProject="src/main/resources"
                         targetPackage="mapper"/>

        <!-- mapper类的位置 -->
        <javaClientGenerator targetProject="src/main/java"
                             targetPackage="com.cexo.wiki.mapper"
                             type="XMLMAPPER"/>

        <table tableName="demo" domainObjectName="Demo"/>
    </context>
</generatorConfiguration>

其中需要更改的地方主要是这几个地方,

这块根据自己的项目情况再来修改既可。

(1)在src/main/resources目录下创建mybatis-generator.xml,这个文件在官网有示例,copy下来改一改就行。

其中需要更改的地方主要是这几个地方:

  • 要改的就是数据库链接地址(如果数据库不同),URL记得换成自己的数据库名,然后用户名和密码也要改。
  • 以及后面的targetPackage和targetProject。注意如果targetPackage写的包要存在,如果没有的话先新建包,再把对应的包写上去。
  • 在这里我新建了dataobject、mapping以及dao包。

table部分每一张表都要写一个table标签,这里只建了一张表因此就一个示例。

此时的目录结构:

注意添加了mapping之后需要在application.properties中添加:

mybatis.mapper-locations=classpath*:mapping/*.xml

3、自动生成器

(1)代码生成器的配置一切ok,接下来则需要执行生成命令,这里在run这块增加一个生成命令,如下,

mybatis-generator:generate -e

可以看到右上角,出现了,

(2)接下来咱们来看一下自动生成mybais的相关代码的效果,点击run就可以看到生成的文件了。

 

此时的目录结构是这样:

解决报错:不支援 10 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网路区段,以及驱动程序所支援的验证架构模式已被支援。

场景复现:使用自动代码生成器,

原因:项目启动起来但是连接postgresql数据库报错。

解决方法:当出现这个错误的时候,不要慌,因为错误信息有提到pg_hba.conf,所以我们指定是要找到这个文件。

(1)首先找到本地的pg_hba.conf所在位置,

(2)然后,将下述代码粘贴到pg_hba.conf中,保存文件,如图所示:

# "local" is for Unix domain socket connections only
local   all             all                           trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust

(3)最后重启下该对应的pg数据库的服务即可,

(4)在idea中重新运行自动生成器,

ok,成功解决。

4、测试

(1)再次更改TestDemoApplication,如下,

package com.example.testdemo;
import com.example.testdemo.dao.MyUserDOMapper;
import com.example.testdemo.dataobject.MyUserDO;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication(scanBasePackages = {"com.example.testdemo"})
@RestController
@MapperScan("com.example.testdemo.dao")
public class TestDemoApplication {
    @Autowired private MyUserDOMapper userDOMapper;

    @RequestMapping("/")
    public String home(){
//        return "Hello,world!";
        MyUserDO userDO = userDOMapper.selectByPrimaryKey("alice");
        if (userDO == null) {
            return "用户不存在";
        } else {
            return userDO.getPassword();
        }
    }
    public static void main(String[] args) {
        SpringApplication.run(TestDemoApplication.class, args);
    }

}

(2)run的时候记得run application,而不是run刚刚配置过的Maven命令,


再次访问http://localhost:8087/,显示123456,成功。

 问题:为什么@Autowired 和private UserDOMapper userDOMapper有错但还能执行

场景复现

原因:autowired应该是idea建议使用construtor来构建的一种引入方式,mapper上的红线是idea和mybatis融合的不好的问题,不影响使用。如果你看着难受可以在mapper的接口文件里的头部加上@Repository注解。

猜你喜欢

转载自blog.csdn.net/qq_45956730/article/details/129276124