【日程三】Spring Web + Mybatis + Mysql

一、地图

【日程三】Spring Web + Mybatis + Mysql

上一篇我们通过简单的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 与无注解参数

在上篇内容的基础上增加

【日程三】Spring Web + Mybatis + Mysql

我们有了一个新处理方法,它的参数没有@RequestBody标签 ,它的路径是localhost:8080/user/args

我们启动并测试

【日程三】Spring Web + Mybatis + Mysql

成功添加

【日程三】Spring Web + Mybatis + Mysql

查看他的请求体

【日程三】Spring Web + Mybatis + Mysql

同时也支持form-data

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

也支持在url上指定参数

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

我们再添加一个方法

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

同样能添加成功,实际上,这两种方式原理都是利用请求体中的参数寻找方法参数中相同名字的参数,或者对象中的属性来进行赋值。

既然如此 @RequestParam 有什么作用呢?

方法的参数不指定注解就是默认使用了@RequestParam ,而@RequestParam 可以指定更多的属性

https://blog.csdn.net/sswqzx/article/details/84195043

【日程三】Spring Web + Mybatis + Mysql

我们可以利用@RequestParam显式指定参数映射、 是否必须 、默认值

以下是一个实际使用的例子

【日程三】Spring Web + Mybatis + Mysql

Ⅱ、实现Mybatis Mysql 与 Spring Boot 的整合

现在我们引入项目的 Mybatis 与 Mysql依赖

搜索Mybatis组件

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.3</version>
        </dependency>

搜索Mysql 包

【日程三】Spring Web + Mybatis + Mysql

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

将依赖加入pom中

【日程三】Spring Web + Mybatis + Mysql

在resources中创建 application.yml 这里名称位置是固定的,它是Spring boot 应用的配置文件

【日程三】Spring Web + Mybatis + Mysql

我们来观察 微人事 项目的配置

【日程三】Spring Web + Mybatis + Mysql

这里 spring.datasource 是关于数据源的配置,最主要的是 数据库驱动 用户名 密码 URL

这里微人事用到了阿里的德鲁伊数据源,我们不用管

mysql的安装这里不再介绍,确保两点 1.时区设为东八区 2.字符集设为utf-8 具体参考百度

使用mysql 工具 mysql workbench 建立一个数据库

【日程三】Spring Web + Mybatis + Mysql

在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

【日程三】Spring Web + Mybatis + Mysql

这里我的数据库没有密码,所以为空,另外,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/

【日程三】Spring Web + Mybatis + Mysql

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中

新建一个测试类

【日程三】Spring Web + Mybatis + Mysql

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

【日程三】Spring Web + Mybatis + Mysql

这是因为数据库键和User对象属性对不上的原因

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

我们需要为这一问题自定结果集映射

【日程三】Spring Web + Mybatis + Mysql

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 Web + Mybatis + Mysql

问题解决,所有用户都可以查到, Spring boot 与 Mybatis Mysql 成功整合。

sql语句 与 mapper接口 相关的知识可以参阅 Mybatis 官方文档 https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

Ⅲ、实现增删查改

我们将mapper注入到service层中,并编写代码

【日程三】Spring Web + Mybatis + Mysql

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层中,并编写代码

【日程三】Spring Web + Mybatis + Mysql

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);
    }
}

启动我们的项目并进行测试

查询用户

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

新增用户

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

修改

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

删除

【日程三】Spring Web + Mybatis + Mysql

【日程三】Spring Web + Mybatis + Mysql

成功实现

技能点

技能点
@RequestParam
spring boot 配置
@Mapper
@Select @Insert @Delete @Update
@Autowired
@Service
@Results @Result @ResultMap
@Component

【日程三】Spring Web + Mybatis + Mysql

上一篇:.NET 数据库事务的各种玩法进化


下一篇:mysql查询课程浏览记录表中最近一周浏览次数最多的课程