MyBatis凭什么征服SpringBoot ?

news2024/12/25 9:29:55

1、MyBatis的优势

众所周知,MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。通过xml映射到接口,使开发者使用接口的方式就能够轻松的映射、解析、执行xml中的SQL。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。这样做的目的在于降低代码耦合度,大大简化了数据库操作中的常用操作,修改SQL更加容易,代码也更清晰易维护。

简单了解下MyBatis的优点,以便了解为什么会将其集成到Spring中:

1) 灵活性高

MyBatis允许直接编写原生的SQL语句,提供了很高的灵活性。我们可以根据需要编写任何复杂的SQL,从而满足各种业务需求。

2)易于使用

MyBatis通过XML配置文件和注解,让你可以轻松将SQL语句与Java代码分离,使得代码结构更清晰、易维护。

3)映射简单

MyBatis提供了简单的映射方式,可以将数据库表中的字段自动映射到Java对象的属性上,降低了数据转换的复杂性。

4)扩展性良好

MyBatis提供了丰富的插件接口,你可以通过编写自定义插件来扩展MyBatis的功能,以满足特定需求。(这部分内容在MyBatis课程部分会讲解)

5)易于集成

MyBatis可以与Spring、Spring Boot等流行框架无缝集成,提供更加完整的解决方案。

6)社区活跃

MyBatis有一个活跃的开发者社区,为使用者提供了丰富的文档、教程和支持。这有助于在遇到问题时快速找到解决方案。

2、SpringBoot对MyBatis的支持

官网地址:https://mybatis.org/mybatis-3/

官方参照表:http://mybatis.org/spring/

中文官网:https://mybatis.org/mybatis-3/zh/

mybatis项目源码地址:https://github.com/mybatis/mybatis-3/

我们知道,在官方文档中明确说明,Spring 2.0 只支持 iBatis 2.0。那么,我们就想将 MyBatis3 的支持添加到 Spring 3.0 中。不幸的是,Spring 3.0 的开发在 MyBatis 3.0 官方发布前就结束了。由于 Spring 开发团队不想发布一个基于未发布版的 MyBatis 的整合支持,如果要获得 Spring 官方的支持,只能等待下一次的发布了。基于在 Spring 中对 MyBatis 提供支持的兴趣,MyBatis 社区认为,应该开始召集有兴趣参与其中的贡献者们,将对 Spring 的集成作为 MyBatis 的一个社区子项目。于是,MyBatis自己动手搞了一个Spring的扩展实现,精神可敬。另外这也得益于Spring非常优秀的扩展能力。基于这样两方面的因素,从而加快了MyBatis与Spring集成的速度。

Spring和MyBatis版本对应关系

在实际开发中,单独引入Mybatis包时,大家可以参照这个表即可。

3、SpringBoot集成MyBatis实战

说明:本次实战依然是基于前面的SpringBootCase工程之上进行集成MyBatis。

3.1 案例思路

通过SpringBoot +MyBatis实现对供应链中商品表的查询操作。

3.2 实现步骤

步骤1:准备数据库

这里讲的是windows环境(linux环境类似)。首先启动本地mysql数据库,启动好后通过mysql客户端工具(Navicat等)连接本地Mysql,并创建新的数据库xintu,指定数据库字符编码为utf-8。

新建商品表并向表中插入数据。

1) 新建表

DROP TABLE IF EXISTS `t_product`;
CREATE TABLE `t_product` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` int(10) DEFAULT NULL COMMENT '类目ID',
  `item_type` varchar(50) DEFAULT NULL COMMENT '商品类型',
  `title` varchar(500) DEFAULT NULL COMMENT '商品标题',
  `sell_point` varchar(50) DEFAULT NULL COMMENT '销售站点',
  `price` varchar(50) DEFAULT NULL COMMENT '销售价格',
  `num` int(11) DEFAULT NULL COMMENT '库存数量',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `status` int(11) DEFAULT NULL COMMENT '商品状态'
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2)插入数据

INSERT INTO `t_product` VALUES ('1', '23', '12', 'Redmi K50Pro 天玑9000 AMOLED 2K柔性直屏 OIS光学防抖  120W快充 幻镜  8GB+256GB 5G智能手机 小米红米', '仅上海,广州,沈阳仓有货!预购从速', '1469.00', '10', '../images/portal/02COMIXC5902A5122blue/miaosha_1.jpg', '1', '1', null, null, null, null);
INSERT INTO `t_product` VALUES ('2', '23', '12', 'Redmi K50Pro 天玑9000 AMOLED 2K柔性直屏 OIS光学防抖  120W快充 幻镜  8GB+256GB 5G智能手机 小米红米', '仅上海,广州,沈阳仓有货!预购从速', '2619.00', '10', '../images/portal/02COMIXC5902A5122blue/miaosha_2.jpg', '1', '2', null, null, null, null);
I

步骤2:SpringBoot集成MyBatis插件

在pom.xml中添加相关jar依赖。

<!--引入mybatis jar-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.1.4</version>
</dependency>
<!--引入mysql jar-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.25</version>
</dependency>

步骤3:application.yml中配置数据源

spring:
  datasource: # mysql相关配置
    url: jdbc:mysql://localhost:3306/xintu?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: xxx

步骤4:反向工程配置

引入反向工程mybatis maven插件。由于在生成Java POJO时,需要连接数据库,所以也需要引入mysql驱动包。

<!--==========mybatis代码生成插件配置==========-->
<plugin>
	<!--插件坐标-->
	<groupId>org.mybatis.generator</groupId>
	<artifactId>mybatis-generator-maven-plugin</artifactId>
	<version>1.3.5</version>
	<!--插件依赖数据库驱动-->
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.25</version>
		</dependency>
	</dependencies>
	<!--插件配置-->
	<configuration>
		<!--指定配置文件位置-->
		<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
		<verbose>true</verbose>
		<overwrite>true</overwrite>
	</configuration>
</plugin>

引入反向工程配置文件generatorConfig.xml,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 :false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--==================数据库连接的信息:驱动类、连接地址、用户名、密码 =====================-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/xintu" userId="root"
                        password="xxx">
        </jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- ================targetProject:生成PO类的位置 ================-->
        <javaModelGenerator targetPackage="com.xintu.demo.entity"
                            targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!--================= targetProject:mapper映射文件生成的位置=============== -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject=".\src\main\resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- ==================targetPackage:mapper接口生成的位置 ==================-->
        <javaClientGenerator type="XMLMAPPER"
                             targetPackage="com.xintu.demo.mapper"
                             targetProject=".\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!--=============== 指定数据库表 ==================-->
        <table schema="xintu" tableName="t_product"></table>
    </context>
</generatorConfiguration>

步骤5:反向代码生成

使用Mybatis反向工程生成接口、映射文件以及实体Bean。

 步骤6:创建 TProductService并编写代码

package com.xintu.demo.service;

import com.xintu.demo.entity.TProduct;
import com.xintu.demo.entity.TProductExample;
import com.xintu.demo.mapper.TProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author XinTu
 * @classname TProductService
 * @description TODO
 * @date 2023年04月29日 21:19
 */
@Service
public class TProductService {
    @Autowired
    private TProductMapper mapper;

    /**
     * 查询测试
     * @return
     */
    public List<TProduct> queryList(){
        TProductExample example = new TProductExample();
        TProductExample.Criteria criteria = example.createCriteria();
        criteria.andCategoryIdEqualTo(1);
        return mapper.selectByExample(example);
    }
}

步骤7:创建 TProductController 并编写代码

package com.xintu.demo.controller;

import com.xintu.demo.entity.TProduct;
import com.xintu.demo.mapper.TProductMapper;
import com.xintu.demo.service.TProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author XinTu
 * @classname TProductController
 * @description TODO
 * @date 2023年04月29日 21:12
 */


@RestController
public class TProductController {

    @Autowired
    private TProductService service;

    /**
     * 查询测试
     * @return
     */
    @GetMapping(value = "/queryList")
    public List<TProduct> queryList() {
        return service.queryList();
    }

}

在 MyBatis 反向工程生成的 TProductMapper 后,有两种注入方式:

① 接口上加一个Mapper注解

② SpringbootApplication 启动类加@MapperScan("com.xintu.demo.mapper")注解

* 以上两个的作用:MyBatis自动扫描数据持久层的映射文件及DAO接口的关系

package com.xintu.demo.mapper;

import com.xintu.demo.entity.TProduct;
import com.xintu.demo.entity.TProductExample;
import java.util.List;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

@Mapper //方式一:添加@Mapper注解,等同于主类上加@MapperScan("com.bjpowernode.springboot.mapper")
public interface TProductMapper {
    long countByExample(TProductExample example);

    int deleteByExample(TProductExample example);

    int deleteByPrimaryKey(Integer id);

    int insert(TProduct record);

    int insertSelective(TProduct record);

    List<TProduct> selectByExample(TProductExample example);

    TProduct selectByPrimaryKey(Integer id);

    int updateByExampleSelective(@Param("record") TProduct record, @Param("example") TProductExample example);

    int updateByExample(@Param("record") TProduct record, @Param("example") TProductExample example);

    int updateByPrimaryKeySelective(TProduct record);

    int updateByPrimaryKey(TProduct record);
}

步骤8:指定mybatis xml路径

#在application.yml配置文件中指定映射文件的位置,这个配置只有接口和映射文件不在同一个包的情况下,才需要指定
mybatis:
  mapper-locations: classpath:mapper/*.xml

步骤9:测试验证

以上这部分作为入门级内容,  主要分析了MyBatis的特点以及与SpringBoot集成实战过程。我们发现MyBatis征服SpringBoot(或者说Spring)主要靠3点:

1)MyBatis作为持久层本身的诸多优势(低耦合、易读易维护等)

2)MyBatis社区不遗余力的推进

3)SpringBoot自身强大的扩展能力

以上三点,共同铸就了MyBatis与SpringBoot的完美集成。那关于的MyBatis更多细节部分,比如实现原理,自定义扩展,将会在后面的MyBatis专栏部分进行逐一讲解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477284.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No.052<软考>《(高项)备考大全》【冲刺6】《软考之 119个工具 (4)》

《软考之 119个工具 &#xff08;4&#xff09;》 61.人际交往:62.组织理论:63.预分派:64.谈判:65.招募:66.虚拟团队:67.多标准决策分析:68.人际关系技能:69.培训:70.团队建设活动:71.基本规则:72.集中办公:73.认可与奖励:74.人事评测工具:75.观察和交谈:76.项目绩效评估:77.冲…

Linux学习[8]查找文件指令:which whereis locate find

文章目录 前言1. which2. whereis3. locate4. find总结&#xff1a; 前言 之前在弄交叉编译的时候需要找到gcc&#xff0c;gdb什么的在哪里&#xff1b;涉及到了查找文件指令。 这里对linux中的查找指令进行总结 1. which which指令一般用来寻找可执行文件的路径&#xff0c;…

OpenCV实战(20)——图像投影关系

OpenCV实战&#xff08;20&#xff09;——图像投影关系 0. 前言1. 相机成像原理2. 图像对的基本矩阵3. 完整代码小结系列链接 0. 前言 数码相机通过将光线通过镜头投射到图像传感器上来捕捉场景产生图像。由于通过将 3D 场景投影到 2D 平面上形成图像&#xff0c;因此场景与其…

时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测

时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现BO-CNN-GRU贝叶斯优化卷积门控循环单元时间序列预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于贝叶斯(bayes)优化卷积神经网络-门控循环单元(CNN-GR…

2023年人工智能GPT-4时代,最新13个ChatGPT商业市场AIGC应用正在掀起革命性变革!

目录 前言ChatGPT商业应用——LLM是星辰大海1. 研究背景1.1 研究背景1.2 研究方法 2. 商业应用和案例分析2.1 工具层ChatGPT搜索ChatGPT办公ChatGPT教育 2.2 行业层ChatGPT游戏ChatGPT音乐ChatGPT零售电商ChatGPT广告营销ChatGPT媒体新闻ChatGPT金融ChatGPT医疗ChatGPT设计Chat…

AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、ViT/Swin transformer

前言 2018年我写过一篇博客&#xff0c;叫&#xff1a;《一文读懂目标检测&#xff1a;R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD》&#xff0c;该文相当于梳理了2019年之前CV领域的典型视觉模型&#xff0c;比如 2014 R-CNN2015 Fast R-CNN、Faster R-CNN2016 YOLO、SSD2…

Linux命令集(Linux网络连接管理命令--ifconfig指令篇)

Linux命令集&#xff08;Linux网络连接管理命令--ifconfig指令篇&#xff09; Linux网络连接管理命令集&#xff08;ifconfig指令篇&#xff09;1. ifconfig(interface configuration)1. 信息显示2. 接口配置 Linux网络连接管理命令集&#xff08;ifconfig指令篇&#xff09; 如…

C++Primer第五版【阅读笔记】

CPrimer第五版 阅读笔记 第1章开始1.1 编写一个简单的C程序1.1.1 编译、运行程序 1.2 初识输入输出1.3 注释简介1.4 控制流1.4.1 while语句1.4.2 for语句1.4.3 读取数量不定的输入数据1.4.4 if语句 1.5 类简介1.5.1 Sales_item 类1.5.2 初识成员函数 1.6 书店程序第一章小结 第…

【Linux入门】linux指令(1)

【Linux入门】linux指令&#xff08;1&#xff09; 目录 【Linux入门】linux指令&#xff08;1&#xff09;操作系统登录服务器Linux下的基本指令ls指令pwd指令Linux路径分割符 /cd指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令&&rm指令&#xff08;重…

4.30下周美联储携非农来袭黄金多空该如何布局?

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(4月28日)当周金价维持震荡交投&#xff0c;金价基本持稳于2000美元下方。支撑和打压金价的因素参半。经济衰退的担忧&#xff0c;以及避险情绪支持金价&#x…

Fabric.js 讲解官方demo:Stickman

theme: smartblue 本文简介 戴尬猴&#xff0c;我是德育处主任 Fabric.js 官网有很多有趣的Demo&#xff0c;不仅可以帮助我们了解其功能&#xff0c;还可以为我们提供创意灵感。其中&#xff0c;Stickman是一个非常有趣的例子。 先看看效果图 从上图可以看出&#xff0c;在拖拽…

【SpringBoot2】二:基础入门---自动配置原理(SpringBoot特点+容器功能)

文章目录 1.SpringBoot特点1.1 依赖管理1.2 自动配置 2.容器功能2.1 组件添加2.1.1Configuration2.1.2 Bean、Component、Controller、Service、Repository2.1.3 ComponentScan、Import2.1.4 Conditional 2.2 原生配置引入ImportResource2.3 配置绑定2.3.1 Component Configur…

如何保障网络安全

网络安全是一个涵盖范围广、深入浅出的话题。随着互联网在现代社会中扮演的重要角色日益突出&#xff0c;网络安全问题成为各个领域所关注的焦点。在此&#xff0c;我们将从以下几个方面来阐述网络安全的重要性&#xff0c;并讨论几种保障网络安全的方式。 一、网络安全的重要性…

K8s(1.20.15版本)部署(3master+2node)

1.准备工作 准备五台centos 7的虚拟机&#xff08;每台虚拟机分配2核2G&#xff0c;存储使用20G硬盘&#xff0c;必须2核不然报错&#xff09;&#xff1a;如下图机器的分配情况&#xff1a; IP节点名称节点类型10.10.10.11k8s-master11master10.10.10.12k8s-master12master1…

解决centos8下域名raw.githubusercontent.com解析错误

在win10环境下执行命令 D:\test>ping raw.githubusercontent.com Ping 请求找不到主机 raw.githubusercontent.com。请检查该名称&#xff0c;然后重试。 解决很简单&#xff0c;把ipv6的DNS服务器设为240c::6666就行了&#xff0c;改完后执行命令 D:\test>ping raw.g…

C语言函数大全-- s 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- s 开头的函数&#xff08;2&#xff09; 1. setlinestyle 1.1 函数说明 函数声明函数功能void setlinestyle( int linestyle, unsigned upattern, int thickness );设置当前绘图窗口的线条样式、线型模式和线条宽度 参数&#xff1a…

SQL中去除重复数据的几种方法,我一次性都告你​

使用SQL对数据进行提取和分析时&#xff0c;我们经常会遇到数据重复的场景&#xff0c;需要我们对数据进行去重后分析。 以某电商公司的销售报表为例&#xff0c;常见的去重方法我们用到distinct 或者group by 语句&#xff0c; 今天介绍一种新的方法&#xff0c;利用窗口函数…

不得不说的行为型模式-命令模式

目录 命令模式&#xff1a; 代码实例&#xff1a; 下面是面试中可能遇到的问题&#xff1a; 命令模式&#xff1a; 命令模式(Command Pattern)是一种行为型设计模式&#xff0c;它允许将请求封装成对象&#xff0c;从而让你能够用不同的请求对客户端进行参数化&#xff0c;对…

Guitar Pro8苹果mac最新版本下载安装教程

Guitar Pro是一款专业的吉他制谱软件&#xff0c;现在已更新至Guitar Pro8&#xff0c;新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。下面我们来看Guitar Pro8 Mac如何安装。 guitar pro是一款专业的吉他学习软件&…

Linux内核(十四)Input 子系统详解 I —— 子系统介绍以及相关结构体解析

文章目录 概述input 子系统框架input 子系统相关结构体介绍input_dev结构体input_handler结构体input_handle结构体Evdev事件相关结构体input_event结构体&#xff08;标准按键编码信息&#xff09;设备相关信息结构体 概述 input子系统就是管理输入的子系统&#xff0c;和Lin…