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项目地址查看。
org.springframework.boot spring-boot-starter-parent 3.4.8 com.cosseen springboot_mybatis 0.0.1-SNAPSHOT springboot_mybatis springboot_mybatis 17 org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 3.0.4 com.mysql mysql-connector-j runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-test
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_mybatis datasource: url: jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false username: root password: 123456 driver-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;@Mapperpublic interface BrandMapper { // 查询所有品牌 List 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文件即可,避免修改代码引入新的问题。
select * from t_brand; select * from t_brand where id = #{id};
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 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;@Servicepublic class BrandServiceImpl implements BrandService { @Autowired BrandMapper brandMapper; @Override public List queryAllBrand() { return brandMapper.queryAllBrand(); } @Override public 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;@RestControllerpublic class BrandController { @Autowired BrandService brandService; @GetMapping(\"/allBrand\") public String queryAllBrand(){ // 调用service层来查询所有书籍数据 List 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