`

Spring boot中使用 JdbcTemplate

 
阅读更多

 

JDBC

首先,我们来看看传统的JDBC是如何连接数据库并操作数据库的吧:

package main;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Mysql {

    /**
     * 入口函数
     * @param arg
     */
    public static void main(String arg[]) {
        try {
            Connection con = null; //定义一个MYSQL链接对象
            Class.forName("com.mysql.jdbc.Driver").newInstance(); //MYSQL驱动
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "root"); //链接本地MYSQL

            Statement stmt; //创建声明
            stmt = con.createStatement();

            //新增一条数据
            stmt.executeUpdate("insert into post(title, content, created) values('title', 'content', '2015-08-20 00:00:00')");
            ResultSet res = stmt.executeQuery("select LAST_INSERT_ID()");
            int ret_id;
            if (res.next()) {
                ret_id = res.getInt(1);
                System.out.print(ret_id);
            }

        } catch (Exception e) {
            System.out.print("MYSQL ERROR:" + e.getMessage());
        }

    }
}

这是一段非常经典的使用JDBC访问MySQL数据库的代码,它的作用是向数据库post表中增加一条记录('title', 'content', '2015-08-20 00:00:00')并获取自增id。其中的步骤可以抽象为:

  • 定义连接参数(包括动态加载驱动类com.mysql.jdbc.Driver
  • 建立数据库连接
  • 指定Sql语句并参数化
  • 执行Sql语句
  • 获取查询结果并处理
  • 处理异常
  • 事务管理
  • 释放各类资源——StatementResultSetConnection

对于上述步骤,实际上很多部分都是通用的——即对于每一次数据库访问都没有变化,例如定义参数、打开连接、处理异常、事务处理、资源释放。完全没有必要再每一次访问里都编写这些代码,一种办法是将这些代码封装起来。Spring JDBC正是提供了这样一种封装,它将与JDBC API交互的诸多细节隐藏起来,通过Spring JDBC开发者能够更加专注于业务代码(建立并执行Sql语句,处理查询结果等)的开发。

JDBC访问数据库的步骤,在Spring JDBC中被抽象为JdbcTemplate,这是Spring JDBC中最核心的类。以下是一些JdbcTemplate的常用方法:

获取Table中记录数量

int rowCount = this.jdbcTemplate.queryForObject("select count(*) from post", Integer.class);

SQL语句参数化

int countOfActorsNamedJoe = this.jdbcTemplate.queryForObject(
        "select count(*) from post where id = ?", Integer.class, 1L);

其中Sql语句中需要被参数化的对象用?作为占位符替代,可以指定多个占位符,这个方法最后的参数也是变长的。

获取String对象

String title = this.jdbcTemplate.queryForObject(
        "select title from post where id = ?",
        new Object[]{1L}, String.class);

获取业务对象

通常查询结果不是一个简单的基本类型(IntegerString),而是我们自定义的业务对象,例如我们的Post对象:

这时不能直接在queryForObject()方法中直接指定参数Post.class,因为JdbcTempate无法知道应该如何将ResultSet转化为Post对象,所以这时需要实现转换的方法:

List<Post> posts = this.jdbcTemplate.query(
                "select * from post",
                (rs, rowNum) -> new Post(rs.getLong("id"), rs.getString("title"), rs.getString("content"), rs.getDate("created")));

jdbcTemplate.query()方法的第二个参数是接口RowMapper<T>的实现,它的作用就是把ResultSet转化为Post对象,上述写法是在Java 8中使用Lambda表达式的简化结果。

JdbcTemplate的增加/删除/更新方法

上面提到的都是查询方法,而对于数据库的写操作相对于查询来说,要简单很多,在写操作中,使用?参数化也是常用的手段:

this.jdbcTemplate.update(
        "insert into post(title, content, created) values(?, ?, ?)",
        "title", "content", "2015-08-20 00:00:00");
this.jdbcTemplate.update(
        "update post set title = ?, content = ? where id = ?", "update", "update", 1L);
this.jdbcTemplate.update(
        "delete from post where id = ?", 1L);

JdbcTemplate其他操作

JdbcTemplate.execute(..)方法可以执行任何Sql语句,例如创建Table:

this.jdbcTemplate.execute("create table post (id integer, name varchar(100))");

调用存储过程:

this.jdbcTemplate.update(
        "call SUPPORT.REFRESH_ACTORS_SUMMARY(?)",
        Long.valueOf(unionId));

 

在应用中使用JdbcTemplate

为了简化我们的开发,我们暂时使用内存数据库进行开发,这样可以省去我们对数据库的一些管理工作。最后,我们再做一点点简单的配置,将我们的所有数据移动到Mysql数据库中。

添加依赖

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

初始化数据库

首先我们创建一张post表存储POST相关的数据。

Spring JDBC将JDBC通用的方法抽象成了一个JdbcTemplate类。我们可以通过我们通过JdbcTemplate来操作我们的数据可。同时,我们使用@PostConstruct标注使得我们的创建脚本在应用启动时执行:

@PostConstruct
public void initDatabase(){
    jdbcTemplate.execute("CREATE TABLE `post` ("
          + "`id` int(11) unsigned NOT NULL AUTO_INCREMENT,"
          + "`title` varchar(255) NOT NULL DEFAULT '',"
          + "`content` text,"
          + "`created` datetime NOT NULL,"
          + "PRIMARY KEY (`id`)"
          + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;");
}

但是这种方法在java代码里拼接SQL语句,并不容易维护。好在Spring Boot为我们提供了另外一种办法,在src/main/resources/目录下添加schema.sql

CREATE TABLE IF NOT EXISTS `post`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL DEFAULT '',
  `content` text,
  `created` datetime NOT NULL);

INSERT INTO `post`(`title`, `content`, `created`) values('欢迎来到天码营', '这是系统自动为你生成的博客', '2015-01-01');

获取博客列表

在上一节课中我们知道通过select语句我们可以查询到相应的数据,我们现在通过jdbcTemplatequery方法来获取所有的博客列表:

@Controller
public class IndexController {

    @Autowired 
    private JdbcTemplate jdbcTemplate;

    @RequestMapping(value = "", method = RequestMethod.GET)
    public String index(Model model) {
        model.addAttribute("posts", this.jdbcTemplate.query(
                "select * from post",
                (rs, rowNum) -> new Post(rs.getLong("id"), rs.getString("title"), rs.getString("content"), rs.getDate("created"))));
        return "index";
    }
}

创建博客

创建博客时比我们之前所介绍的稍微复杂一点。因为除了创建博客外,我们还需要获取该博客的id,再将页面重定向到该博客对应的页面。我们可以通过数据库系统函数last_insert_id()类得到创建完成后的博客id:

@RequestMapping(value = "/", method = RequestMethod.POST)
public String create(@Valid Post post, BindingResult result) {
    if (result.hasErrors()) {
        return "create";
    }
    jdbcTemplate.update("insert into post(title, content, created) values(?, ?, ?)",
            post.getTitle(), post.getContent(), new Date());

    Long id = jdbcTemplate.queryForObject("select last_insert_id()", Long.class);
    return "redirect:/posts/" + id;
}

获取单个博客

jdbcTemplatequeryForObject方法可以获得单个的对象,注意当select的结果不只一个或者为0时,Spring JDBC会抛出错误:

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String get(@PathVariable long id, Model model) {
    model.addAttribute("post", this.jdbcTemplate.queryForObject(
            "select * from post where id = ?", new Object[]{id},
            (rs, rowNum) -> new Post(rs.getLong("id"), rs.getString("title"), rs.getString("content"), rs.getDate("created"))));

    return "post"; 

} 

 

添加评论

新建数据库表,在schema.sql中添加下列建表语句:

CREATE TABLE IF NOT EXISTS `comment`(
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` text,
  `post` int(11) NOT NULL,
  `created` datetime NOT NULL);

添加CommentController来处理创建Comment的POST请求,这里,我们暂时不处理出错的情况。

@Controller
@RequestMapping("/comments")
public class CommentController {

    @Autowired 
    private JdbcTemplate jdbcTemplate;

    @RequestMapping(value = "", method = RequestMethod.POST)
    public String create(@Valid Comment comment, BindingResult result) {
        if (result.hasErrors()) {
            //TODO: 如何处理评论数据出错的情况?
            return "redirect:/posts/" + comment.getPost();
        }
        this.jdbcTemplate.update(
                "insert into comment(content, post, created) values(?, ?, ?);",
                comment.getContent(), comment.getPost(), new Date());
        return "redirect:/posts/" + comment.getPost();
    }

}

然后,我们在post.html中添加创建评论的表单:

<form th:action="@{/comments}" method="post">
    <input type="hidden" name="post" th:value="${post.id}"></input>
    <div class="form-group">
      <textarea name="content" id="new-comment" class="form-control"></textarea>
      <div class="alert alert-danger" style="display: none;"></div>
    </div>

    <div class="form-group">
      <input type="submit" class="btn btn-primary" value="发布"></input>
    </div>
</form>

最后,我们在博客的GET请求中获取所有的Comment列表,并将其显示在页面中:

model.addAttribute("comments", this.jdbcTemplate.query(
        "select * from comment where post = ?", new Object[]{id},
        (rs, rowNum) -> new Comment(rs.getLong("id"), rs.getString("content"), rs.getDate("created"), rs.getLong("post"))));
<div class="col-sm-10">
    <div class="blog-post" th:each="comment : ${comments}">
      <p class="blog-post-meta" th:text="${#dates.format(comment.created, 'yyyy-MM-dd')}">201523日</p>
      <p class="blog-post-content" th:text="${comment.content}">Amet risus. Dolor ultrices justo, praesent eos nisl lacus, consectetuer vitae lorem cras magna dolor, mauris libero turpis aliquam sed, at sapien tellus penatibus accumsan nec. Parturient amet felis morbi. Quis ac penatibus elementum lacus, vestibulum sem tellus arcu.</p>
    </div>
</div>

使用MySQL

数据库的一个最重要的功能是持久化,所以在真正的应用环境里,我们必须要使用MySQL这一类数据库进行数据存储。但是,在内存数据库的例子中,没有任何代码定义了数据库地址,Spring Boot就直接使用了H2Database。如果需要使用MySQL呢?

Spring Boot在初始化DataSource对象时,会根据外部配置来进行。如果我们不进行任何配置,那么它会使用H2Database的JDBC驱动以及连接地址。如果我们需要使用其它类型的数据库,编辑src/main/resources/application.properties

spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

这是一个样例文件,需要根据自己的实际情况将几个参数重写。当然也不要忘了在Maven依赖中加入mysql-jdbc驱动:

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <scope>runtime</scope>
</dependency>

这样Spring Boot应用启动后,会根据spring.datasource.*属性创建一个我们需要的DataSource对象,这样就能够对MySQL数据库进行操作了。本质上它和我们在XML和Java Config文件中自己顶一个DataSource的Bean是完全一样的,但是这样更加简洁、高效。

https://course.tianmaying.com/web-development+spring-jdbc#5

 

 

分享到:
评论

相关推荐

    详解spring boot中使用JdbcTemplate

    首先,为了在Spring Boot中使用JdbcTemplate,我们需要引入`spring-boot-starter-jdbc`模块。在`pom.xml`中添加以下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-jdbc ``...

    Spring Boot中的JdbcTemplate与MySQL集成

    本文将深入探讨如何在Spring Boot项目中配置和使用JdbcTemplate以及与MySQL数据库的整合。 首先,我们需要在项目的`pom.xml`或`build.gradle`文件中添加相应的依赖。对于Maven用户,添加如下依赖: ```xml ...

    Spring Boot中使用jdbctemplate 操作MYSQL数据库实例

    然后,为了能在Spring Boot应用中使用JdbcTemplate,我们需要在启动类或任何其他需要操作数据库的类中注入JdbcTemplate。这里是一个简单的启动类示例: ```java import org.springframework.beans.factory....

    Spring Boot多数据源(JdbcTemplate)配置与使用

    在本教程中,我们将深入探讨如何在Spring Boot项目中配置和使用多数据源以及JdbcTemplate。 首先,让我们了解什么是`JdbcTemplate`。它是Spring提供的一种模板类,用于执行SQL语句,通过回调机制将结果转换为Java...

    简单介绍如何使用Spring Boot使用JdbcTemplate与MySQL进行数据库操作

    在本文中,我们将深入探讨如何使用Spring Boot集成JdbcTemplate与MySQL数据库进行数据操作。Spring Boot以其简化配置和快速启动的特点,已经成为Java开发者的首选框架。而JdbcTemplate是Spring框架的一部分,它提供...

    Spring boot +jdbctemplate

    在"Spring Boot +JdbcTemplate"的主题下,我们将深入探讨这个组合在构建现代Java Web应用中的作用。 1. **Spring Boot核心特性** - **自动配置**:Spring Boot通过`@EnableAutoConfiguration`注解自动识别并配置...

    SpringAll_wuyouzhuguli.tar.gz

    Spring Boot中使用JdbcTemplate Spring Boot MyBatis配置Druid多数据源 Spring Boot JdbcTemplate配置Druid多数据源 Spring Boot AOP记录用户操作日志 Spring Boot中使用thymeleaf Spring Boot中使用Redis缓存数据 ...

    Spring boot 使用JdbcTemplate访问数据库

    在 Spring Boot 中使用 JdbcTemplate 访问数据库,是一种常见且简便的方式,特别适合那些需要对数据库进行基础操作的应用。 JdbcTemplate 是 Spring Framework 提供的一个模板类,它对 JDBC API 进行了封装,使得...

    Spring boot连接oracle数据库JDBC配置步骤

    在本文中,我们将详细介绍如何使用 Spring Boot 连接 Oracle 数据库,配置 JDBC 驱动程序,并实现数据库的基本操作。 Step 1: 添加依赖项 在 Spring Boot 项目中,需要在 `build.gradle` 文件中添加 Oracle JDBC ...

    Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法

    注意,Kotlin与Java相比,提供了更简洁的语法,如构造函数注入和扩展函数,这使得在Kotlin中使用Spring Boot和JdbcTemplate更加优雅。 总结一下,通过Spring Boot、Kotlin和JdbcTemplate,我们可以高效地实现与...

    使用Spring的JdbcTemplate调用Oracle的存储过程

    使用Spring的JdbcTemplate调用Oracle的存储过程

    《Java EE框架(SSM + Spring Boot + Vue.js 3)整合开发》实验教学大.docx

    11. **Spring Boot中的JDBC与JdbcTemplate**:学习如何在Spring Boot中使用JdbcTemplate进行数据库操作,简化SQL语句的编写和执行。 12. **@Transactional注解**:了解@Transactional注解的作用,以及如何在服务层...

    springboot+JdbcTemplate+druid

    要在 Spring Boot 中使用 JdbcTemplate 和 Druid,首先需要在项目的 `pom.xml` 文件中添加相应的依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;spring-boot-starter-data-jdbc &lt;groupId&gt;...

    9. 使用JdbcTemplate【从零开始学Spring Boot】

    在本节中,我们将深入探讨如何在Spring Boot项目中使用JdbcTemplate进行数据库操作。JdbcTemplate是Spring框架提供的一种简化数据库访问的工具,它通过提供一套模板方法,使得开发者可以更安全、更方便地执行SQL语句...

    配制Spring事务和JdbcTemplate使用

    配制Spring事务和JdbcTemplate使用 配制Spring事务和JdbcTemplate使用

    从零开始学Spring Boot

    1.6 Spring Boot使用别的json解析框架 1.7 全局异常捕捉 1.8 Spring Boot datasource - mysql 1.9 JPA - Hibernate 1.10 使用JPA保存数据 1.11 使用JdbcTemplate 1.12 Spring Boot修改端口号 1.13 Spring Boot配置...

    Spring Boot 学习笔记完整教程.pdf

    - **JdbcTemplate 保存数据**:除了 JPA,Spring Boot 也支持通过 JdbcTemplate 直接操作数据库。 - **配置类和静态资源处理**:Spring Boot 允许通过配置类配置扫描包和静态资源路径。 - **任务调度**:Spring Task...

    Spring Boot2企业应用实战

    《Spring Boot2企业应用实战》一书主要涵盖了Spring Boot 2在现代企业级应用程序开发中的核心概念和技术。Spring Boot作为Spring框架的一个子项目,旨在简化Java应用的初始搭建以及开发过程,尤其对于微服务架构来说...

Global site tag (gtag.js) - Google Analytics