作者:一一哥
我在上一章节中,重点讲解了Spring中关于DataSource的一些理论知识点,接下来本章节我主要是带大家学习JdbcTemplate的使用。
JDBC虽然能够满足大部分用户最基本的需求,但是在使用JDBC时,必须自己来管理数据库的资源,如获取PreparedStatement,设置SQL语句参数,关闭连接等操作,使用起来非常的麻烦。
所以为了简化对JDBC的操作,Spring为数据库JDBC做了深层次的封装。它利用DI注入功能,把DataSource注入到了JdbcTemplate之中,从而得到了JdbcTemplate操作模板类。JdbcTemplate的出现,使得JDBC的操作更加简单易用。
JdbcTemplate可以帮助我们处理资源的建立和释放,运行核心的JDBC工作流,如Statement的建立和执行,而我们只需要提供SQL语句和提取结果;并且也可以使我们避免一些常见的错误,比如忘记关闭数据库连接。
JdbcTemplate位于spring-jdbc-xxx.jar包中,其全限定命名为org.springframework.jdbc.core.JdbcTemplate。要使用JdbcTemplate还需一个spring-tx-xxx.jar依赖包,该包包含了事务和异常控制。
将该项目改造成spring-boot项目,具体过程请参考我之前关于spring-boot项目创建的章节。
项目结构:
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
com.alibaba
druid
1.1.10
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之后推荐使用这个驱动包
下面是第一种数据源配置方式。
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;
}
}
也可以采用第二种配置方式:
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;
}
}
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;
}
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 findUserList();
}
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 list = jdbcTemplate.query("select * from users where id = ?", new Object[]{id}, new BeanPropertyRowMapper(Users.class));
return list.size()>0?list.get(0):null;
}
@Override
public List findUserList() {
// 使用Spring的JdbcTemplate查询数据库,获取List结果列表,数据库表字段和实体类自动对应,可以使用BeanPropertyRowMapper
List list = jdbcTemplate.query("select * from users", new Object[]{}, new BeanPropertyRowMapper(Users.class));
return list.size()>0?list:null;
}
}
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 findUserList();
}
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 findUserList() {
return userDao.findUserList();
}
}
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 findUserList(){
return iUserService.findUserList();
}
@DeleteMapping("/{id}")
public int deleteUserById(@PathVariable Integer id){
return iUserService.delete(id);
}
}
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);
}
}
在浏览器或者postman中测试我们刚才创建的接口。
其他接口不一一测试,都可以正常使用!