【Spring实战】03 JDBC常用操作

发布时间:2023年12月23日

Spring JDBC 是 Spring 框架提供的一种用于简化数据库访问的机制。它建立在 JDBC(Java 数据库连接)之上,提供了更高级别的抽象,使得数据库操作更加简单、方便,并减少了样板代码。本博客将介绍 Spring JDBC 中的一些常用操作。

1. JdbcTemplate 类

JdbcTemplate 是 Spring 框架中用于简化 JDBC 编程的类。

它提供了一种模板化的方法来执行数据库操作,从而减少了传统 JDBC 编程中的样板代码和错误处理。JdbcTemplate 类位于 org.springframework.jdbc.core 包中,是 Spring JDBC 核心类之一。

在这里插入图片描述

1)queryForList

使用下面 SQL 查询一下数据库 t_user 表里都有哪些用户

select * from t_user

查询代码如下:

String sql = "select * from t_user";
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);

2)update

使用下面 SQL 查询一下数据库 t_user 表里都有哪些用户

insert into t_user values (5, 'ccc',44)

查询代码如下:

String sql = "insert into t_user values (5, 'ccc',44)";
return jdbcTemplate.update(sql);

3)query

使用下面 SQL 查询一下数据库 t_user 表里指定 id 的用户

select * from t_user where id = ?

查询代码如下:

String sql = "select * from t_user where id = ?";
return jdbcTemplate.query(sql, (rs, rowNum) ->
                          new User(
                              rs.getInt("id"),
                              rs.getString("name"),
                              rs.getInt("age")
                          ), id);

4)execute

使用下面 SQL 修改一下数据库 t_user 表里id是5的用户年龄

update t_user set age = '55' where id = 5

查询代码如下:

String sql = "update t_user set age = '55' where id = 5";
jdbcTemplate.execute(sql);

5)queryForObject

使用下面 SQL 查询一下数据库 t_user 表里指定 id 的用户

select * from t_user where id = ?

查询代码如下:

String sql = "select * from t_user where id = ?";
return jdbcTemplate.queryForObject(sql, (rs, rowNum) ->
                                   new User(
                                       rs.getInt("id"),
                                       rs.getString("name"),
                                       rs.getInt("age")
                                   ), id);

2.代码及执行

1)代码

启动类

package com.cheney.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication {

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

modle

package com.cheney.demo.modle;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
    private Integer age;
}

dao

package com.cheney.demo.dao;

import com.cheney.demo.modle.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Repository
public class UserDao {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<User> getUserByIdViaQuery(Long id) {
        String sql = "select * from t_user where id = ?";
        return jdbcTemplate.query(sql, (rs, rowNum) ->
                new User(
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getInt("age")
                ), id);
    }

    public User getUserByIdViaQueryForObject(Long id) {
        String sql = "select * from t_user where id = ?";
        return jdbcTemplate.queryForObject(sql, (rs, rowNum) ->
                new User(
                        rs.getInt("id"),
                        rs.getString("name"),
                        rs.getInt("age")
                ), id);
    }

    public List<User> getUserByIdViaQueryForList() {
        String sql = "select * from t_user";
        List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);

        List<User> users = new ArrayList<>();
        for (Map<String, Object> row : rows) {
            User user = new User();
            user.setId((Integer) row.get("ID"));
            user.setName((String) row.get("NAME"));
            user.setAge((Integer) row.get("AGE"));
            users.add(user);
        }
        return users;
    }

    public int insertUser() {
        String sql = "insert into t_user values (5, 'ccc',44)";
        return jdbcTemplate.update(sql);
    }


    public void updateUser() {
        String sql = "update t_user set age = '55' where id = 5";
        jdbcTemplate.execute(sql);
    }
}

controller

package com.cheney.demo.controller;

import com.cheney.demo.dao.UserDao;
import com.cheney.demo.modle.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserDao userDao;

    @GetMapping("queryForList")
    public String queryForList() {
        List<User> users = userDao.getUserByIdViaQueryForList();
        StringBuilder sb = new StringBuilder();
        for (User user : users) {
            sb.append(user).append("</br>");
        }
        return sb.toString();
    }

    @GetMapping("update")
    public String update() {
        int count = userDao.insertUser();
        return "插入了一个id是5的用户,并且年龄是44";
    }

    @GetMapping("query")
    public String query() {
        List<User> users = userDao.getUserByIdViaQuery(5L);
        if (users.isEmpty()) {
            return null;
        }
        return users.getFirst().toString();
    }

    @GetMapping("execute")
    public String execute() {
        userDao.updateUser();
        return "把id是5的用户的年龄修改为55";
    }

    @GetMapping("queryForObject")
    public String queryForObject() {
        User user = userDao.getUserByIdViaQueryForObject(5L);
        if (user == null) {
            return null;
        }
        return user.toString();
    }
}

配置类

package com.cheney.demo.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource){
        return new JdbcTemplate(dataSource);
    }
}

schema.sql

CREATE TABLE IF NOT EXISTS `t_user` (
     `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
     `name`       VARCHAR(32) NOT NULL,
     `age`        INTEGER  NOT NULL
);

data.sql

INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (1, 'cheney', '18');
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (2, 'aaa', '11');
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (3, 'aaa', '22');
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (4, 'bbb', '33');

2)执行

a. 先启动服务

在这里插入图片描述

b. 执行 http://localhost:8080/user/queryForList

在这里插入图片描述

c. 执行 http://localhost:8080/user/update

在这里插入图片描述

d. 执行 http://localhost:8080/user/query

在这里插入图片描述

e. 执行 http://localhost:8080/user/execute

在这里插入图片描述

f. 执行 http://localhost:8080/user/queryForObject

在这里插入图片描述

3. 优点

  • 简化了数据库操作,减少了样板代码,提高了开发效率
  • 提供了更具信息性的异常处理,使开发人员更容易定位和解决问题
  • 可以通过回调接口来执行自定义的数据库操作,使得代码更加灵活和可扩展

4. 详细代码

https://github.com/cheney09/spring-practical-combat/tree/main/03/demo

在这里插入图片描述

总结

本文介绍了 Spring JDBC 如何使用 JdbcTemplate 进行基本的常用操作以及详细的案例。在实际应用中,你可以根据具体的业务需求和数据库类型进行适当的调整。

文章来源:https://blog.csdn.net/yanyc0411/article/details/135175032
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。