美文网首页30分钟学会spring
[原创]4.在Spring中使用JDBC访问关系型数据

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

作者: 哈士奇18 | 来源:发表于2019-07-26 23:22 被阅读0次

    实现效果:

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

    项目结构
    └── 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 https://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.1.6.RELEASE</version>
        </parent>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </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>
    

    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<Object[]> 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访问关系型数据

        本文链接:https://www.haomeiwen.com/subject/ywmjrctx.html