【Java】如何在Eclipse 2023中访问Spring Boot + SQL Server

首先

数十年前创建的公司内部系统(使用Struts + Tomcat + Hibernate + SQL Server),当时运行在Windows Server 2003 R2 + SQL Server 2005上。去年我们终于将服务器升级至Windows Server 2016,但数据库仍保持SQL Server 2005。我们试图升级至SQL Server 2014,但遇到了”com.microsoft.sqlserver.jdbc.SQLServerException: 不支持该服务器版本”的错误,导致无法访问数据库。问题出在使用了sqljdbc.jar,需要将其更换为sqljdbc4.jar,但仅仅更换文件并不足以使系统正常运行,甚至无法进行环境配置。

在废弃旧环境并重新建立新环境时,这对于公司内部系统来说是一个好主意,但我们不能花太多时间。最重要的是,我目前对Java的知识还不够。

学习Java

我只在维护工作中做了一些更改类的工作,对于环境搭建和框架周边的知识基本停留在古老的状态。

为了安装 Eclipse 2023,并成功运行 Web 框架和访问 SQL Server,经过一番努力,我决定尝试了下面网站上的项目。

使用Spring Boot访问数据库(SQL Server)的方法

环境

请提供更多上下文以便更好地进行翻译。

    • Windows 11 Home

 

    • Eclipse 2023

 

    • SQL Server 2022(開発者向けの無料エディション)

 

    • Microsoft SQL Server Management Studio

 

    • Java 17

 

    • Maven

 

    • Spring Boot 3.1.0

 

    • Spring Data JPA 3.1.0

 

    • Spring Thymleaf 3.1.0

 

    • Lombok 1.18.26

 

    mssql-jdbc 11.2.3

解释

    • Mavenは、JavaプログラムをビルドするためのツールでC言語だとmakeのようなもの、pom.xmlに依存関係を記述すればSpring Bootなどのフレームワークのダウンロードなど自動でしてくれます。読み方は「メイヴェン」です。

 

    • Spring bootは、環境設定を簡略化しJavaによる開発を効率化できるフレームワークです。今回はWebアプリケーションの開発をサポートするフレームワークとして使用する。Strutsの代替と思えばいい。

 

    • Spring Data JPAは、Spring BootのO/RマッパーでJavaクラスとDBテーブルをつなぎ合わせてくれるHibernate(ハイバーネート)ライブラリを内部実装している。

 

    • Spring Thymleafは、テンプレートエンジンの1つで表示に関する処理しか記述できません、読み方は「タイムリーフ」です。

 

    Lombokは、 アノテーションによってセッターやゲッター、コンストラクターなどのクラスの機能を自動生成するためのライブラリです。読み方は「ロンボック」または「ロンボク」です。

项目创建

image.png
    • Spring Boot DevTools

 

    • Lombok

 

    • Spring Data JPA

 

    • MS SQL Server Driver

 

    • Thymleaf

 

    Spring Web
※由于默认按钮会更改其内容,因此“使用频率高”栏目的显示内容因个人而异。
image.png

源代码

根据环境的适应性,对下面网站的内容进行部分修改。
使用Spring Boot访问数据库(SQL Server)的方法。

设置DB连接信息

spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=testdb;encrypt=true;trustServerCertificate=true
spring.datasource.username=sa
spring.datasource.password=password

模特

由于javax.persistence会导致错误,因此进行了替换为jakarta.persistence。

package com.example.model;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;

@Entity
@Table(name = "weather")
public class Weather {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private Integer temperature;
    private Integer humidity;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getTemperature() {
        return temperature;
    }
    public void setTemperature(Integer temperature) {
        this.temperature = temperature;
    }
    public Integer getHumidity() {
        return humidity;
    }
    public void setHumidity(Integer humidity) {
        this.humidity = humidity;
    }
}

仓库

package com.example.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.example.model.Weather;
@Repository
public interface WeatherRepository extends JpaRepository<Weather, Integer> {
}

服务

package com.example.services;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.model.Weather;
import com.example.repository.WeatherRepository;
@Service
public class WeatherService {
    @Autowired
    WeatherRepository weatherRepository;
    /**
     * レコードを全件取得する。
     * 
     * @return
     */
    public List<Weather> findAllWeatherData() {
        return weatherRepository.findAll();
    }
}

控制器

package com.example;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.example.model.Weather;
import com.example.services.WeatherService;
@Controller
public class HelloSqlServerController {
    @Autowired
    WeatherService weatherService;
    @RequestMapping("/")
    public String hello(Model model) {
        model.addAttribute("title", "SQL Serverから取得したデータ");
        // 気象データの取得
        List<Weather> weatherDataList = weatherService.findAllWeatherData();
        model.addAttribute("weatherDataList", weatherDataList);
        return "index";
    }
}

模板

将其创建在src/main/resource文件夹下的template文件夹。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8" />
  <title></title>
</head>
<body>
<p>
  <span th:text="${title}">Hello World!</span>
</p>
<table>
  <tr th:each="data : ${weatherDataList}" th:object="${data}">
    <td th:text="*{id}"></td>
    <td th:text="*{name}"></td>
    <td th:text="*{temperature}"></td>
    <td th:text="*{humidity}"></td>
  </tr>
</table>
  
</body>
</html>

最终项目

image.png

创建数据库

创建数据库

在使用Microsoft SQL Server Management Studio连接到服务器之后,我们将创建一个名为”testdb”的新数据库。

创建表格

create table weather (
    id              int NOT NULL IDENTITY (1, 1)   primary key,   -- ID
    name            varchar(20),                                  -- 地名
    temperature     int,                                          -- 気温
    humidity        int,                                          -- 湿度
);

添加数据

insert into weather (name, temperature, humidity) values 
   ('稚内', 1, 55),
   ('盛岡', 6, 53),
   ('前橋', 10, 40),
   ('名古屋', 12, 65),
   ('佐賀', 14, 67),
   ('那覇', 22, 69);
image.png

认证模式

最初我试图使用Windows身份验证,但由于需要安装mssql-jdbc_auth(以前的sqljdbc_auth.dll),变得麻烦了,所以我选择了直接使用SQL Server身份验证模式。

 

执行

image.png

请在浏览器中打开以下链接:
http://localhost:8080/

image.png

最后

我以某种方式成功地实现了与Spring Boot + SQL Server的连接。为了尽量不花费太多时间将现有公司内部系统移植,我们需要使JSP能够运行。我将在另一篇文章中详细介绍这个过程。

我在休息日在家里测试后,尝试在公司执行同样的事情,但遇到了问题。在公司中,“创建Spring启动器项目”出现了“没有可用的内容”,使用Maven会出现下载错误等情况,甚至无法创建项目,解决这个问题可是一番努力。原因与安全有关,需要使用keytool注册证书。我也想另外写一篇关于这个的文章。

 

广告
将在 10 秒后关闭
bannerAds