Springboot中数据库访问的两种方式之-JdbcTemplate

目录

 

01、写在前面

02、项目依赖

03、创建模型脚本

04、读取数据库

05、Controller

06、开始测试


本文由bingo创作,授权我原创发布。

Tiger和他朋友们的原创技术文章,请关注wx  “跟哥一起学python”,ID “tiger-python”。不止Python!!


在大多数的项目开发中,我们都有把数据存入数据库和从数据库中读取的操作,所以与数据库打交道是必不可少的。

众所周知,spring提供了很多工具,我们拿来就可以用,使我们的项目开发更方便、快捷(作为一个拿来主义者,很稀饭这种方式),今天我们就来看看springboot中如何从数据库中读取数据的。

一般来说,springboot中读取数据库的方式主要有两种:JdbcTemplate和Jpa,今天我们先讲讲JdbcTemplate。

 

01、写在前面


首先,我们理一下数据库操作的一般流程。通常我们操作数据库都需要创建连接和资源、从数据库中读取数据、异常处理和关闭资源的流程,代码大概如下:


public Student findOne(String name) throws SQLException {
    Connection connection = null;
    PreparedStatementstatement = null;
    ResultSet resultSet= null;
    try {
        //1. 创建连接和各种资源
        connection =dataSource.getConnection();
        statement =connection.prepareStatement(
                "select id,name, grade from student");
        statement.setString(1, id);
        resultSet =statement.executeQuery();
        //2. 从resultSet中取出数据库中数据来初始化Student
        Student Student = null;
        if(resultSet.next()){
            resultSet = new Student(
                    resultSet.getString("id"),
                    resultSet.getString("name"),
                    resultSet.getString("grade"),));
        }
        return Student;
    } catch (SQLException e){
        //3.处理异常
    }
    finally {
        //4.释放资源
        if (resultSet != null) {
            try {
                resultSet.close();
            } catch (SQLException e){}
        }
        if (statement != null) {
            try {
                statement.close();
            } catch (SQLException e){}
        }
        if (connection != null) {
            try {
                connection.close();
            } catch (SQLException e){}
        }
    }
    return null;
}

但是,看看上面那么大篇幅的代码,我们真正业务相关的就只有从数据库中读取那4行代码,其它的代码都是一些辅助和善后操作。

而JdbcTemplate就是对上面代码的封装,我们就只关心我们的业务代码啦,其它的创建资源,释放资源这些操作就由JdbcTemplate代我们效劳了。

本来还想说点啥,但是有位大神说过:talk is cheap, show me the code,所以......我还是shutup,直接撸代码吧。

 

 

02、项目依赖

 

先上项目依赖:

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.11.0</version>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
   <groupId>com.h2database</groupId>
   <artifactId>h2</artifactId>
   <scope>runtime</scope>
</dependency>

作为一个web项目,使用了spring-boot-starter-web和thymeleaf,使用了jackson-databind的ObjectMapper把类对象转换城json串,本节讲的是JdbcTemplate方式,所以spring-boot-starter-data-jdbc必不可少,数据库测试我们使用了h2,嵌入式的内存数据库。

 

 

03、创建模型脚本

 

今天的主角是一张学生表,我们的操作就是从学生表中读取学生数据并呈现。

我们先创建学生表schema.sql并放入resources目录下,这样项目启动的时候就会执行这个sql脚本。

 

CREATE TABLE IF NOT EXISTS STUDENT(id bigint identity primary key,

    name varchar(20) not null,

    grade varchar(20) not null

);

然后再创建data.sql,插入初始数据,同样放入resources目录下,这个脚本在项目启动的时候也会执行。

 

delete fromstudent;
insert into student(name, grade) values ('bb', '01');
insert into student(name, grade) values ('cc', '02');

创建好后目录结构像这样:

 

同样,代码中也需要一个student的模型,内部数据和数据库的一样:

public class Student {    private Long ID;

    private String name;
    private String grade;

    public Student(Long ID, String name, String grade) {
        this.ID = ID;
        this.name = name;
        this.grade = grade;
    }

    public Long getID() {
        return ID;
    }

    public void setID(Long ID) {
        this.ID = ID;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGrade() {
        return grade;
    }

}

作为一个拿来主义者,最不爽的就是看别人文章时,只有部分代码,看的我云里雾里,晕头转向。所以我一点不能做那个自己讨厌的人。

 

 

04、读取数据库

下面是从数据库读取的代码,也是本篇文章的核心部分:​​​​​​​

@Repositorypublic class StudentRepository{

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public Student findStudentByName(String name) {
        return jdbcTemplate.queryForObject("select * from student where name = ?", new RowMapper<Student>() {
            @Override
            public Student mapRow(ResultSet resultSet, int i) throws SQLException {
                return new Student(resultSet.getLong("id"),
                        resultSet.getString("name"),
                        resultSet.getString("grade"));
            }
        }, name);
    }

}

@Reponsitory标识这是一个跟数据库相关的Bean,会被自动扫描和实例化,JdbcTemplate添加上Autowired注解后拿来就可以用,这里我们使用的是它的queryForObject方法来从数据库中获取数据。可以看到,queryForObject方法的参数除了接收一条sql语句外,还需要一个RowMapper的实现类,在实现类中去读取数据。对比之前代码中的那一大段,这儿就浓缩成了几行,代码简洁了很多。

 

05、Controller

Web项目肯定要写controller来进行测试咯,下面是controller代码:​​​​​​​

@Controllerpublic class JdbcController {

    @Autowired
    private StudentRepository responsitory;

    @Autowired
    private ObjectMapper mapper;

    @GetMapping("/jdbc")
    public String queryStudent(@RequestParam("name") String name, Model model) {
        Student student = responsitory.findStudentByName(name);
        try {
            model.addAttribute("student", mapper.writeValueAsString(student));
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return "index";
    }

}

Controller中从url参数中获取学生姓名,然后调用上面提供的接口来获取student,再把student转换成json串,放入model中,然后返回前端视图index。

 

 

06、开始测试

 

好啦,我们来测试一下,运行程序,访问http://localhost:8080/h2-console,看下数据是否真的插入进数据库了。

 

正常!

作为拿来主义者,必须要告诉你,h2console必须要配置spring.h2.console.enabled=true才可访问。

再访问http://localhost:8080/jdbc?name=cc,看下从数据库查询数据是否正常?

 

完美!

但是你可能会好奇前端是怎么显示的,所以,拿走不谢:

​​​​​​​​​​​​​​

<!DOCTYPE html>

<html  xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
   <head>
      <meta charset="utf-8" />
      <title>示例</title>
      <link rel="stylesheet" th:href="@{/style.css}" />
   </head>

   <body>
      <div id="app" v-cloak>
         <template>
            <table>
               <thead>
                  <tr>
                     <th>ID</th>
                     <th>姓名</th>
                     <th>年级</th>
                  </tr>
               </thead>
               <tbody>
                  <tr>
                     <td>{{student.id}}</td>
                     <td>{{student.name}}</td>
                     <td>{{student.grade}}</td>
                  </tr>
               </tbody>
            </table>
         </template>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      <script>
         var app = new Vue({
            el: '#app',
            data:{
               student: [(${student})]
            }
         })
</script>
   </body>
</html>

这里用了一点Vue的东西,俺最近也在学。

下次我们讲讲Jpa是怎么做的。


本文由bingo创作,授权我原创发布。

Tiger和他朋友们的原创技术文章,请关注wx  “跟哥一起学python”,ID “tiger-python”。不止Python!!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章