文章目录
- 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 {@Autowiredprivate 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 {@Autowiredprivate 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();}@Beanpublic 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
进行基本的常用操作以及详细的案例。在实际应用中,你可以根据具体的业务需求和数据库类型进行适当的调整。