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

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.dtcms.com/a/297934.html

相关文章:

  • 分布式方案 一 分布式锁的四大实现方式
  • android app适配Android 15可以在Android studio自带的模拟器上进行吗,还是说必须在真机上进行
  • HashMap底层实现原理与核心设计解析
  • AI同传领域,字节跳动与科大讯飞激战进行时
  • 【Linux系统】基础IO(下)
  • 深度学习篇---图像数据采集
  • classgraph:Java轻量级类和包扫描器
  • 深度学习篇---深度学习中的卡尔曼滤波
  • Vmware VSAN主机停机维护流程
  • RAG、Function Call、MCP技术笔记
  • Java中给List<String>去重的4种方式
  • 数据结构:对角矩阵(Diagonal Matrix)
  • Android UI 组件系列(八):ListView 基础用法与适配器详解
  • python语法笔记
  • 《剑指offer》-数据结构篇-链表
  • GDB调试命令学习
  • spring boot项目使用Spring Security加密
  • k8s开启审计日志
  • 【SSL证书校验问题】通过 monkey-patch 关掉 SSL 证书校验
  • Fluent遇上AI:深度学习重塑计算流体动力学的未来
  • 【记录】C++生产者 / 消费者 案例
  • 刷题日记0725
  • 篇五 网络通信硬件之PHY,MAC, RJ45
  • PytorchLightning最佳实践基础篇
  • 谷歌母公司Alphabet发布超预期业绩,提高全年资本支出至850亿美元
  • 从 Elastic 到 ClickHouse:日志系统性能与成本优化之路
  • 【大模型实战】提示工程(Prompt Engineering)
  • 优秀案例:基于python django的智能家居销售数据采集和分析系统设计与实现,使用混合推荐算法和LSTM算法情感分析
  • 九联UNT413AS_晶晨S905L3S芯片_2+8G_安卓9.0_线刷固件包
  • 短剧小程序系统开发:构建影视娱乐生态新格局