hooyes

Spring Boot 中使用 JDBC 读取 SQL Server 数据

|2020-05-25

请尊重原创,本文原文地址:https://hooyes.net/p/spring-restful-jdbctemplate

本文介绍在 Spring Boot 项目中,如何使用 JdbcTemplate 读取 Microsoft SQL Server 中的数据,实现一个 Restful Web Services。

目标

实现一个 Restful Web Services ,请求后输出从 SQL Server 数据库 Products 表获取到的某些数据。例如,

http://localhost:7425/one
输出纯文本:星巴克咖啡

http://localhost:7425/getById/2
根据指定 id 输出 JSON : { “id” : 2 , “name” : “蓝山咖啡” }

http://localhost:7425/getAll
输出 JSON List:
[{ “id” : 1 , “name” : “星巴克咖啡” },{ “id” : 2 , “name” : “蓝山咖啡” },{ “id” : 3 , “name” : “猫屎咖啡” }]

根据 Restful 风格,采取的是 getById/2 这种的地址方式获取参数,而不是传统的 getById?id=2 问号加参数的方式。在 Spring 中采用 @PathVariable 对参数进行标记。

用到的技术和工具

  • Java 8
  • SQL Server 2017
  • Spring Boot 2.3
  • Maven 3.6
  • Spring Tool Suite 4

创建一个Spring Web项目

使用 Spring Tool Suite 创建一个 Spring Starter Project ,添加 HelloHooyes.java,Products.java 文件 ,创建好的目录必要的结构:

https://hooyes.net/p/spring-restful-jdbctemplate
https://hooyes.net/p/spring-restful-jdbctemplate

application.properties

在 application.properties 中修改调试 server 的端口为7425,配置 Microsoft SQL Server 数据库地址。

server.port=7425
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=hooyesDB
spring.datasource.username=hooyes
spring.datasource.password=hooyes.net

pom.xml

在 pom.xml 中添加 MS SQL Server Driver 、Spring Web 、Spring Data JDBC 。

以下仅列出本文关键的依赖项。

...
<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-jdbc</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>
	<dependency>
		<groupId>com.microsoft.sqlserver</groupId>
		<artifactId>mssql-jdbc</artifactId>
		<scope>runtime</scope>
	</dependency>
</dependencies>
...

查看完整的 pom.xml

HelloHooyes.java

在这个文件里,实现 Restful Web Services ,使用 JdbcTemplate 读取 Products 数据。

package net.hooyes.shop;

import net.hooyes.shop.Model.*;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.jdbc.core.JdbcTemplate;

@RestController
public class HelloHooyes {

	@Autowired
	JdbcTemplate jt;

	// 读取一个产品名称
	@GetMapping("/one")
	public String one() {
		String sql = "select name from Products where id = 1";
		String name = jt.queryForObject(sql, String.class);
		return name;
	}

	// 通过ID读取一个产口,返回JSON
	@GetMapping("/getById/{id}")
	public Products getbyId(@PathVariable Integer id) {
		String sql = "select id,name from Products where id= ?";
		return jt.queryForObject(sql, new Object[] { id },
				(rs, n) -> new Products(rs.getInt("id"), 
				rs.getString("name")));
	}

	// 读取所有产品,返回JSON 列表
	@GetMapping("/getAll")
	public List<Products> getAll() {
		String sql = "select id,name from Products";
		return jt.query(sql, 
				(rs, n) -> new Products(rs.getInt("id"), 
				rs.getString("name")));
	}

}
https://hooyes.net/p/spring-restful-jdbctemplate
https://hooyes.net/p/spring-restful-jdbctemplate

以上代码获取 Microsoft SQL Server 数据都是直接通过 SQL 语句,如何执行存储过程呢?稍做改动即可执行存储过程。

创建好一个叫 Get_Products 的存储过程。

CREATE PROCEDURE [Get_Products]  @ID INT = 0
AS
    SELECT  ID ,
            Name 
    FROM    Products P
    WHERE   ( @ID = 0 OR ID = @ID )

RETURN 0

对 Java 代码稍做修改执行 Microsoft SQL Server 存储过程

@GetMapping("/getById/{id}")
public Products getbyId(@PathVariable Integer id) {
	// 根据参数 id,执行存储过程获取数据
	String sql = "execute Get_Products ?";
	return jt.queryForObject(sql, new Object[] { id },
			(rs, n) -> new Products(rs.getInt("id"), 
			rs.getString("name")));
}


@GetMapping("/getAll")
public List<Products> getAll() {
	// 默认参数,执行存储过程获取数据
	String sql = "execute Get_Products";
	return jt.query(sql, 
			(rs, n) -> new Products(rs.getInt("id"), 
			rs.getString("name")));
}

Products.java

package net.hooyes.shop.Model;
public class Products {
	private Integer id;
	private String name;
	public Products(Integer id, String name) {
		setId(id);
		setName(name);
	}
	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;
	}
}

ShopApplication.java

这个文件是 Spring Boot 项目的入口文件

package net.hooyes.shop;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ShopApplication {
	public static void main(String[] args) {
		SpringApplication.run(ShopApplication.class, args);
	}
}

ServletInitializer.java

这个文件也是一个标准的用法,让我们的 Spring Boot 项目除了独立运行,还可以跑在 Tomcat 等 Server 里。

package net.hooyes.shop;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(ShopApplication.class);
}
}

测试

1、在 Microsoft SQL Server 数据库中添加几条数据


insert into Products(ID,Name) VALUES(1,'星巴克咖啡')
insert into Products(ID,Name) VALUES(2,'蓝山咖啡')
insert into Products(ID,Name) VALUES(3,'猫屎咖啡')

2、运行 Server

3、在浏览器中打开 http://localhost:7425/getById/3

输出 { "id" : 3 , "name" : "猫屎咖啡" } 完成目标。

如果想布署到 Tomcat 中运行,命令行进入此项根目录,执行命令 mvn package 编译打包成功后,将 target 目录中的 .war 文件复制到 Tomcat 的 webapps 中即可。

源代码

这里是本篇文章完整的,完全可运行的源代码。

Online
https://github.com/hooyes/hooyes/tree/master/java/shop

Git
$ git clone https://github.com/hooyes/hooyes.git
$ cd hooyes/java/shop

$ welcome to hooyes.net
[INFO] ------------------------------o-
[INFO] Author : HOOYES
[INFO] Site : https://hooyes.net
[INFO] Page : https://hooyes.net/p/spring-restful-jdbctemplate
[INFO] Last build : 2020-08-20 02:54:30 +0000
[INFO] -0------------------------------
原文地址:https://hooyes.net/p/spring-restful-jdbctemplate
原文地址:https://hooyes.net/p/spring-restful-jdbctemplate

...

Content
...
TOP