基于vscode创建SpringBoot项目,连接postgresql数据库
基于vscode创建SpringBoot项目,连接postgresql数据库
1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客
2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客
目录
一、创建一个SpringBoot工程:通过IDEA的SpringInitializr创建
1 编写application.properties,启动项目
解决报错:不支援 10 验证类型。请核对您已经组态 pg_hba.conf 文件包含客户端的IP位址或网路区段,以及驱动程序所支援的验证架构模式已被支援。
问题:为什么@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
安装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 运行方式多样,主要可以通过以下几种方式来运行:
- 命令行
- Ant
- Maven
- Java
- 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注解。
更多推荐
所有评论(0)