Spring Boot JDBC操作数据库
前面几篇文章已经讲解了Spring Boot的一些基本概念和基本使用,接下来我们就要获得数据了,为了初学者掌握起来比较方便,这里就直接进入主题,不再讲述过多的原理了,首先还是创建工程,之前为了讲述spring Boot的一些原理使用的eclipse,那这里为了快速方便,直接使用Intellij IDEA开发工具
一.使用IntelliJ IDEA创建Spring Boot工程
IntelliJ IDEA其实还是通过https://start.spring.io直接创建一个工程,并直接导入到IDEA的项目环境中
1.选择初始化工程网站
2.工程的基础信息创建
3.选择POM.xml的包依赖 这里其实还需要加入其它的一些依赖,不过我们还是可以通过后面修改POM.xml文件直接进行添加
4.确定工程名称已经工程位置
这样一个在IntelliJ IDEA中一个基本的Spring Boot工程就创建好了.
二.创建数据库
要进行JDBC的测试,那肯定要现有数据库的一些内容了,在mysql中创建你自己的数据库和表,做一下简单的测试,我这里创建的数据库是crm
,表名是t_user
,你完全可以按照你的需要创建一个简单的数据库和表
DROP DATABASE IF EXISTS `crm`;
CREATE DATABASE `crm`;
use `crm`;
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_tel` varchar(11) COLLATE utf8mb4_unicode_ci NOT NULL,
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`password` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`registration_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8;
INSERT INTO `t_user` VALUES ('1', '13880000001', '金庸', '0b4e7a0e5fe84ad35fb5f95b9ceeac79', '2018-12-15 06:54:16'), ('2', '13880000002', '张三丰', '875f26fdb1cecf20ceb4ca028263dec6', '2018-12-15 06:54:16'), ('3', '13880000003', '张无忌', 'c1f68ec06b490b3ecb4066b1b13a9ee9', '2018-12-15 06:54:16'), ('4', '13880000004', '黄蓉', '980ac217c6b51e7dc41040bec1edfec8', '2018-12-15 06:54:16'), ('5', '13880000005', '郭靖', 'cd87cd5ef753a06ee79fc75dc7cfe66c', '2018-12-15 06:54:16'), ('6', '13880000006', '周伯通', 'eed8cdc400dfd4ec85dff70a170066b7', '2018-12-15 06:54:16');
三.POM添加依赖
创建工程的时候,我们只是简单添加了之前对于Web和Thymeleaf的依赖,现在要连接数据库,所以,肯定需要添加对于数据库的相关依赖
POM.xml:
<!--数据库连接jdbc依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--mysql链接依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--阿里druid数据库连接池依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.5</version>
</dependency>
四.配置数据源信息
数据库的URL,用户名,密码这些肯定是要配置的,这些我们都可以再application.xml配置文件中完成配置,这里我使用的application.yml文件
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3307/crm
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
server:
servlet-path: /
port: 8081
注意,我这里的数据库由于直接使用的是Docker容器中的MySql数据库,所以端口映射出来后修改了一下端口号...如果不清楚Docker完全可以使用自己机器上的MySql数据库来做实验
五.工程基本架构
为了不至于练习太过于简单,这里还是搭建了基本的三层架构
六.在Dao层中使用JDBCTemplate
在Dao直接注入使用JDBCTemplate进行基本的CRUD操作
IUserDao.java
package com.yingside.demo.dao;
import com.yingside.demo.bean.User;
import java.util.List;
public interface IUserDao {
public int add(String tel, String username, String password);
public User get(int id);
public List<User> list();
public int delete(int id);
public int update(User user);
}
UserDaoImpl.java
package com.yingside.demo.dao.impl;
import com.yingside.demo.bean.User;
import com.yingside.demo.dao.IUserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.*;
import org.springframework.stereotype.Repository;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Repository
public class UserDaoImpl implements IUserDao {
@Autowired
JdbcTemplate jdbcTemplate;
public int add(String tel, String username, String password) {
return jdbcTemplate.update("INSERT INTO t_user(user_tel,username,password) VALUES (?,?,md5(?))",
tel,username,password);
}
@Override
public User get(int id) {
String sql = "select * from t_user where id=?";
return jdbcTemplate.query(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1,id);
}
}, new ResultSetExtractor<User>() {
@Override
public User extractData(ResultSet rs) throws SQLException, DataAccessException {
User u = null;
if(rs.next()){
u = new User();
u.setId(rs.getInt("id"));
u.setUserTel(rs.getString("user_tel"));
u.setUsername(rs.getString("username"));
u.setPassword(rs.getString("password"));
u.setRegistrationTime(rs.getString("registration_time"));
}
return u;
}
});
}
@Override
public List<User> list() {
String sql = "select * from t_user";
BeanPropertyRowMapper<User> rowMapper = new BeanPropertyRowMapper<User>(User.class);
return jdbcTemplate.query(sql,rowMapper);
}
@Override
public int delete(int id) {
String sql = "delete from t_user where id=?";
return jdbcTemplate.update(sql,id);
}
@Override
public int update(User user) {
String sql = "update t_user set user_tel=?,username=?,password=md5(?) where id=?";
int n = jdbcTemplate.update(sql,user.getUserTel(),user.getUsername(),user.getPassword(),user.getId());
return n;
}
}
这里只需要注意三点:
- Dao层需要使用
@Repository
进行声明 - 使用
@Autowired
注入JdbcTemplate
对象 - JdbcTemplate基本的增删改查方法的使用
前两点都很简单,没有使用过JdbcTemplate
的,查询一下相关文档就可以了,简单来说,常常会使用的就是几个方法update,query,queryForList,queryForObject,当然每个方法里面都有相当多的重载
我这里在使用查询的时候,用了2中比较典型的不同的方法
public <T> T query(String sql, PreparedStatementSetter pss, ResultSetExtractor<T> rse) throws DataAccessException
public <T> List<T> query(String sql, RowMapper<T> rowMapper) throws DataAccessException
第一种方法相当于需要创建两个内部类,在内部类中就可以直接使用PreparedStatement
和ResultSet
对象了,和写传统的JDBC其实没多少差别
第二种方式直接使用BeanPropertyRowMapper
类,它是RowMapper
的一个子类,简单来说,这个类会自动的把你写的javaBean
和数据库中的字段做映射,相当的方便,当然方便的前提便是约定,约定是你的javaBean
必须和数据库字段要一一对应,当然,涉及到多个单词的,他会自动的把驼峰规则转换为下划线
七.Service层
这里的业务非常简单,所以,Service层就不需要干什么事情了,仅仅是做一次数据的中转而已 IUserService.java
package com.yingside.demo.service;
import com.yingside.demo.bean.User;
import java.util.List;
public interface IUserService {
public boolean addUser(String tel, String username, String password);
public User getUserById(int id);
public List<User> getAllUsers();
public boolean updateUser(User user);
public boolean deleteUser(int id);
}
UserServiceImpl.java
package com.yingside.demo.service.impl;
import com.yingside.demo.bean.User;
import com.yingside.demo.dao.IUserDao;
import com.yingside.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements IUserService {
@Autowired
private IUserDao userDao;
public boolean addUser(String tel, String username, String password) {
return userDao.add(tel,username,password) >= 1 ? true : false;
}
@Override
public User getUserById(int id) {
return userDao.get(id);
}
@Override
public List<User> getAllUsers() {
return userDao.list();
}
@Override
public boolean updateUser(User user) {
return userDao.update(user) >= 1?true:false;
}
@Override
public boolean deleteUser(int id) {
return userDao.delete(id) >= 1? true : false;
}
}
这里也需要注意两点:
- Service层需要使用
@Service
进行声明 - 使用
@Autowired
注解注入IUserDao对象
八.Controller
package com.yingside.demo.controller;
import com.yingside.demo.bean.User;
import com.yingside.demo.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class UserController {
@Autowired
private IUserService userService;
@PostMapping("/addUser")
public String add(@RequestParam("tel")String tel,@RequestParam("username")String username, @RequestParam("password")String password){
boolean flag = userService.addUser(tel,username,password);
if(flag){
return "成功!";
}
else{
return "失败";
}
}
@GetMapping("/getUser/{id}")
public User getUser(@PathVariable("id") Integer id){
return userService.getUserById(id);
}
@GetMapping("/allUser")
public List<User> getAll(){
return userService.getAllUsers();
}
@PutMapping("/update/{id}")
public String update(@PathVariable("id")Integer id,@RequestParam("tel")String tel,String username,String password){
User user = new User();
user.setId(id);
user.setUserTel(tel);
user.setUsername(username);
user.setPassword(password);
boolean flag = userService.updateUser(user);
if(flag){
return "更新成功!";
}else{
return "更新失败!";
}
}
@DeleteMapping("/delete/{id}")
public String delete(@PathVariable("id")Integer id){
boolean flag = userService.deleteUser(id);
if(flag){
return "删除成功!";
}
else{
return "删除失败!";
}
}
}
在这一层,当然也需要注意下面的几个问题
@RestController
放在类上修饰,表示整个类都支持Restful方式- 需要注入
IUserService
对象 - 需要对
SpringMVC
的相关注解有一定了解
写完这些之后,至少我们后台相关的都已经写完了,没有界面,可以先使用工具POSTMAN
来进行测试
Comments