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. 打开navicat16工具 创建数据库
  2. 在该数据库中使用查询工具 进行sql脚本执行

创建数据库

image-20230913142847718

新建查询

image-20230913142934367

执行脚本

image-20230913143028953

集成Mybatis框架

引入依赖

  • orm框架的依赖
  • Mysql数据库连接驱动
      <!--        引入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和该技术在进行了整合后才能使用)

# 修改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员工实体

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 可以避免部分报错

控制层

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

服务层接口

package top.yxqz.number2.service;

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

服务层接口的实现类

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

数据层

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

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

服务层接口

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

服务层实现类

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

数据层

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

测试代码

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

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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我最爱吃鱼香茄子

请小余喝瓶杯咖啡吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值