当前位置: 首页 > backend >正文

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,主要内容有:

  1. 数据库连接信息
  2. 启动时,扫描的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

http://www.xdnf.cn/news/16253.html

相关文章:

  • 【图像理解进阶】如何对图像中的小区域进行细粒度的语义分割?
  • WAIC2025预告|英码深元AI一体机将亮相华为昇腾展区,以灵活部署的能力赋能行业智能化转型
  • Nginx简单介绍
  • Java-Properties类和properties文件详解
  • 图论:最小生成树
  • classgraph:Java轻量级类和包扫描器
  • linux C — udp,tcp通信
  • 【Chrome】下载chromedriver的地址
  • 深入解析浏览器存储方案:Cookie、localStorage和sessionStorage特性与应用
  • GPU 服务器ecc报错处理
  • Java排序算法之<冒泡排序>
  • 单片机(STM32-ADC模数转换器)
  • 优思学院|QC七大手法之一的检查表应如何有效使用?
  • CSS 盒子模型学习版的理解
  • 数据结构 二叉树(1)
  • yarn在macOS上的安装与镜像源配置:全方位指南
  • 从 SQL Server 到 KingbaseES V9R4C12,一次“无痛”迁移与深度兼容体验实录
  • Orbbec开发---数据流与数据流操作
  • ZLMediaKit 源代码入门
  • Spring 策略模式实现
  • 【DeepRare】疾病识别召回率100%
  • SpringBoot学习路径二--Spring Boot自动配置原理深度解析
  • 教培机构如何开发自己的证件照拍照采集小程序
  • 萤石云替代产品摄像头方案萤石云不支持TCP本地连接-东方仙盟
  • 深入解析Hadoop MapReduce中Reduce阶段排序的必要性
  • 《Uniapp-Vue 3-TS 实战开发》自定义环形进度条组件
  • 人工智能冗余:大语言模型为何有时表现不佳(以及我们能做些什么)
  • 【js】ES2025新语法糖
  • 缓存HDC内容用于后续Direct2D绘制.
  • C#(基本语法)