[SpingBoot guides系列翻译]通过JDBC和Spring访问关系数据库

原文

参考链接

hikaricp

Spring Boot JDBC Starter

Spring Boot Starter Parent

h2 database introduction

Autowired


目的

通过JDBC和Spring去访问关系型数据库。

你将构建的项目

你将构建一个通过Sping的JdbcTemplate 去访问关系型数据库的项目。

你需要的

  • 大约15min
  • 喜欢的编辑器或IDE
  • jdk1.8+
  • Gradle4+ 或 Maven3.2+

如何完成

跟着教程演示使用Maven的方式。


通过Maven构建

如果不熟悉最基本的Maven用法,看这里

创建结构结构

mkdir -p src/main/java/hello

编写pom.xml

<?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>org.springframework</groupId>
    <artifactId>gs-relational-data-access</artifactId>
    <version>0.1.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.9.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <groupId>org.springframework.boot</groupId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>

        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

build的时候用到了spring-boot-maven-plugin插件。他提供了很多便捷的特性。

  • 把用到的所有依赖打包成一个整体,这样方便服务的执行以及分发。
  • public static void main()标记成可执行类。
  • 提供了内置的依赖解析器用于设置相符的Spring Boot依赖的版本号。

再介绍一下上面的几个依赖引用

  • Spring Boot Starter Parent:提供Maven项目的依赖和插件管理功能。
  • Spring Boot Starter JDBC:Spring里面基于HikariCP的JDBC库。
  • h2:内存数据库,用于测试和开发。

创建一个Customer 对象

创建一个Customer对象,包含firstname 和 lastname来表示应用层的数据对象。

src/main/java/hello/Customer.java

package hello;

public class Customer {
    private long id;
    private String firstName, lastName;

    public Customer(long id, String firstName, String lastName) {
        this.id = id;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return String.format("Customer [id:%d,firstName:%s, lastName=%s ]", id, firstName, lastName);
    }
}

存取数据

Spring提供了JdbcTemplate来简化JDBC相关的sql关系数据操作。大部分的JDBC代码可能会陷入资源获取,链接管理,异常处理,一般的错误检查等和我们代码要实现的主要功能没有关系的问题中。JdbcTemplate帮我们处理,你需要做的就是关注你的逻辑代码。下面开始写Application.java。

src/main/java/hello/Application.java

package hello;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;

@SpringBootApplication
public class Application implements CommandLineRunner {

    private static final Logger log = LoggerFactory.getLogger(Application.class);

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

    @Autowired
    JdbcTemplate jdbcTemplate;

    @Override
    public void run(String... args) throws Exception {
        log.info("创建表");

        jdbcTemplate.execute("drop table customer if exists");
        jdbcTemplate.execute("create table customer(id serial, first_name varchar(255), last_name varchar(255))");

        List<Object[]> splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream()
                .map(name -> name.split(" "))
                .collect(Collectors.toList());

        splitUpNames.forEach(name -> log.info(String.format("插入表数据,first_name %s last_name %s", name[0], name[1])));
        jdbcTemplate.batchUpdate("insert into customer (first_name, last_name) values (?,?)", splitUpNames);

        log.info("查询customer,first_name='Josh'");

        jdbcTemplate.query("select * from customer where first_name=?", new Object[]{"Josh"},
                (rs, rowNum) -> new Customer(rs.getLong("id"), rs.getString("first_name"), rs.getString("last_name")))
                .forEach(customer -> {
                    log.info(customer.toString());
                });
        ;
    }

}

有几点注意一下:

  1. @SpringBootApplication注解,相当于启用了几个注解

    1. @Configuration,表示这个类定义的是应用程序上下文。
    2. @EnableAutoConfiguration,表示Spring会通过class path,bean设置,属性设置来添加bean。
    3. @ComponentScan查找当前hello包中包含的component,configuration,service。
  2. @Autowired注解,可以用在构造器,字段,setter方法,config方法中,配置了之后Spring会自动装配。需要的时候也就是会帮你获取。
  3. Application 类实现了了Spring Boot的CommandLineRunner接口,这意味着它的run()方法会在程序装载的时候自动执行。
  4. 这个的java的lambda表达式用起来感觉挺好的。找时间好好学学。
  5. 调用JdbcTemplate的时候使用来避免sql注入攻击。

编译生成可执行jar

代码写好之后就能运行打包了。

运行:mvn spring-boot:run

打包: mvn clean package

然后 java -jar target/gs-relational-data-access-0.1.0.jar就能跑起来了。

原文地址:https://www.cnblogs.com/sheldon-lou/p/10758476.html

时间: 2024-10-29 11:10:10

[SpingBoot guides系列翻译]通过JDBC和Spring访问关系数据库的相关文章

【SpingBoot guides系列翻译】调用RESTfulWebService

原文 参考链接 CommandLineRunner Bean 翻译如何调用RESTful WebService 这节将演示如何在SpringBoot里面调用RESTful的WebService. 构建的内容 使用Spring的RestTemplate来获取https://gturnquist-quoters.cfapps.io/api/random里面返回的json数据中的quotation字段的内容. 你需要的 大约15min 喜欢的编辑器或IDE jdk1.8+ Gradle4+ 或 Mav

SpringBoot实战(四)之使用JDBC和Spring访问数据库

这里演示的是h2databse示例,所以简单的介绍普及下h2database相关知识 H2数据库是一个开源的关系型数据库. H2是一个嵌入式数据库引擎,采用java语言编写,不受平台的限制,同时H2提供了一个十分方便的web控制台用于操作和管理数据库内容.它还提供兼容模式,可以兼容一些主流的数据库,因此采用H2作为开发期的数据库非常方便. H2数据库特点: 短小精干. Java编写,可使用GCJ和IKVM.NET编译. 同时支持网络版和嵌入式版本,另外还提供了内存版. 有比较好的兼容性,支持相当

分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager

1 系列目录 分布式事务系列(开篇)提出疑问和研究过程 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析 2 jdbc事务 2.1 例子 public void save(User user) throws SQLException{ Connection conn=jdbcDao.getConnection(); conn.setAutoCommit(false); try { PreparedStatement ps=conn.pre

Leopard Jdbc:简化Spring Jdbc使用

Leopard Jdbc:简化Spring Jdbc使用 学习如何在旧项目中使用Leopard Jdbc. 本指南将引导您完成使用Leopard Jdbc操作MySQL. How to complete this guide 你可以从头开始并完成每一个步骤,或者您可以绕过你已经熟悉的基本设置步骤.无论哪种方式,你最终都可以得到可工作的代码. 1.配置maven依赖 在dao模块的pom.xml加入 <dependencies> [...] <dependency> <grou

分布式事务系列(1.2)Spring的事务体系

1 系列目录 分布式事务系列(开篇)提出疑问和研究过程 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析 分布式事务系列(1.2)Spring事务体系 2 三种事务模型 三种事务模型如下: 本地事务模型 编程式事务模型 声明式事务模型 先来看几个例子: 案例1: Connection conn=jdbcDao.getConnection(); PreparedStatement ps=conn.prepareStatement("inse

在Spring中基于JDBC进行数据访问时如何控制超时

超时分类 超时根据作用域可做如下层级划分: Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout Transaction Timeout指一组SQL操作执行时应在设定的时间内完成(提交或回滚),否则将引发超时.它的值应大于 N(语句数) * Statement Timeout Statement Timeout指完成单条SQL语句执行的最大允许时间.它的值应小于JDBC Driver Socket Timeou

死磕Spring系列之一:准备阅读Spring源码环境

死磕Spring系列前言 死磕spring系列博客,是对Spring进行源码级阅读.工作以来,一直接触spring框架,可以说对spring框架的配置使用已经非常熟练了.个人感觉:Spring技术非常强大,简单的xml标签配置,就可以开启非常强大的支持功能,囊括J2EE企业应用的方方面面.使用归使用,但是却对spring底层设计和实现,一知半解."到底是什么优秀的设计,能让Spring无所不能,无所不包".最后,就有了我想研读Spring 源码的动力. 阅读任何任何一门框架源码,其实和

springMVC系列之(三) spring+springMVC集成(annotation方式)

个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就变成纸上谈兵了!!!先技术,再思想.实践出真知. 1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来.它是为了解决企业应用开发的复杂性而创建的.Spring使用

Spring Boot 2.0干货系列:(一)Spring Boot1.5X升级到2.0指南

前言Spring Boot已经发布2.0有满久了,多了很多新特性,一些坑也慢慢被填上,最近有空,就把本博客中Spring Boot干货系列对应的源码从1.5X升级到Spring Boot 2.0,顺便整理下升级的时候遇到的一些坑,做个记录.后续的教程就以最新的2.03版本为主.依赖 JDK 版本升级 2.x 至少需要 JDK 8 的支持,2.x 里面的许多方法应用了 JDK 8 的许多高级新特性,所以你要升级到 2.0 版本,先确认你的应用必须兼容 JDK 8. 另外,2.x 开始了对 JDK