SpringBoot集成MyBatis

集成其他框架或者技术的步骤

  1. 引入依赖
  2. 配置文件
  3. 直接使用

springboot中使用第三方技术的启动器的命名方式

  • xxxx-spring-boot-starter

创建测试的数据库

本次案例的环境

  1. Mysql8.xx系列的数据库
  2. navicat16

数据库的SQL脚本:

sql 复制代码
CREATE TABLE `t_ssm_emp`  (
  `emp_id` int NOT NULL AUTO_INCREMENT,
  `emp_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `age` int NULL DEFAULT NULL,
  `sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`emp_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_ssm_emp
-- ----------------------------
INSERT INTO `t_ssm_emp` VALUES (1, '刘备', 22, '男', '123456@qq.com');
INSERT INTO `t_ssm_emp` VALUES (2, '关羽', 23, '女', '22222@qq.com');
INSERT INTO `t_ssm_emp` VALUES (3, '张飞', 24, '男', '333333@163.com');

执行脚本:

  1. 打开navicat16工具 创建数据库
  2. 在该数据库中使用查询工具 进行sql脚本执行

创建数据库

新建查询

执行脚本

集成Mybatis框架

引入依赖

  • orm框架的依赖
  • Mysql数据库连接驱动
xml 复制代码
      <!--        引入Mybatis启动器-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!--        mysql的连接驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>

配置文件(application.yaml)

1.原始的spring框架要使用第三方的技术------------------将第三方技术注册为Bean 并且要给IOC管理

2.给IOC管理?通过使用spring的xml配置文件中配置 bean标签的方式

3.springboot的启动了就是一个配置类 所有也可以在这里使用注解的方式来进行原生注册Bean(Spring纯注解开发)

4.也可以通过springboot的配置文件进行注册(yml文件)---推荐(springboot和该技术在进行了整合后才能使用)

yml 复制代码
# 修改Tomcat端口
server:
  port: 80
# Mysql的连接信息
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver  # 驱动包版本 cj的是8系列的数据库
    username: root # mysql的登录用户名
    password: 111111 # mysql的登录密码
    url:  jdbc:mysql://localhost:3306/springboot2_5 # 请求的数据库服务路径

创建相关的源文件

  • 控制层
  • 服务层
  • 数据层
  • 实体层

创建Emp员工实体

java 复制代码
package top.yxqz.number2.entity;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:员工实体类---和数据库中的表格列名保持一致 需要满足下划线和小驼峰的规范
 * 数据库----Java对照类型参考
 * int---int-- Integer
 * varchar--string-String
 * char---char--String
 * 因为在做前后端分离的时候 我们大多数 后端都是返回 的数据(json对象、集合)
 * 集合里面都是装的对象  对象可能会需要使用属性进行赋值 或者修改操作 是引用类型就比较方便
 * ORM框架会根据Java中的数据类型来自动ORM映射 如果是引用数据类型 映射的默认是null 可以避免部分报错
 */
public class Emp {
    //    员工id---主键
    private Integer empId;
    //    员工姓名
    private String empName;
    //    员工年龄
    private Integer age;
    //    员工性别
    private String sex;
    //    员工邮箱
    private String email;


    public Emp() {
    }

    public Emp(Integer empId, String empName, Integer age, String sex, String email) {
        this.empId = empId;
        this.empName = empName;
        this.age = age;
        this.sex = sex;
        this.email = email;
    }

    /**
     * 获取
     * @return empId
     */
    public Integer getEmpId() {
        return empId;
    }

    /**
     * 设置
     * @param empId
     */
    public void setEmpId(Integer empId) {
        this.empId = empId;
    }

    /**
     * 获取
     * @return empName
     */
    public String getEmpName() {
        return empName;
    }

    /**
     * 设置
     * @param empName
     */
    public void setEmpName(String empName) {
        this.empName = empName;
    }

    /**
     * 获取
     * @return age
     */
    public Integer getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(Integer age) {
        this.age = age;
    }

    /**
     * 获取
     * @return sex
     */
    public String getSex() {
        return sex;
    }

    /**
     * 设置
     * @param sex
     */
    public void setSex(String sex) {
        this.sex = sex;
    }

    /**
     * 获取
     * @return email
     */
    public String getEmail() {
        return email;
    }

    /**
     * 设置
     * @param email
     */
    public void setEmail(String email) {
        this.email = email;
    }

    public String toString() {
        return "Emp{empId = " + empId + ", empName = " + empName + ", age = " + age + ", sex = " + sex + ", email = " + email + "}";
    }
}

部分数据类型的设计不一致?

  • 因为在做前后端分离的时候 我们大多数 后端都是返回 的数据(json对象、集合)
  • 集合里面都是装的对象 对象可能会需要使用属性进行赋值 或者修改操作 是引用类型就比较方便
  • ORM框架会根据Java中的数据类型来自动ORM映射 如果是引用数据类型 映射的默认是null 可以避免部分报错

控制层

java 复制代码
package top.yxqz.number2.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import top.yxqz.number2.service.EmpService;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description: 员工的控制层
 * 返回的都是数据@RestController
 */
@RestController
public class EmpController {
    @Autowired
    private EmpService empService;
}

服务层接口

java 复制代码
package top.yxqz.number2.service;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:员工服务层接口
 */
public interface EmpService {
}

服务层接口的实现类

java 复制代码
package top.yxqz.number2.service.imp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.yxqz.number2.dao.EmpDao;
import top.yxqz.number2.service.EmpService;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:服务层接口的实现类
 */
@Service
public class EmpServiceImp implements EmpService {
    //    此处注入的是ORM框架自动生成的代理实现Mapper类 不在是自己实现的数据层
    @Autowired
    private EmpDao empDao;
}

数据层

java 复制代码
package top.yxqz.number2.dao;

import org.apache.ibatis.annotations.Mapper;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:数据层
 * 以前是自己来实现数据操作--自己JDBC操作数据库
 * 整合了Mybatis框架后 可以使用ORM框架进行操作
 * 1.使用xml方式来创建该接口的代理--手动(不推荐了)
 * 2.使用注解的方式 让ORM框架自动创建一个mapper的代理对象(mybaits的注解开发)
 */
@Mapper
public interface EmpDao {
}

需求:获取所有员工信息

  1. 控制层---EmpController
  2. 数据层---EmpServiceImp
  3. 持久层---EmpDao
  4. 测试----TestEmp

控制层---EmpController

java 复制代码
package top.yxqz.number2.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
import top.yxqz.number2.entity.Emp;
import top.yxqz.number2.service.EmpService;

import java.util.List;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description: 员工的控制层
 * 返回的都是数据@RestController
 */
@RestController
public class EmpController {
    @Autowired
    private EmpService empService;

    /**
     * 需求:获取所有员工信息(用集合来接收)(list)
     * 对一对应对象
     * 对多对应集合
     *
     * return empService.getAllEmps();
     * 代表了当前调用 是服务层的getAllEmps方法 并且该方法的返回值是List<Emp>
     */
    public List<Emp> getAllEmps() {
        return empService.getAllEmps();
    }
}

服务层接口

java 复制代码
package top.yxqz.number2.service;

import top.yxqz.number2.entity.Emp;

import java.util.List;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:员工服务层接口
 */
public interface EmpService {
    List<Emp> getAllEmps();
}

服务层实现类

java 复制代码
package top.yxqz.number2.service.imp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.yxqz.number2.dao.EmpDao;
import top.yxqz.number2.entity.Emp;
import top.yxqz.number2.service.EmpService;

import java.util.List;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:服务层接口的实现类
 */
@Service
public class EmpServiceImp implements EmpService {
    //    此处注入的是ORM框架自动生成的代理实现Mapper类 不在是自己实现的数据层
    @Autowired
    private EmpDao empDao;

    @Override
    public List<Emp> getAllEmps() {
        return empDao.getAllEmps();
    }
}

数据层

java 复制代码
package top.yxqz.number2.dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import top.yxqz.number2.entity.Emp;

import java.util.List;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:数据层
 * 以前是自己来实现数据操作--自己JDBC操作数据库
 * 整合了Mybatis框架后 可以使用ORM框架进行操作
 * 1.使用xml方式来创建该接口的代理--手动(不推荐了)
 * 2.使用注解的方式 让ORM框架自动创建一个mapper的代理对象(mybaits的注解开发)
 */
@Mapper
public interface EmpDao {
    
    @Select("select * from t_ssm_emp;")
    List<Emp> getAllEmps();
}

测试代码

java 复制代码
package top.yxqz.number2;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import top.yxqz.number2.controller.EmpController;
import top.yxqz.number2.entity.Emp;

import java.util.List;

/**
 * @author: 余小小
 * @date: 2023/9/13
 * @description:
 */
@SpringBootTest
public class TestEmp {

    //    注入控制层---调用服务层--数据层
    @Autowired
    private EmpController empController;

    /*
    建议方法名 和要测试的"接口"名保持一致
     */
    @Test
    public void getAllEmps() {
        List<Emp> allEmps = empController.getAllEmps();
        System.out.println(allEmps);
    }
}

测试结果:没有报错 但是数据不对 有数据是null

因为 Mysql数据库中用了下划线 但是我们实体类是使用的小驼峰

  • 使用结果映射进行一对一配置
  • 开启Mybatis自动下划线转驼峰(推荐)

以前SMM阶段 可以使用Mybaits的Setting配置来控制插件和开启相关的功能 但是Springboot呢?

Springboot的所有配置都在 application.yml中 所以关于Mybatis的配置也在application.yml中

在application.yml中 开启Mybaits自动转换 ,去Mybaits的官网去找先关整合Springboot的配置mybatis -- MyBatis 3 | 简介

yml 复制代码
#配置Mybatis
mybatis:
  configuration:
    map-underscore-to-camel-case: true # 开启自动下划线转驼峰
相关推荐
咸芝麻鱼3 分钟前
Django数据迁移出错,解决raise NodeNotFoundError问题
后端·python·django
paterWang11 分钟前
小程序-基于java+SpringBoot+Vue的农场管理系统设计与实现
java·spring boot·小程序
wqq_99225027713 分钟前
springboot基于微信小程序的停车场管理系统
spring boot·后端·微信小程序
尘浮生30 分钟前
Java项目实战II基于Java+Spring Boot+MySQL的共享汽车管理系统(源码+数据库+文档)
java·数据库·spring boot·mysql·微信小程序·小程序·汽车
儿时可乖了1 小时前
优化 Spring Boot 性能
spring boot·spring
飞奔的波大爷2 小时前
springboot vue工资管理系统源码和答辩PPT论文
vue.js·spring boot·后端
糖拌西红柿多放醋2 小时前
关于SpringBoot集成Kafka
java·spring boot·kafka
daiyang123...2 小时前
JavaEE 【知识改变命运】02 多线程(1)
java·开发语言·后端·java-ee·idea
凌虚2 小时前
Web 端语音对话 AI 示例:使用 Whisper 和 llama.cpp 构建语音聊天机器人
前端·人工智能·后端
2401_854391082 小时前
SpringBoot社团管理:用户体验优化
spring boot·后端·ux