在前面的章节中,壹哥 给大家讲解了SpringBoot对Web模块的支持,但是我们开发时还有另一个重头戏,那就是进行数据库的操作。所以从本章开始,我会带大家学习在Spring Boot中实现数据库的操作。
我这里说的数据库,不仅仅有关系型数据库,比如MySQL,还包括非关系型数据库,比如Redis等。
我们现在进行关系型数据库操作时,可以选择的技术框架其实有很多,比如原生的Jdbc,还有Mybatis、JPA等开源框架,接下来我会分别针对这几个技术进行讲解,今天我先讲解在SpringBoot中利用JdbcTemplate实现数据库的CRUD操作。
一. JdbcTemplate
在开始代码实操之前,我们先来了解一些理论内容。
1. JdbcTemplate简介
JDBC虽然能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库的资源,如获取PreparedStatement,设置SQL语句参数,关闭连接等操作,使用起来非常的麻烦。
所以为了简化对JDBC的操作,Spring为数据库JDBC做了深层次的封装。它利用DI注入功能,把DataSource注入到了JdbcTemplate之中,从而得到了JdbcTemplate操作模板类。JdbcTemplate的出现,使得JDBC的操作更加简单易用。
2. JdbcTemplate的作用
JdbcTemplate可以帮助我们处理资源的建立和释放,运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果;并且也可以使我们避免一些常见的错误,比如忘记关闭数据库连接。
3. JdbcTemplate依赖包介绍
JdbcTemplate位于spring-jdbc-xxx.jar包中,其全限定命名为org.springframework.jdbc.core.JdbcTemplate
。要使用JdbcTemplate还需一个spring-tx-xxx.jar依赖包,该包包含了事务和异常控制。
4. JdbcTemplate的核心方法
在JdbcTemplate中有哪些核心方法供我们调用呢? 我们常用的重要方法有如下几类:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法:update方法用于执行INSERT、UPDATE、DELETE等DML语句;
batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行DQL查询相关语句;
call方法:用于执行存储过程、函数相关语句。
那么JdbcTemplate到底该怎么使用呢?
导入数据库相关依赖包,比如jpa或者jdbc;
获取所需的某个DataSource数据源连接池对象;
创建JdbcTemplate对象,传入到连接池中;
调用execute、update、queryXxx等方法。
二. Spring Boot整合JdbcTemplate
接下来我就带各位利用JdbcTemplate实现CRUD操作,看看都需要做哪些事情吧。
1. 准备工作
我们要注意自己的开发环境,尽量要满足如下要求:
SpringBoot 2.x
JDK 1.8
Maven 3.0
Intellij Idea
MySQL
3. pom.xml文件中添加依赖
在项目的pom.xml文件中添加jdbc、mysql、druid数据源的依赖包。
然后我们创建一个application.yml文件,并在其中配置自己的数据库信息。
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/db5?useUnicode=true&characterEncoding=utf8&serverTimezOne=UTC&useSSL=true
username: root
password: syc
driver-class-name: com.mysql.cj.jdbc.Driver #mysql6.0之后推荐使用这个驱动包
mysql-connector-java版本6.0以前使用的是com.mysql.jdbc.Driver,6.0以后的使用com.mysql.cj.jdbc.Driver。
因为本案例中使用的Druid作为数据源,所以我在这里封装一个配置类,把application.yml文件中的信息读取进来。
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第一种配置方式
*/
@ComponentScan
@Configuration
public class DbConfig {
@Autowired
private Environment env;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
}
除了可以使用上面的方法读取application.yml文件中的配置信息之外,我们也可以采用第2种配置方式进行填充配置,代码如下:
package com.yyg.boot.config;
import com.alibaba.druid.pool.DruidDataSource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description 第二种配置数据源的方式
*/
@Data
@ComponentScan
@Configuration
@ConfigurationProperties(prefix="spring.datasource")
public class SecondDbConfig {
private String url;
private String username;
private String password;
@Bean
public DataSource getDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
这里我们封装一个Users实体类,用于封装数据库中的信息。
package com.yyg.boot.domain;
import lombok.Data;
import lombok.ToString;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Data
@ToString
public class Users {
private Integer id;
private String username;
private String password;
}
接下来我会在dao层包中,创建一个IUserDao接口,内部封装数据库的增删改查方法。
package com.yyg.boot.dao;
import com.yyg.boot.domain.Users;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
public interface IUserDao {
int add(Users student);
int update(Users student);
int delete(int id);
Users findUserById(int id);
List
}
编写一个UserDaoImpl实现类,实现上面的IUserDao接口,在这个类中利用原生的SQL语句实现数据库的CRUD操作。
package com.yyg.boot.dao.impl;
import com.yyg.boot.dao.IUserDao;
import com.yyg.boot.domain.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Repository
public class UserDaoImpl implements IUserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public int add(Users user) {
return jdbcTemplate.update("insert into users(username, password) values(?, ?)",
user.getUsername(),user.getPassword());
}
@Override
public int update(Users user) {
return jdbcTemplate.update("UPDATE users SET username=? ,password=? WHERE id=?",
user.getUsername(),user.getPassword(),user.getId());
}
@Override
public int delete(int id) {
return jdbcTemplate.update("DELETE from TABLE users where id=?",id);
}
@Override
public Users findUserById(int id) {
// BeanPropertyRowMapper 使获取的 List 结果列表的数据库字段和实体类自动对应
List
return list.size()>0?list.get(0):null;
}
@Override
public List
// 使用Spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper
List
return list.size()>0?list:null;
}
}
根据3层架构,我们会有dao层、service层、web层,所以这里我再创建service层的核心业务代码,调用dao层接口。
package com.yyg.boot.service;
import com.yyg.boot.domain.Users;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
public interface IUserService {
int add(Users user);
int update(Users user);
int delete(int id);
Users findUserById(int id);
List
}
package com.yyg.boot.service.impl;
import com.yyg.boot.dao.IUserDao;
import com.yyg.boot.domain.Users;
import com.yyg.boot.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
@Override
public int add(Users user) {
return userDao.add(user);
}
@Override
public int update(Users user) {
return userDao.update(user);
}
@Override
public int delete(int id) {
return userDao.delete(id);
}
@Override
public Users findUserById(int id) {
return userDao.findUserById(id);
}
@Override
public List
return userDao.findUserList();
}
}
9. 创建Web层的Controller
然后我们再编写一个Controller,在这里定义几个RESTful风格的URL接口。
package com.yyg.boot.web;
import com.yyg.boot.domain.Users;
import com.yyg.boot.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService iUserService;
@PostMapping("")
public int addUser(@RequestBody Users user){
return iUserService.add(user);
}
@PutMapping("/{id}")
public String updateUser(@PathVariable Integer id, @RequestBody Users user){
Users oldUser = new Users();
oldUser.setId(id);
oldUser.setUsername(user.getUsername());
oldUser.setPassword(user.getPassword());
int t = iUserService.update(oldUser);
if (t == 1){
return user.toString();
}else {
return "更新学生信息错误";
}
}
@GetMapping("/{id}")
public Users findUserById(@PathVariable Integer id){
return iUserService.findUserById(id);
}
@GetMapping("/list")
public List
return iUserService.findUserList();
}
@DeleteMapping("/{id}")
public int deleteUserById(@PathVariable Integer id){
return iUserService.delete(id);
}
}
10. 创建启动类
最后我们再编写一个启动类。
package com.yyg.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author 一一哥Sun
* @Date Created in 2020/3/30
* @Description Description
*/
@SpringBootApplication
public class JdbcApplication {
public static void main(String[] args){
SpringApplication.run(JdbcApplication.class,args);
}
}
11. 完整项目结构
完整的项目结构如下,各位可以参考创建。
12. 接口测试
启动项目后,我们可以在浏览器或者postman中测试刚才创建的接口。
其他接口我就不再一一测试了,都是可以正常使用的!
结语
至此,我就用JdbcTemplate实现了MySQL数据库的增删改查,整体会有点麻烦,代码实现比Mybatis麻烦一些,更没有JPA简单。对于JdbcTemplate这种技术,各位简单了解即可,现在开发时很少用了。
点击【阅读全文】,锋迷商城项目免费学