6.1 MyBatis基础

news2025/1/18 21:12:48

1.MyBatis概述

MyBatis本是apache的一个开源项目iBatis,2010年这个项目由apache software foundation迁移到了google code,并且改名为MyBatis,2013年11月MyBatis又被迁移到Github。

MyBatis是一个支持普通SQL查询、存储过程以及高级映射的持久层框架,它消除了几乎所有的JDBC代码和参数的手动设置以及对结果集的检索,使用简单的XML或注解进行配置和原始映射,将接口和Java的POJOs(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

2.MyBatis工作原理

MyBatis框架是一个ORM(Object/Relation Mapping,即对象关系映射)框架。所谓的ORM就是一种为了解决面向对象与关系型数据库中数据类型不匹配的技术,它通过描述Java对象与数据库表之间的映射关系,自动将Java应用程序中的对象持久化到关系型数据库的表中。

使用ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,ORM框架会通过映射关系将这些面向对象的操作转换成底层的SQL操作,ORM框架的工作原理如下图所示。

3.MyBatis与JDBC对比

JDBC

MyBatis

SQL与代码耦合度高
代码冗长、开发效率低

SQL与代码耦合度高
代码冗长、开发效率低

4.常用配置元素

MyBatis映射文件中的常用元素有<mapper>、<insert>、<delete>、<update>、<select>、<resultMap>、<sql>等。

属性

说明

<mapper>

映射文件的根元素,该元素只有一个namespace属性(命名空间)。

<select>

用于映射查询语句。

<insert>

用于映射插入语句。

<delete>

用于映射删除语句。

<update>

用于映射更新语句。

<resultMap>

描述数据库结果集和对象的对应关系。

<sql>

可以重用的SQL块,也可以被其他语句使用。

<select>元素

<select>元素用来映射查询语句,它可以从数据库中查询数据并返回。使用<select>元素执行查询操作示例代码如下:

<!--查询单个学生信息-->
<select id="queryStudent" parameterType="java.lang.String" resultType="com.wfit.boot.model.Student">
    select *
    from t_student
    where id = #{id}
</select>
  • id,表示命名空间中<select>元素的唯一标识,通过该标识可以调用这条查询语句。

  • parameterType ,它是一个可选属性,用于指定SQL语句所需参数类的全限定名或者别名,其默认值是unset。

  • resultType,用于指定执行这条SQL语句返回的全限定类名或别名。

<insert>元素

<insert>元素用于映射插入语句,在执行完<insert>元素中定义的SQL语句后,会返回插入记录的数量。使用< insert >元素执行插入操作示例代码如下:

<!--新增学生信息-->
<insert id="saveStudent" parameterType="com.wfit.boot.model.Student">
insert into t_student values(
            #{id},
            #{name},
            #{age},
            #{sex},
            #{birthday},
            #{idCard},
            #{phone}
    )
</insert>

<update>元素

<update>元素用于映射更新语句,它可以更新数据库中的数据。在执行完元素中定义的SQL语句后,会返回更新的记录数量。使用<update>元素执行更新操作示例代码如下:

<!--修改学生信息-->
<update id="updateStudent" parameterType="com.wfit.boot.model.Student">
    update t_student
    set name = #{name},age = #{age}
    where id = #{id}
</update>

<delete>元素

<delete>元素用于映射删除语句,在执行完<delete>元素中的SQL语句之后,会返回删除的记录数量。使用<delete>元素执行删除操作示例代码如下所示:

<!--删除学生信息-->
<delete id="delStudent" parameterType="java.lang.String">
    delete from t_student where id = #{id}
</delete>

5.动态SQL

在实际项目的开发中,开发人员在使用JDBC或其他持久层框架进行开发时,经常需要根据不同的条件拼接SQL语句,拼接SQL语句时还要确保不能遗漏必要的空格、标点符号等,这种编程方式给开发人员带来了非常大的不便,而MyBatis提供的SQL语句动态组装功能,恰能很好地解决这一问题。

动态SQL常用元素<if>、<choose>(<when>、<otherwise>)、<where>、<trim>、<set>、<foreach>等。

属性

说明

<if>

判断语句,用于单条件判断

<choose>(<when>、<otherwise>)

相当于Java中的switch...case...default语句,用于多条件判断

<where>

简化SQL语句中where的条件判断

<trim>

可以灵活地去除多余的关键字

<set>

用于SQL语句的动态更新

<foreach>

循环语句,常用于in语句等列举条件中

<if>元素

在MyBatis中,<if>元素是最常用的判断元素,它类似于Java中的if语句,主要用于实现某些简单的条件判断。

<!--查询学生列表-->
<select id="queryStudent" resultType="Student" parameterType="java.util.Map">
    select *
    from t_student
    where 1 = 1
    <if test='name != null and name != ""'>
        and name like CONCAT('%',#{name},'%')
    </if>
    <if test='idCard != null and idCard != ""'>
        and idcard like CONCAT('%',#{idCard},'%')
    </if>
</select>

<set>元素

<set>元素主要用于更新操作,它可以在动态SQL语句前输出一个set关键字,并将SQL语句中最后一个多余的逗号去除。<set>元素与<if>元素结合可以只更新需要更新的字段。

<!-- 修改学生信息 -->
<update id="updateStudent" parameterType="java.util.Map">
    update t_student
    <set>
        <if test='name != null and name != ""'>
            name = #{name},
        </if>
        <if test='idCard != null and idCard != ""'>
            idcard = #{idCard},
        </if>
    </set>
    where id = #{id}
</update>

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

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

相关文章

欧拉算法与埃氏筛法比较

#include<iostream> using namespace std; bool data[100000005]; // zhishu用于存储质数的数组 &#xff0c;cnt下标 int zhishu[100000000],cnt0;int main() {data[1] 1;// 1表示素数 int n;cin >> n;// 循环遍历for(int i2;i<n;i){if(data[i] 0){// 表明是…

嵌入式学习之C语言指针部分复习

今天主要把C语言的指针部分再次认真的复习了一下&#xff0c;对于指针的整体框架有了更加深刻的理解&#xff0c;特别要重点区分函数指针&#xff0c;指针函数&#xff0c;数组指针&#xff0c;指针数组部分&#xff0c;对于这部分的应用回非常的重要&#xff0c;而且C语言指针…

海龟绘图——长方体(包含建立和销毁的过程)

运行结果&#xff1a; 代码&#xff1a; import turtle turtle.setup(1024,1024,200,200)# 移动画笔 turtle.penup() turtle.goto(-200,200) turtle.pendown() # 绘制第一条实线 turtle.setheading(0) turtle.forward(300) # 绘制第二条实线 turtle.setheading(18045) turtle.…

Python语法基础--条件选择

学习目标 使用比较运算符编写布尔表达式。使用random.randint(a,b)或者random.random()函数来生成随机数。编写布尔表达式(AdditionQuiz)。使用单向if语句实现选择控制。使用单向if语句编程。使用双向if-else语句实现选择控制。使用嵌套if和多向if-elif-else语句实现选择控制。…

winform使用IrisSkin4.dll换肤后排除控件

设置控件的tag属性为9999 参考&#xff1a; https://www.cnblogs.com/mq0036/p/6654219.html

YOLOV5改进:加入RCS-OSA模块,提升检测速度

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:RCS-OSA模块更加轻量化,有效提升检…

一场大火烧毁了印度的芯片梦 | 百能云芯

谈起印度的半导体发展史&#xff0c;鲜为人知的是&#xff0c;该国曾有可能成为全球半导体制造业的重要中心。然而&#xff0c;一个意外的事件彻底改变了历史进程&#xff0c;让印度错失了超越台积电的机会。 01半导体制造潜力 在高科技行业&#xff0c;也许很多人都不看好印度…

UE5.2程序发布及运行问题记录

发布后的程序默认是以全屏模式启动运行的&#xff0c;通过添加以下命令行参数&#xff0c;可实现程序的窗口模式运行&#xff1a; -ResX1280 -ResY720 -WINDOWED 发布后的程序&#xff0c;启动时&#xff0c;提示显卡驱动警告&#xff08;如图1所示&#xff09;&#xff0c;但是…

Java-Sec-Code靶场

文章目录 前言1.靶场搭建靶场地址、环境Window环境修改点 靶场通关和源码分析命令注入RCE反序列化fastjson反序列化目录穿越文件上传Spel表达式sql注入poi-ooxml组件XXE 总结 前言 一直都是一个Java盲&#xff0c;但是如今Java却占据了开发的半壁江山&#xff0c;平时遇见的多…

情感分析工具: TextBlob 与 VADER 的对比

一、说明 在本文我们将看到&#xff0c;在情感分析方面&#xff0c;我们更喜欢哪个库。这取决于很多情况。例如。数据采集。在我们进行分析之前&#xff0c;让我们先看看这两个库是关于什么的。 二、亮相工具库 2.1. 工具库TextBlob介绍&#xff1a; 图像。TextBlob: Simplif…

对自定义表格数据设计自定义查询/汇总

目录 1 前言 2 生成数据 3 设计一个汇总 4 试一下效果 5 导出为excel文件的源代码 6 后记 1 前言 对自定义表格中录入或者导入的数据&#xff0c;必须能定义查询和汇总&#xff0c;否则程序基本没什么用。就是说&#xff0c;程序应该具备对任意表格进行方便的查询汇总公式…

VS Code终端系统启动失败的问题

一百度真的是各种各样打不开&#xff0c;有的配置一下就可以了&#xff0c;有的改成管理员权限就可以了&#xff0c;我的是怎么设置都不行&#xff0c;安装了最新版本的不行&#xff0c;又退了几个版本才行了&#xff0c;1.56版本内网行&#xff0c;1.55版本能行&#xff0c;比…

企业权限管理(十五)-方法级别权限控制

方法级别权限控制 jsr-250 3.Secured注解使用 开启表达式的使用 页面控制 显示xxx在线 <div class"pull-left info"><p><security:authentication property"principal.username"></security:authentication></p><a h…

Blazor:子组件deep:: 样式修改无效

文章目录 资料无效代码有效代码 资料 Blazor Css隔离 简单来说&#xff0c;就是外层要加个div&#xff0c;不加div就无法识别。 无效代码 <Layout ShowFooter"true" class"Layout" SideWidth"100px"><Header><div class"t…

C语言刷题训练DAY.3

1.ASCII码 解题思路&#xff1a; 这里直接以字符的形式打印就行&#xff1a; 解题代码&#xff1a; #include<stdio.h> int main() {printf("%c%c%c%c%c%c%c%c%c%c%c%c", 73, 32, 99, 97, 110, 32, 100, 111, 32, 105, 116, 33);return 0; } 2.出生日期输…

09 - 连续的多个commit整理成1个

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 将连续的多个commit整理成1个 将连续的多个commit整理成1个 将anranxiaohunzhang和xianglongshibazhang合并起来&#xff08;将anranxiaohunzhang合并到降龙十八掌上&#xff0c;生成新…

概要设计完整版word文档,《某信息管理平台总体设计方案》,505页20万字供参考,附下载

上一篇介绍了软件生命周期全过程&#xff0c;软件工程全周期全过程20项文档模板&#xff0c;附下载。从《合同》到《需求规格说明书》到软件设计、开发、实施、验收、维护等全过程相关文档模板。有朋友反馈附件内容没有补全&#xff0c;本次及后续会用实际案例补全附件内容&…

竞赛项目 疲劳驾驶检测系统 python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…

5_docker-compose多服务统一编排管理

系列文章目录 第1章 Linux安装Docker 第2章 Docker安装jdk1.8和MySql 第3章 Docker安装redis 第4章 Jar包部署Docker 第5章 Docker-compose多服务统一编排管理 第6章 AccessKeyId和AccessKeySecret的环境变量配置 文章目录 系列文章目录前言 一、编写docker-compose.yml二、上…