0x05 MyBatis & MyBatis-Plus

发布时间 2023-08-12 11:02:35作者: Icfh

0x05 MyBatis & MyBatis-Plus

ORM

ORM(Object Relational Mapping,对象关系映射)是为了解决面向对象

对象自动持久化或者数据库数据读取的一项技术

image-20230808233136360

MyBatis

MyBatis是一款优秀的数据持久层ORM框架,被广泛地应用于应用系统。

MyBatis能够非常灵活地实现动态SQL,可以使用XML或注解来配置和映射原生信息,能够轻松地Java的POJO(Plain Ordinary Java Object,普通的Java对象)与数据库中的表和字段进行映射关联。

MyBatis-Plus是一个MyBatis的增强工具。

使用MyBatis注解实现一个简易的数据库查询接口

大致思路

要本地启一个sql服务,然后利用@Mapper来注解相应的映射接口,在接口中实现增删改查

然后利用@Autowired注解相应的控制器,在控制器中指定路由,并完成相应的路由处理

具体过程如下

  • 首先需要在本地启一个sql的服务

此处我用phpstudy中的数据库服务,然后Navicat直接连接本地3306端口

image-20230809153217036

  • 导入依赖
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.20</version>
        </dependency>
  • properties配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false
spring.datasource.username=root
spring.datasource.password=icfhadmin
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  • 实现接口

在mapper目录下实现UserMapper

image-20230809143055528

由于是接口,故只要给出声明就可以

真正起作用的在于注解

package com.example.icfh_springboot1.mapper;

import com.example.icfh_springboot1.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;


@Mapper
public interface UserMapper {

    // 首先绑定sql语句和相应的方法
    // 允许使用函数调用的方式来

    // query all users
    @Select("select * from user")
    List<User> selectAll();

    @Select("select * from user where id=#{id}")
    User selectByID(int id);


    @Insert("insert into user values (#{id},#{username},#{password},#{birthday})")
    int insert(User user);


    @Delete("delete from user where id=#{id}")
    int delete(int id);

    @Update("update user set username=#{username},password=#{password},birthday=#{birthday} where id=#{id}")
    int update(User user);


}
  • 在启动入口加上注解 MapperScan注解

路径为mapper目录

image-20230809144056757

  • 最后声明控制器,调用相应的接口
package com.example.icfh_springboot1.controller;

import com.example.icfh_springboot1.entity.User;
import com.example.icfh_springboot1.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
public class UserDBController {


    /* 声明依赖注入 */
    @Autowired
    private UserMapper userMapper;

    @GetMapping("/user")
    public List query(){
        List<User> userList = userMapper.selectAll();
        System.out.println(userList);
        return userList;
    }

    /* 路由映射 */
    @GetMapping("/user/{id}")
    public User queryByID(@RequestParam("id") int id) {
        /* 路由 */
        return userMapper.selectByID(id);
    }

    @PostMapping("/user")
    public String insert(User user){
        /* 插入数据的校验逻辑 */
        /*
        ...
        * */

        int i = userMapper.insert(user);
        if(i>0){
            return "Insert Success!";
        }else{
            return "Insert Fail";
        }
    }

    // 满足RESTFul风格
    @DeleteMapping("/user/{id}")
    public int delete(@RequestParam("id") int id){
        return userMapper.delete(id);
    }

    @PutMapping("/user")
    public int update(@RequestParam("user") User user){
        return userMapper.update(user);
    }

}

  • web页面进行访问获得数据库的json格式数据

这是测试获取用户的结果

image-20230809153346298

POST访问,提交用户记录增添新用户

image-20230811234556015

添加了新用户icfh

image-20230811234947652

使用MyBatis-Plus

MyBatis-Plus一个很直观的印象就是进一步写好了数据库的增删改查工作,直接写路由调用就行了

直接给出项目代码吧

Mapper接口直接继承BaseMapper<User>

@Mapper
public interface UserMapper extends BaseMapper<User> {

    // 直接继承类完成上述的定义操作
    // 可以ctrl左键进入到BaseMapper
}

控制器实现如下

@RestController
public class UserDBController {

    @Autowired
    private UserMapper userMapper;


    @GetMapping("/user")
    public List query(){
        // 根据null条件进行查询
        List<User> list = userMapper.selectList(null);
        System.out.println(list);
        return list;
    }

    @PostMapping("/user")
    public String save(User user){
        int i = userMapper.insert(user);
        if(i > 0){
            return "insert success!";
        }else{
            return "insert fail";
        }
    }

}

测试如下:

image-20230812000546060