zhouzhaoxin
zhouzhaoxin 主攻python,喜欢读书,喜欢摄影,芒格的忠实追随者。关注各个领域发展,取长补短,擅长结合多学科技术解决问题

Spring Boot踩坑之路二

Spring Boot踩坑之路二

上篇文章使用Maven构建项目并成功运行hello,让我初步感受Spring Boot的强大。本次我将使用更优雅的方式创建Spring Boot项目并学习它对数据库的相关操作

更优雅的创建Spring Boot项目

上篇文章的方法是建立Maven项目、配置pom.xml、建立application类。当用到的开源项目多的时候,每次配置pom.xml很会很麻烦。使用IDEA为我们提供的Spring Initializr可以快速创建Spring Boot项目,我们将不再需要之前繁琐的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?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>
    <groupId>com.app</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Spring Boot JPA

回归主题,Spring Boot是如何操作数据库的呢,本次以Oracle数据库为例介绍Spring Boot的JPA操作(Hibernate版)

连接数据库

添加依赖(需要添加两个依赖,一个是Spring Boot操作数据库的依赖,还有一个是数据库驱动)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <!--Spring Boot java persist API dependency-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>
  <!-- Oracle数据库驱动 -->
  <!-- Oracle Driver Dependency which located in local repository -->
  <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc6</artifactId>
    <version>11.2.0</version>
</dependency>
<!-- MySql 驱动,maven官方就有,无需本地添加
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
</dependency>
-->

注意

由于商业版权和版本的问题,Maven中心仓库并不支持Oracle驱动包,所以需要根据自己的Oracle进行手动安装

首先从Oracle安装目录中找到本地Oracle驱动,以我为例:

E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib 进入我的路径将ojdbc添加到本地Maven仓库

mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.2.0.1.0 -Dpackaging=jar -Dfile=ojdbc6.jar – 指定坐标、打包格式、打包文件 回车安装

添加属性配置

加载了SpringBoot连接和驱动依赖当然不能让我们连接到数据库,我们还需要告诉Spring Boot一些数据库连接信息

我们只需要在application.properties文件中添加就可以了

基本的连接信息,指定数据源

spring.datasource.url = jdbc:oracle:thin:@127.0.0.1:1521:orcl spring.datasource.username = scott spring.datasource.password = orcl spring.datasource.driverClassName = oracle.jdbc.OracleDriver

java持久化API Hibernate配置模式

spring.jpa.hibernate.ddl-auto = update 新建实体类,并交给Hibernate 维护

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.example.entity;
import javax.persistence.*;
@Entity
@Table(name = "demo_user")
public class User {
    @Id @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_user")
    @SequenceGenerator(name = "seq_user",sequenceName = "seq_user")
    private int id;
    private String userName;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

最后启动项目,是不是发现数据库里面多了个demo_user表了呢

遇到的问题

安装完成ojdbc驱动在pom.xml中引用仍然无效

1
创建项目的时候选择了默认C盘.m2下的仓库,而我的Maven仓库配置在D盘,所以安装的驱动的时候安装到了D盘的仓库,使用的却是系统默认的仓库,尴尬-_-!

在全部配置好之后启动工程会把表建立出来,但是当再次启动的时候竟然报了对象已由现有名称引用异常

1
2
通过log观察,他又执行了一次建表语句。我多次检查自己的配置,确实是spring.jpa.hibernate.ddl-auto = update没问题。到网上查了半天,也没找到有相似问题的结果。出去吹个风,回来发现我需要引用的驱动jar包是ojdbc6,而在pom中引入的是服务器数据库的ojdbc14。白白浪费了这么长时间<( ̄3 ̄)> 。