【Spring实战】03 JDBC常用操作
文章目录
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
进行基本的常用操作以及详细的案例。在实际应用中,你可以根据具体的业务需求和数据库类型进行适当的调整。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!