• SpringBoot集成MyBatis


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

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

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

    • xxxx-spring-boot-starter

    创建测试的数据库

    本次案例的环境

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

    数据库的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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    执行脚本:

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

    创建数据库

    image-20230913142847718

    新建查询

    image-20230913142934367

    执行脚本

    image-20230913143028953

    集成Mybatis框架

    引入依赖

    • orm框架的依赖
    • Mysql数据库连接驱动
          
            <dependency>
                <groupId>org.mybatis.spring.bootgroupId>
                <artifactId>mybatis-spring-boot-starterartifactId>
                <version>2.2.0version>
            dependency>
            
            <dependency>
                <groupId>mysqlgroupId>
                <artifactId>mysql-connector-javaartifactId>
                <version>8.0.33version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    配置文件(application.yaml)

    1.原始的spring框架要使用第三方的技术——————将第三方技术注册为Bean 并且要给IOC管理
    2.给IOC管理?通过使用spring的xml配置文件中配置 bean标签的方式
    3.springboot的启动了就是一个配置类 所有也可以在这里使用注解的方式来进行原生注册Bean(Spring纯注解开发)
    4.也可以通过springboot的配置文件进行注册(yml文件)—推荐(springboot和该技术在进行了整合后才能使用)

    # 修改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 # 请求的数据库服务路径
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    创建相关的源文件

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

    创建Emp员工实体

    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 + "}";
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123

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

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

    控制层

    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    服务层接口

    package top.yxqz.number2.service;
    
    /**
     * @author: 余小小
     * @date: 2023/9/13
     * @description:员工服务层接口
     */
    public interface EmpService {
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    服务层接口的实现类

    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    数据层

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    需求:获取所有员工信息

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

    控制层—EmpController

    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
         */
        public List<Emp> getAllEmps() {
            return empService.getAllEmps();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    服务层接口

    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();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    服务层实现类

    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();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    数据层

    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();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    测试代码

    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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

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

    image-20230913151909038

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

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

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

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

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

    #配置Mybatis
    mybatis:
      configuration:
        map-underscore-to-camel-case: true # 开启自动下划线转驼峰
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

  • 相关阅读:
    云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用
    SEO内链作用是什么,seo内链优化怎么做?
    【值符】嵌入式必备知识点&面试点
    网络安全系列-三十三: 网络情报原理及情报侦察的技术、工具及资源
    Ngnix 部署 结束顽固进程
    领域知识图谱的医生推荐系统:利用BERT+CRF+BiLSTM的医疗实体识别,建立医学知识图谱,建立知识问答系统
    中医实训室:在传统针灸教学中的应用与创新
    iOS13 tabBar 设置背景色失效
    【离网逆变器】离网逆变器型号由一个高频DC-DC升压转换器与全桥PI控制电压源逆变器级联组成、逆变器使用带LC滤波器的SPWM调制(Simulink)
    瑞芯微:基于RK3568的深度估计模型部署
  • 原文地址:https://blog.csdn.net/qq_40609008/article/details/132855296