文章目录
- 1. JdbcTemplate 类
 - 1)queryForList
 - 2)update
 - 3)query
 - 4)execute
 - 5)queryForObject
 
- 2.代码及执行
 - 1)代码
 - 2)执行
 
- 3. 优点
 - 4. 详细代码
 - 总结
 
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://img-blog.csdnimg.cn/direct/ecdc160d132d4d6983fd3aaf2ab4dc2c.png)














