一、地图
上一篇我们通过简单的Controller Service是实现了解了常用的Spring web注解,同时建立了基本的model mapper service controller结构
上一篇我们采用List模拟数据库的操作,这一篇我们来整合Mybatis与Mysql到Spring项目中,建立真正的数据库增删查改
可以用到的资料
Mybatis官方文档 https://mybatis.org/mybatis-3/zh/getting-started.html
Mybatis Spring官方文档 http://mybatis.org/spring/zh/index.html
Mybatis Spring Boot 官方文档 http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
狂神说Mybatis https://www.bilibili.com/video/BV1NE411Q7Nx
二、问题
我该如何实现Mybatis Mysql 与 Spring Boot 的整合 ?如何实现增删查改?@RequestParam 与无注解参数如何使用?
三、回答
Ⅰ、@RequestParam 与无注解参数
在上篇内容的基础上增加
我们有了一个新处理方法,它的参数没有@RequestBody标签 ,它的路径是localhost:8080/user/args
我们启动并测试
成功添加
查看他的请求体
同时也支持form-data
也支持在url上指定参数
我们再添加一个方法
同样能添加成功,实际上,这两种方式原理都是利用请求体中的参数寻找方法参数中相同名字的参数,或者对象中的属性来进行赋值。
既然如此 @RequestParam 有什么作用呢?
方法的参数不指定注解就是默认使用了@RequestParam ,而@RequestParam 可以指定更多的属性
https://blog.csdn.net/sswqzx/article/details/84195043
我们可以利用@RequestParam显式指定参数映射、 是否必须 、默认值
以下是一个实际使用的例子
Ⅱ、实现Mybatis Mysql 与 Spring Boot 的整合
现在我们引入项目的 Mybatis 与 Mysql依赖
搜索Mybatis组件
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
搜索Mysql 包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
将依赖加入pom中
在resources中创建 application.yml 这里名称位置是固定的,它是Spring boot 应用的配置文件
我们来观察 微人事 项目的配置
这里 spring.datasource 是关于数据源的配置,最主要的是 数据库驱动 用户名 密码 URL
这里微人事用到了阿里的德鲁伊数据源,我们不用管
mysql的安装这里不再介绍,确保两点 1.时区设为东八区 2.字符集设为utf-8 具体参考百度
使用mysql 工具 mysql workbench 建立一个数据库
在application.yml中填写配置
server:
port: 80
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
password:
url: jdbc:mysql://localhost:3306/mybatis?useSSL=true&characterEncoding=UTF-8
username: root
这里我的数据库没有密码,所以为空,另外,url的写法可以参阅mysql url https://blog.csdn.net/cyy356/article/details/90751581
此时spring 就拥有了 一个数据源
编写UserMapper接口,依照 Mybatis spring boot 官方文档的介绍 简单的CRUD 可以使用注解开发 http://mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
package com.bao.mapper;
import com.bao.model.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface UserMapper {
@Select("select * from user")
List<User> getAllUser();
@Select("select * from user where id=#{id}")
User getUserById(int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);
}
我们来为这个mapper做个测试,但是要做测试,就需要引入测试组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
放入pom中
新建一个测试类
import com.bao.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest(classes = {com.bao.LearnApp.class})
public class MyTest {
@Autowired
UserMapper userMapper;
@Test
public void t1(){
System.out.println(userMapper.getAllUser());
}
}
运行测试后可以看到结果
这里会有一个奇怪的发现 ,所有的password 都是null
这是因为数据库键和User对象属性对不上的原因
我们需要为这一问题自定结果集映射
package com.bao.mapper;
import com.bao.model.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Component;
import java.util.List;
@Mapper
@Component
public interface UserMapper {
@Select("select * from user")
@Results(id = "UserMap",value = {
@Result(property = "password",column = "pwd")
})
List<User> getAllUser();
@Select("select * from user where id=#{id}")
@ResultMap("UserMap")
User getUserById(int id);
@Insert("insert into user(id,name,pwd) values (#{id},#{name},#{password})")
int addUser(User user);
@Update("update user set name=#{name},pwd=#{password} where id=#{id}")
int updateUser(User user);
@Delete("delete from user where id=#{id}")
int deleteUserById(int id);
}
再次运行测试
问题解决,所有用户都可以查到, Spring boot 与 Mybatis Mysql 成功整合。
sql语句 与 mapper接口 相关的知识可以参阅 Mybatis 官方文档 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
Ⅲ、实现增删查改
我们将mapper注入到service层中,并编写代码
package com.bao.service;
import com.bao.mapper.UserMapper;
import com.bao.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
UserMapper userMapper;
public List<User> getAllUser(){
return userMapper.getAllUser();
}
public int addUser(User user){
return userMapper.addUser(user);
}
public User getUserById(int id){
return userMapper.getUserById(id);
}
public int updateUser(User user){
return userMapper.updateUser(user);
}
public int deleteUserById(int id){
return userMapper.deleteUserById(id);
}
}
之后将service层注入controller层中,并编写代码
package com.bao.controller;
import com.bao.model.User;
import com.bao.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/")
public List<User> getAllUser(){
return userService.getAllUser();
}
@GetMapping("/{id}")
public User getUserById(@PathVariable int id){
return userService.getUserById(id);
}
@PostMapping("/")
public int addUser(@RequestBody User user){
return userService.addUser(user);
}
@PutMapping("/")
public int updateUser(@RequestBody User user){
return userService.updateUser(user);
}
@DeleteMapping("/{id}")
public int deleteUser(@PathVariable int id){
return userService.deleteUserById(id);
}
}
启动我们的项目并进行测试
查询用户
新增用户
修改
删除
成功实现
技能点
技能点 |
---|
@RequestParam |
spring boot 配置 |
@Mapper |
@Select @Insert @Delete @Update |
@Autowired |
@Service |
@Results @Result @ResultMap |
@Component |