[原创]4.在Spring中使用JDBC访问关系型数据

实现效果:

使用Spring的JdbcTemplate模板构建一个应用程序来访问存储在关系数据库中的数据。

项目结构
└── src

    └── main

        └── java

            └── hello
pom.xml


    4.0.0

    org.springframework
    gs-relational-data-access
    0.1.0

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.6.RELEASE
    

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            com.h2database
            h2
        
    


    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


1.创建一个Customer对象

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);
    }

    // getters & setters omitted for brevity
}

2.存储和查询数据

Spring提供了一个名为JdbcTemplate的模板类,可以轻松使用SQL关系数据库和JDBC。 大多数JDBC代码都陷入资源获取,连接管理,异常处理和一般错误检查之中,这与代码要实现的内容完全无关。 JdbcTemplate会完成所有这些工作。 要做的就是专注于手头的业务。
src/main/java/hello/Application.java

package hello;

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;

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

@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... strings) throws Exception {

        log.info("Creating tables");

        jdbcTemplate.execute("DROP TABLE customers IF EXISTS");
        jdbcTemplate.execute("CREATE TABLE customers(" +
                "id SERIAL, first_name VARCHAR(255), last_name VARCHAR(255))");

        // Split up the array of whole names into an array of first/last names
        List splitUpNames = Arrays.asList("John Woo", "Jeff Dean", "Josh Bloch", "Josh Long").stream()
                .map(name -> name.split(" "))
                .collect(Collectors.toList());

        // Use a Java 8 stream to print out each tuple of the list
        splitUpNames.forEach(name -> log.info(String.format("Inserting customer record for %s %s", name[0], name[1])));

        // Uses JdbcTemplate's batchUpdate operation to bulk load data
        jdbcTemplate.batchUpdate("INSERT INTO customers(first_name, last_name) VALUES (?,?)", splitUpNames);

        log.info("Querying for customer records where first_name = 'Josh':");
        jdbcTemplate.query(
                "SELECT id, first_name, last_name FROM customers 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()));
    }
}

Spring Boot支持H2数据库,一种内存中的关系数据库引擎,并自动创建连接。 因为使用的是spring-jdbc,所以Spring Boot会自动创建一个JdbcTemplate。@Autowired注解JdbcTemplate字段自动加载它并使其可用。
Application类实现了Spring Boot的CommandLineRunner接口,这意味着它将在加载完应用后执行run()方法。
首先,使用JdbcTemplate的execute方法安装一些DDL(数据库模式定义语言DDL(Data Definition Language)).
其次,使用Java 8语法获取字符串列表,将它们拆分为Java数组中的firstname / lastname对。

然后使用JdbcTemplate的batchUpdate`方法在新创建的表中安装一些记录。 方法的第一个参数是要执行的sql语句,最后一个参数(Object的数组) 替换sql语中的“?”变量。

对于单行插入,用JdbcTemplate的insert方法很好。 但对于多个批量插入,最好使用batchUpdate
使用 ''?'' 绑定变量来避免SQL注入攻击。
最后,使用query方法在表中搜索与条件匹配的记录。 再次使用“?”为查询创建参数,在调用时传入实际值。 最后一个参数使用Java 8 lambda语法,表示将每个结果行转换为新的Customer对象。
Java 8 lambdas能映射到单个方法接口,如Spring的RowMapper。 如果是Java 7或更早版本,需要插入匿名接口实现,与lambda expresion表达式包含的相同的方法。

建立一个可执行的 JAR

利用maven打包war或者jar运行,这里不做介绍.
java -jar target/gs-relational-data-access-0.1.0.jar

测试

运行后将会出现类似下方的日志输出:

2015-06-19 10:58:31.152  INFO 67731 --- [           main] hello.Application                        : Creating tables
2015-06-19 10:58:31.219  INFO 67731 --- [           main] hello.Application                        : Inserting customer record for John Woo
2015-06-19 10:58:31.220  INFO 67731 --- [           main] hello.Application                        : Inserting customer record for Jeff Dean
2015-06-19 10:58:31.220  INFO 67731 --- [           main] hello.Application                        : Inserting customer record for Josh Bloch
2015-06-19 10:58:31.220  INFO 67731 --- [           main] hello.Application                        : Inserting customer record for Josh Long
2015-06-19 10:58:31.230  INFO 67731 --- [           main] hello.Application                        : Querying for customer records where first_name = 'Josh':
2015-06-19 10:58:31.242  INFO 67731 --- [           main] hello.Application                        : Customer[id=3, firstName='Josh', lastName='Bloch']
2015-06-19 10:58:31.242  INFO 67731 --- [           main] hello.Application                        : Customer[id=4, firstName='Josh', lastName='Long']
2015-06-19 10:58:31.244  INFO 67731 --- [           main] hello.Application                        : Started Application in 1.693 seconds (JVM running for 2.054)

你可能感兴趣的:([原创]4.在Spring中使用JDBC访问关系型数据)