springboot(3.4.8)整合mybatis
一、为什么要整合
mybatis是一款优秀的持久层框架,使用它可以简化JDBC开发。
二、数据结构
因为mybatis是用于数据持久化的框架,所以数据是其基础。在写整合过程之前,先准备好数据,然后才能进行开发。
-- 创建品牌表
CREATE TABLE `t_brand` (`id` INT(11) NOT NULL AUTO_INCREMENT COMMENT '品牌ID,自增主键',`brand_name` VARCHAR(100) NOT NULL COMMENT '品牌名称',`company_name` VARCHAR(100) NOT NULL COMMENT '公司名称',`ordered` INT(11) DEFAULT 0 COMMENT '排序字段,用于展示顺序',`description` VARCHAR(500) DEFAULT NULL COMMENT '品牌描述',`status` INT(1) DEFAULT 0 COMMENT '状态:0-禁用,1-启用',PRIMARY KEY (`id`),UNIQUE KEY `idx_brand_name` (`brand_name`) COMMENT '品牌名称唯一'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='品牌表';-- 插入初始化数据
INSERT INTO `t_brand` (`brand_name`, `company_name`, `ordered`, `description`, `status`)
VALUES
('华为', '华为技术有限公司', 1, '全球领先的ICT基础设施和智能终端提供商', 1),
('小米', '小米科技有限责任公司', 2, '专注于高端智能手机、互联网电视及智能家居生态链建设', 1),
('苹果', '苹果公司', 3, '美国科技公司,以iPhone、iPad等产品闻名', 1),
('三星', '三星电子株式会社', 4, '韩国跨国企业,业务涵盖电子、金融等多个领域', 1),
('OPPO', 'OPPO广东移动通信有限公司', 5, '专注于智能终端产品、软件和互联网服务的科技公司', 0);
三、创建springboot项目
为什么选择springboot3呢?
因为截止到2025.7月, 在IDEA中创建SpringBoot项目的时候,start.spring.io只提供springboot3版本的模板,所以,springboot2的整合这里就不说明了,如果有需要,评论区留言,我单开一篇讲。
本篇文章使用的java版本是17。
3.1 pom依赖
下面只列出核心的配置,如果需要源码,请在文章最后访问gitee项目地址查看。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.8</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.cosseen</groupId><artifactId>springboot_mybatis</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_mybatis</name><description>springboot_mybatis</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>
3.2 目录结构
我这里的结构如下:
- controller: 存放rest接口的业务逻辑
- mapper: 存放数据库操作的接口
- pojo:存放广告的实体类
- service: 存放service服务,用于向rest提供业务实现
- resource/mapper: 用于存放mybatis的xml配置文件
- test: 存放单元测试用例
3.3 应用配置文件
springboot项目的主配置文件是application.yml,主要内容有:
- 数据库连接信息
- 启动时,扫描的mybatis配置文件路径,以及驼峰式命名转换
为什么要开启驼峰式命名转换呢?
细心的你,可能会发现,sql定义的表字段是brand_name, 但是pojo中定义的是brandName, 这两个不同。mybatis从数据库查询出数据后,在封装对象的时候,如何知道brand_name对应的就是brandName呢?通过这个驼峰命名转换,mybatis在给对象属性赋值时,自动就会找到对应的字段。
spring:application:name: springboot_mybatisdatasource:url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=falseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: mapper/*configuration:map-underscore-to-camel-case: true # 开启下划线转驼峰命名
四、代码其结构说明
4.1 BrandMapper.java文件
这是mybatis的接口类,用于封装对外提供的数据操作接口,比如查询,更新,新增,删除等。@Mapper注解用于标识,这是一个Mybatis的数据接口。
package com.cosseen.mapper;import com.cosseen.pojo.Brand;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface BrandMapper {// 查询所有品牌List<Brand> queryAllBrand();// 根据id查询品牌Brand queryById(int id);
}
4.2 BrandMapper.xml文件
存放mybatis数据接口的sql实现,把对应接口的sql语句配置到xml文件中。为什么这么做呢?
1. 解耦逻辑:把业务逻辑和SQL分开,业务负责传参和调用,SQL负责查询和返回数据,职责分明。
2. 便于维护:把所有SQL存放在mapper中,可以做到统一管理。假设把SQL写在java文件中,当业务复杂时,存在多个java文件,修改可能会漏掉。其次,当需要调整SQL时,只需要修改xml文件即可,避免修改代码引入新的问题。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cosseen.mapper.BrandMapper"><select id="queryAllBrand" resultType="com.cosseen.pojo.Brand">select * from t_brand;</select><select id="queryById" resultType="com.cosseen.pojo.Brand">select * from t_brand where id = #{id};</select></mapper>
4.3 BrandService.java文件
该文件用于定义Service层对外提供的业务服务,虽然这个文件和mybatis的接口类比较像,但两者并没有关系,queryAllBrand可以写成findAll, rest只要调用findAll能拿到数据即可。
package com.cosseen.service;import com.cosseen.pojo.Brand;import java.util.List;public interface BrandService {// 查询所有品牌List<Brand> queryAllBrand();// 根据id查询品牌Brand queryById(int id);
}
4.4 BrandServiceImpl.java文件
该文件是对BrandService接口的具体实现。 使用@Service注解,Springboot会自动创建该类的服务实例。
package com.cosseen.service.impl;import com.cosseen.mapper.BrandMapper;
import com.cosseen.pojo.Brand;
import com.cosseen.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BrandServiceImpl implements BrandService {@AutowiredBrandMapper brandMapper;@Overridepublic List<Brand> queryAllBrand() {return brandMapper.queryAllBrand();}@Overridepublic Brand queryById(int id) {return brandMapper.queryById(id);}
}
4.5 BrandController.java文件
该文件负责对外提供rest服务。@RestController是@Controller和@ResponseBody的合集。
package com.cosseen.controller;import com.cosseen.pojo.Brand;
import com.cosseen.service.BrandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class BrandController {@AutowiredBrandService brandService;@GetMapping("/allBrand")public String queryAllBrand(){// 调用service层来查询所有书籍数据List<Brand> brands = brandService.queryAllBrand();// 为了演示,简单的将其返回字符串return brands.toString();}@GetMapping("/brand/{id}")public String queryBrandById(@PathVariable("id") int id){Brand brand = brandService.queryById(id);return brand.toString();}
}
五、测试运行
5.1 启动 SpringbootMybatisApplication项目
5.2 浏览器请求接口
六、代码地址
https://gitee.com/drx000/springboot3-mybatis.git