JdbcTemplate连接数据库
Java 的 javax.sql.DataSource 接口提供了处理数据库连接的标准方法,通过配置一个连接池提供数据库连接,Spring Boot 可以完成一些自动配置。首选HikariCP 连接池,也可使用 Tomcat 连接池,如果这两个连接池都不可用,则使用 DBCP2。当然,开发者也可以自定义连接池,如采用阿里巴巴的 Druid 等。
Spring Boot 提供了自动配置,因此开发者只需在配置文件中添加数据库的配置信息即可。Spring Boot 提供了多种类型的连接池,如spring.datasource.hikari.*、spring.datasource.tomcat.* 和 spring.datasource.dbcp2.* 等。
注意:如果不指定 spring.datasource.url 属性,则 Spring Boot 会自动配置内嵌的数据库。
一个简单的 DataSoruce 配置如下:
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=50
spring.datasource.tomcat.test-on-borrow=true
JdbcTempale模板类
JdbcTemplate 是一个模板类,提供了操作数据库的基本方法,如插入、更新、删除及查询等操作,同时还封装了一些固定操作,如连接的创建与关闭。JdbcTemplate 类提供了回调接口的方式,用于实现一些可变操作,如 ConnectionCallback 可以返回一个连接,StatementCallback 可以返回一个Statement,还可以在回调接口做一些映射关系的逻辑处理。JdbcTemplate 模板类提供了以下几种类型的方法:
- execute()方法:可以执行任何 SQL 语句,一般多用于执行 DDL(做数据定义)类型的语句。
- update()方法:执行新增、修改、删除等语句。
- query()方法:执行与查询相关的语句。
- call()方法:执行与数据库存储过程和函数相关的语句。
示例
下面通过一个简单的示例展示 JdbcTemplate 的操作。(1)定义一张 user 表,结构如下:
CREATE TABLE `user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`user_name` varchar(128) NOT NULL COMMENT '用户昵称',
`login_name` varchar(128) NOT NULL COMMENT '登录账户',
`user_head_img` varchar(256) DEFAULT NULL COMMENT '用户头像',
`last_login_time` int(11) DEFAULT NULL COMMENT '上次登录时间'
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db?useUnicode=true&character
Encoding=UTF8&characterSetResults=UTF8&serverTimezone=UTC
username: root
password: test1111
driver-class-name: com.mysql.cj.jdbc.Driver
//声明实体类User
public class User {
private Integer userId; //用户ID
private String userName; //用户名
private String loginName; //登录名
private Integer lastLoginTime; //登录时间
private String userHeadImg; //用户头像
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName == null ? null : userName.trim();
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName == null ? null : loginName.trim();
}
public Integer getLastLoginTime() {
return lastLoginTime;
}
public void setLastLoginTime(Integer lastLoginTime) {
this.lastLoginTime = lastLoginTime;
}
public String getUserHeadImg() {
return userHeadImg;
}
public void setUserHeadImg(String userHeadImg) {
this.userHeadImg = userHeadImg == null ? null : userHeadImg.
}
}
(4)定义 Dao 层的类UserDao,在其中使用 JdbcTemplate 操作 MySQL 数据库,代码如下:
//声明UserDao
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate; //JdbcTemplate注入
public String add(User user) {
//insert语句
String sql = "insert into user(user_name, login_name, last_login_time, user_head_img) value (?, ?, ?, ?)";
try {
jdbcTemplate.update(sql, user.getUserName(), user.getLoginName(), user.getLastLoginTime(), user.getUserHeadImg());
return "1";
} catch (DataAccessException e) {
e.printStackTrace();
return "0";
}
}
public User findOne(Integer userId) {
//查询语句
String sql = "select * from user where user_id = " + userId;
List<User> userList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
return userList.get(0);
}
public String update(User user) {
//更新语句
String sql = "update user set user_name = ?, login_name = ? where user_id = ?";
try {
jdbcTemplate.update(sql, user.getUserName(), user.getLoginName(), user.getUserId());
return "1";
} catch (DataAccessException e) {
return "0";
}
}
public String delete(Integer userId) {
//删除语句
String sql = "delete from user where user_id = ?";
try {
jdbcTemplate.update(sql, userId);
return "1";
} catch (DataAccessException e) {
return "0";
}
}
public List<User> findAll() {
//查询多条语句
String sql = "select * from user";
List<User> query = jdbcTemplate.query(sql, new BeanProperty RowMapper < > (User.class));
return query;
}
}
(5)定义 Service 层的类 UserService,代码如下:
@Service
public class UserService {
@Autowired
private UserDao userDao;
//添加方法
public String add(User user){
return userDao.add(user);
}
//查询方法
public User findOne(Integer userId){
return userDao.findOne(userId);
}
//更新方法
public String update(User user){
return userDao.update(user);
}
//删除操作
public String delete(Integer userId){
return userDao.delete(userId);
}
//查询列表方法
public List<User> findAll(){
return userDao.findAll();
}
}
(6)定义 Controller 层的类 HiController,代码如下:
@RestController
@RequestMapping("/hi")
public class HiController {
@Autowired
private UserService userService;
//新增用户接口
@PostMapping("/add")
public String add(@RequestBody User user){
return userService.add(user);
}
//查询用户接口
@GetMapping("/findOne")
public User findOne(Integer userId){
return userService.findOne(userId);
}
//更新用户接口
@PostMapping("/update")
public String update(@RequestBody User user){
return userService.update(user);
}
//删除用户接口
@DeleteMapping("/delete")
public String delete(Integer userId){
return userService.delete(userId);
}
//查询多条用户信息接口
@GetMapping("/findAll")
public List<User> findAll(){
return userService.findAll();
}
}
(7)启动服务,使用 Postman 以 POST 方式访问 http://localhost:8080/hi/add 接口,在请求 Body 中增加如下信息:
{
"userName":"编程帮",
"loginName":"www.weixueyuan.net",
"lastLoginTime":"1599032640",
"userHeadImg":"https://image.xxx.com/xxx.jpg"
}
(8)访问 http://localhost:8080/hi/findAll 接口,即可查看刚才插入的用户信息。同样,访问 http://localhost:8080/hi/update 接口可以更新用户信息,访问 http://localhost:8080/ hi/delete?userId=130 接口可以删除用户信息。声明:《Java系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。