SpringBoot开发详解(四)--JDBC操作数据库

时间:2022-09-12 15:20:46

JDBC在Spring Boot中的配置

使用JDBC连接数据库:
通过上几篇幅的介绍,我们已经能够构建一个简单的,没有数据库的API接口项目,可是作为一个接口程序,没有数据库就是在耍流氓。那么本文我们就介绍下最简单的通过JDBC连接数据库的操作。

POM依赖添加

在POM文件中我们需要引入一些依赖来配置数据源,我们在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>

这里我加入了一个阿里的druid驱动,因为相比较于我们一直使用的jdbc驱动,druid是一个可监控的驱动,可以说是一个为监控而生的数据库驱动。想更详细了解的同学可以去druid的GItHub上查看druid

添加完依赖后,我们需要在配置文件中配置数据源信息,这里,我们配置下在之前建立的application-dev.yml下

spring:
datasource:
url: jdbc:mysql://localhost:3306/blog
username: root
password: 123
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource

完成以上操作的同学,我们的开发已经完成一半了,是的,Spring Boot就是这么简单。不需要写配置类,不需要额外的代码书写。开箱即用在Spring Boot的身上再一次完美体现。

使用JdbcTemplate

在书写代码前,有很重要的一件事要做,就是创建数据库以及数据表,这里我在blog库下创建一张tp_user表。

CREATE TABLE `tp_user` (
`user_id` int(10) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`tel` bigint(19) NOT NULL COMMENT '手机号=用户名',
`password` varchar(35) NOT NULL COMMENT '密码',
`nickname` varchar(30) DEFAULT NULL COMMENT '昵称',
`secret` varchar(35) NOT NULL COMMENT '秘钥',
`portrait` varchar(120) DEFAULT NULL COMMENT '头像地址',
`i_card` varchar(18) NOT NULL DEFAULT '' COMMENT '身份证',
`area` int(10) NOT NULL DEFAULT '0' COMMENT '所在区域',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=238 DEFAULT CHARSET=utf8

想再我们可以开始代码层面的编写工作了,在这里我先建立了一个Usercontroller类来获取前端传来的参数信息,这部分我们之前已经说过,这里不再赘述。然后将参数传入service层进行业务逻辑处理,之后由dao层负责与数据库交互。是的,这套路就是我们平时在是集开发工作中会用到的,所以我的文章里也会更多的将工作中使用的一些开发习惯以及开发技巧告诉大家。

UserController:

@RequestMapping("/user")
@RestController
public class UserController {

@Autowired
private UserService userService;

/**
* 添加用户
* @param tel 注册手机号
* @param pwd 设置密码
*/

@PostMapping("/createUser")
public void createUser(@RequestParam("tel") String tel, @RequestParam("pwd") String pwd){
userService.createUser(tel,pwd);
}

/**
* 更新用户信息
* @param user_id 用户ID
* @param nickName 昵称
*/

@PutMapping("/updateUser/{id}")
public void updateUser(@PathVariable("id") String user_id, @RequestParam("nickName") String nickName){
userService.updateUser(user_id,nickName);
}

/**
* 获取用户信息
* @param id 用户Id
* @return
*/

@GetMapping("/getUser/{id}")
public UserInfo getUser(@PathVariable("id") Integer id){
return userService.getUser(id);
}

@DeleteMapping("/deleteUserByUserId/{id}")
public void deleteUserByUserId(@PathVariable("id") Integer id){
userService.deleteUserByUserId(id);
}
}

注意:在这里使用到的@GetMapping,@PutMapping,@PathVariable,@RequestParam等注解,我们在下一篇中再仔细讨论下,这里我们先使用。
@UserService:

@Service
public class UserService {

@Autowired
UserInfoMapper userInfoMapper;

public void createUser(String tel,String pwd) {
userInfoMapper.createUser(tel,pwd);
}

public UserInfo getUser(Integer id) {
return userInfoMapper.getUser(id);
}

public void updateUser(String user_id, String nickName) {
userInfoMapper.updateUser(user_id,nickName);
}

public void deleteUserByUserId(Integer id) {
userInfoMapper.deleteUserByUserId(id);
}
}

在service类中我们通常通过@service注解来标示这是一个service,由spring在启动时自动扫描进容器中。

UseInfoMapper:

public interface UserInfoMapper {

void createUser(String tel,String pwd);

UserInfo getUser(Integer id);

void updateUser(String user_id, String nickName);

void deleteUserByUserId(Integer id);
}

创建一个抽象接口来定义我们对user的CRUD操作。

UserInfoImpl:

@Repository
public class UserInfoImpl implements UserInfoMapper {

@Autowired
private JdbcTemplate jdbcTemplate;

@Override
public void createUser(String tel,String pwd) {
jdbcTemplate.update("INSERT INTO blog.tp_user(tel,password,nickname,secret) VALUES (?,md5(?),?,'')",tel,pwd,tel);
}

@Override
public UserInfo getUser(Integer id) {
List<UserInfo> userList = jdbcTemplate.query("select tel,nickname,password FROM blog.tp_user WHERE user_id = ?",new Object[]{id},new BeanPropertyRowMapper(UserInfo.class));
if(userList != null && userList.size() > 0){
UserInfo user = userList.get(0);
return user;
}else {
return null;
}
}

@Override
public void updateUser(String user_id, String nickName) {
jdbcTemplate.update("UPDATE blog.tp_user SET nickname = ? WHERE user_id = ?",nickName,user_id);
}

@Override
public void deleteUserByUserId(Integer id) {
jdbcTemplate.update("DELETE FROM blog.tp_user WHERE user_id = ?",id);
}
}

我们在实现类中直接通过@Autowired注解来加载JdbcTemplate,通过@Repository注解来让spring自动加载,如果你对目前是哪一层不清楚,或者这只是你希望spring去自动加载的,你也可以使用@Compont注解。
做到上面的工作时,其实我们已经完成了一整个数据库读写的操作。但我在这里还是像啰嗦两句,其一,在实际开发中,我们对用户的敏感信息不做明文的保存,一般像密码这类的我们使用MD5加密后存进数据,因为MD5是单向的。如果是身份证一类的信息,我们通常使用对称加密后保存。其二,在使用JdbcTemplate时,有一个方法是queryForObject,要注意的是,该方法只能返回简单类型以及string,无法返回一个实体类。
SpringBoot开发详解(四)--JDBC操作数据库
好了,接下来我们开始测试吧,我们首先通过单元测试来添加一些用户信息。我们只需要在service中对想测试的方法右键,选择goto–>test,IDEA会自动帮我们在test目录下建立测试单元。

SpringBoot开发详解(四)--JDBC操作数据库

我们增加一点代码,然后点击左侧的运行按钮,会看到在输出台中我们的代码执行成功了,绿色代表成功,红色则是失败。

SpringBoot开发详解(四)--JDBC操作数据库

接着我们继续使用POSTMAN进行测试,在使用POSTMAN时要注意的是我们调用添加接口时,要在body中选择form-data一项来添加参数,如果使用@PutMapping时,我们要使用x-www-form-urlencoded一项,这是由于http的机制不同造成。
SpringBoot开发详解(四)--JDBC操作数据库

SpringBoot开发详解(四)--JDBC操作数据库

以上就是我们使用JDBC连接数据库的完整案例了,我们可以看到,开发十分的简单,都不用创建Bean就可以连接数据库了,不过一般开发中我们不使用JDBC直接连接(写完你才说!你TM在逗我!),而是更多的使用ORM框架来做数据库交互。在以上的案例中其实任然有许多值得优化的地方,比如如果我输入参数很多,是不是在controller层中要写很多参数来一个一个接收呢?眼尖的小伙伴应该已经发现我在返回用户信息时使用了User实体类。如果查询用户故意用小于0的数字查询呢?又或者有人恶意注册怎么限制呢?如果报错了,怎么不在界面展示一堆报错信息呢?有没有更好体验的报错提示呢?这些,我们下次一起来聊聊,聪明的你可以先想一下,或许你的想法比我想到的更好更完善~~~

以上所有的代码我已经上传到GitHub

round1-springboot

如果心急的小伙伴也可以去clone我已经完成的项目,这个项目中把一些常用功能都写了,并且都写注释啦!!!

MySpringBoot