Spring JDBC 是 Spring 框架提供的一种用于简化数据库访问的机制。它建立在 JDBC(Java 数据库连接)之上,提供了更高级别的抽象,使得数据库操作更加简单、方便,并减少了样板代码。本博客将介绍 Spring JDBC 中的一些常用操作。
JdbcTemplate 是 Spring 框架中用于简化 JDBC 编程的类。
它提供了一种模板化的方法来执行数据库操作,从而减少了传统 JDBC 编程中的样板代码和错误处理。JdbcTemplate
类位于 org.springframework.jdbc.core
包中,是 Spring JDBC 核心类之一。
使用下面 SQL 查询一下数据库 t_user
表里都有哪些用户
select * from t_user
查询代码如下:
String sql = "select * from t_user";
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);
使用下面 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);
使用下面 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);
使用下面 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);
使用下面 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);
启动类
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 users = userDao.getUserByIdViaQueryForList();
StringBuilder sb = new StringBuilder();
for (User user : users) {
sb.append(user).append("");
}
return sb.toString();
}
@GetMapping("update")
public String update() {
int count = userDao.insertUser();
return "插入了一个id是5的用户,并且年龄是44";
}
@GetMapping("query")
public String query() {
List 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');
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
https://github.com/cheney09/spring-practical-combat/tree/main/03/demo
本文介绍了 Spring JDBC 如何使用 JdbcTemplate
进行基本的常用操作以及详细的案例。在实际应用中,你可以根据具体的业务需求和数据库类型进行适当的调整。