集成其他框架或者技术的步骤
- 引入依赖
- 配置文件
- 直接使用
springboot中使用第三方技术的启动器的命名方式
- xxxx-spring-boot-starter
创建测试的数据库
本次案例的环境
- Mysql8.xx系列的数据库
- 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');
执行脚本:
- 打开navicat16工具 创建数据库
- 在该数据库中使用查询工具 进行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 {
}
需求:获取所有员工信息
- 控制层---EmpController
- 数据层---EmpServiceImp
- 持久层---EmpDao
- 测试----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 # 开启自动下划线转驼峰