MyBatis查询 ▎修改 ▎删除

news2024/11/15 8:43:45

前言:

在现代应用开发中,数据库操作是核心环节。MyBatis 作为一款灵活的持久层框架,提供了直接编写 SQL 语句的能力,避免了其他 ORM 框架可能带来的性能和功能限制。MyBatis 的查询、修改和删除操作是开发者必须掌握的基本技能。这些操作不仅影响数据的获取、更新和删除,还直接关系到应用的性能与安全性。接下来,我们将简要介绍 MyBatis 中如何高效执行这三种操作,并通过代码示例展示最佳实践

MyBatis搭建与配置

  1. 创建一个maven对象
  2. 导入MyBatis.jar包
  3. 创建一个全局的MyBatis配置文件
  4. 创建数据库
  5. 定义Dao接口,定义方法
  6. 创建sql映射文件,编写sql
  7. 测试MyBatis

MyBatis搭建与配置icon-default.png?t=N7T8https://blog.csdn.net/Dreamkidya/article/details/141524923?spm=1001.2014.3001.5501

Sql配置代码解读

<insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
    insert into admin (account,password,gender) values (#{account},#{password},#{gender})
</insert>

 <select id="findAdminById" parameterType="int" resultType="Admin">
      select * from admin where id = #{id}
 </select>

id —>唯一标识(接口中方法名)

parameterType=“参数类型"


useGeneratedKeys ="true" 返回自增主键

keyProperty="id" 定义接收属性

keyColumn="id" 定义主键列

以上三个设置,数据库添加数据等,会向后端返回该数据行的主键值


resultType="返回结果集类型"

 参数传递

单参数传递

Admin selectAdmins(int id);

多参数传递

多个参数使用@Param(“id”)绑定

    //多个参数的传递
    Admin login(@Param("acc") String account, @Param("pass") String password);

复杂参数传递

 如果传入一个复杂的对象,就需要使用 parameterType 参数进行类型定义,例如: void insertAdmin(Admin admin)

Admin login1(Admin admin);

单表增删改查

    <!-- 修改-->
    <update id="updateAdmin" parameterType="admin">
        update admin set account = #{account},password = #{password},gender = #{gender} where id = #{id}
    </update>
    <!-- 添加-->
    <insert id="insertAdmin" parameterType="admin" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into admin (account,password,gender) values (#{account},#{password},#{gender})
    </insert>
    <!-- 查询-->
    <select id="findAdminById" parameterType="int" resultType="Admin">
      select * from admin where id = #{id}
    </select>
    <!-- 删除-->
    <delete id="deleteAdmin" parameterType="int">
        delete from admin where id = #{id}
    </delete>

#{}和${}的区别

#{}   占位符,采用预编译的方式向sql中传值,可以防止sql注入,如果我们往SQL传值,使用#{}

${}    是将内容直接拼接到sql语句中,一般不用与向sql中传值,一般用于向SQL中动态的传递列名

区别:

  1. 底层实现不同 
    1. #{} 采用预编译方式,防止sql注入更加的安全
    2. ${} 采用字符串拼接,直接将值拼接在sql中
  2. 使用场景不同
    1. #{}  一般用于向sql中的列传值
    2. ${}  一般用于向sql中动态的传递列明  例如:排序时 order by 后面的列名是可以改变的.select后面的列名也可以自由选择

resultMap

定义 resutlMap

    <resultMap id="majorMap" type="major">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
    </resultMap>

  1.  resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为 “majorMap”
  2.  resutlMap 的 type 属性是映射的 POJO 类型
  3.  id 标签映射主键,result 标签映射非主键
  4. property 设置对象属性名称,column 映射查询结果的列名称

驼峰命名与下划线映射关系

为什么要解决驼峰命名与下划线映射关系?

      因为数据库中命名一般为Student_Id  Java中命名一般为StudentId所以为了我们方便操作,我们通过设置来解决问题

解决:在mybatis配置文件中设置如下代码

    <!--   MyBatis配置文件-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/> <!-- 打印日志 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>  <!-- 解决驼峰问题 -->
    </settings>

多表操作

association 关联数据表 

关联查询

方法一:在数据库中一次查出所有数据

    <!--对关联查询到的学生信息进行自定义映射关系-->
    <resultMap id="studentMap" type="student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!--映射关联数据 专业名称-->
        <association property="major" javaType="major">
            <result column="mname" property="name"></result>
        </association>
    </resultMap>

    <!--关联查询第一种-->
    <select id="findStudent" resultMap="studentMap">
         select s.id,
                s.num,
                s.name,
                s.gender,
                m.name mname
                from student s inner join major m on s.majorid = m.id where s.id = #{id}
    </select>

注:association 关联数据表  

property="major" ---->student对象中的major成员变量

javaType="major"----->major对象

解释:我们在Student类中创建Major变量,从而将Major类和Student类连接.我们从后端查询出来的Major类中数据,我们可直接封装在Major对象中(简单理解:其实也就是给Major变量赋值)

嵌套查询

方法二:数据库分次查询

    <!-- 关联查询第二种-->
    <resultMap id="studentMap1" type="student">
        <id column="id" property="id"></id>
        <result column="num" property="num"></result>
        <result column="name" property="name"></result>
        <result column="gender" property="gender"></result>
        <!-- 封装关联查询-->
        <association property="major" javaType="major" select="findMajor" column="majorid">

        </association>
    </resultMap>
    <select id="findStudentById" resultMap="studentMap1">
        select id,num,name,gender,majorid from student where id = #{id}
    </select>
    <!-- 嵌套查询学生关联的专业-->
    <select id="findMajor" resultType="major">
        select name from major where id = #{majorid}
    </select>

collection关联数据表

collection用来查询一个集合

关联查询

    <resultMap id="majorMap" type="major">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <collection property="students" javaType="list" ofType="student">
            <result column="num" property="num"></result>
            <result column="sname" property="name"></result>
        </collection>
    </resultMap>
    <select id="findMajorById" parameterType="int" resultMap="majorMap">
         select
           m.id,
           m.name,
           s.num,
           s.name sname
         from major m inner join student s on m.id = s.majorid where m.id = #{id}
    </select>

嵌套查询

    <resultMap id="majorMap1" type="major">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <collection property="students" javaType="list" ofType="student" select="findStudents" column="id"></collection>
    </resultMap>

    <select id="findMajors1" resultMap="majorMap1">
        select id,name  from major
    </select>

    <select id="findStudents" resultType="student">
        select num,name from student where majorid = #{id}
    </select>

代码解读

Collection和Association区别

Collection(集合)

  • 定义: Collection 是一个数据结构或容器,用于存储一组对象。它通常用于管理和操作多个相同类型的对象。例如,列表(List)、数组(Array)、集合(Set)等都是典型的 Collection。
  • 特点:
    • 包含多个对象,可以对其进行添加、删除、迭代等操作。
    • Collection 通常与某种特定的数据结构关联,负责对这些对象进行管理(如排序、查找等)。
    • 对象的生存周期通常由 Collection 管理,特别是在集合被销毁时,里面的对象可能也会被销毁。
  • 用途: 用于聚合和管理一组对象,通常用于处理大量相同类型的对象集合。

 Association(关联关系)

  • 定义: Association 是一种类与类之间的关系,描述一个类的对象与另一个类的对象之间的链接。例如,一个学校类和一个学生类之间可能会有一个 Association,表示学校包含许多学生。
  • 特点:
    • 表示类之间的连接或关系,而不是数据结构本身。
    • Association 可以是单向或双向的。单向 Association 表示一个类知道另一个类的存在,但反之不然;双向 Association 则表示两个类彼此都知道对方。
    • 关联关系不负责对象的生存周期管理。对象的创建和销毁由其他机制负责。
  • 用途: 用于表示类与类之间的关系,帮助定义对象间的交互和连接。

总结

  • Collection 主要用于管理一组对象的集合,关注的是数据结构和对象的管理。
  • Association 主要用于描述类之间的关系,关注的是对象之间的连接和相互作用

注解方式

  1. @Insert : 插入 sql , 和 xml insert sql 语法完全一样
  2. @Select : 查询 sql, 和 xml select sql 语法完全一样
  3. @Update :更新 sql, 和 xml update sql 语法完全一样
  4. @Delete :删除 sql, 和 xml delete sql 语法完全一样

使用场景:简单的sql一般适合使用注解查询  例如:用户信息查询,添加用户,删除单个用户等

代码演示:

@Delete("delete from t_emp where emp_id=#{empId}")
int deleteByPrimaryKey(@Param("empId") Integer empId);

动态sql

出现原因:因为业务需求出现用户存数据可能只存 姓名 不存 性别 或者不存任何数据,sql语句就需要判断书写.

第一:where 与 if 标签

if test 属性条件成立 执行if标签体,不成立就不执行

where标签 当where标签 if语句有条件成立时,就会动态添加where关键字,还可以删除where后面紧跟的关键字(例如:and,or)

    <select id="teachers1" resultType="teacher">
        SELECT * FROM teacher
        <where>
            <if test="num!=0">
               and num = #{num}
            </if>
            <if test="name!=null">
              and  name  = #{name}
            </if>
        </where>
    </select>

第二:trim标签

参数:

  • prefix

    • 作用: 在生成的 SQL 语句前添加的内容。
    • 示例: 如果你想在 SQL 语句的条件部分加上 WHERE,可以使用 prefix="WHERE"
  • prefixOverrides

    • 作用: 如果生成的 SQL 语句以指定的内容开头,则移除这些内容。通常用于去掉多余的 ANDOR
    • 示例: prefixOverrides="AND" 会去掉生成 SQL 语句中以 AND 开头的部分。
  • suffix

    • 作用: 在生成的 SQL 语句末尾添加的内容。
    • 示例: 如果你想在 SQL 语句的最后加上 ORDER BY,可以使用 suffix="ORDER BY"
  • suffixOverrides

    • 作用: 如果生成的 SQL 语句以指定的内容结尾,则移除这些内容。通常用于去掉多余的逗号、AND 或 OR。
    • 示例: suffixOverrides="," 会去掉生成 SQL 语句末尾多余的逗号

第三:choose标签

注:choose标签选择标签,标签中必须有选择对象,也就是必须有<when>标签

    <select id="teachers" resultType="teacher">
        SELECT * FROM teacher
        <trim prefix="where" prefixOverrides="and|or">
            <choose>
                <when test="name!=null">
                    name = #{name}
                </when>
                <otherwise>
                    name = '苏老师'
                </otherwise>
            </choose>
        </trim>
    </select>

<when> --->当test中条件满足这执行,不满足执行<otherwise>标签中 和 if else差不多

第四:set标签

<set>标签可以在变量之间添加 逗号(,)  

    <update id="updateTeacher" parameterType="teacher">
        update teacher
        <set>
            <if test="num!=0">
                num = #{num},
            </if>
            <if test="name!=null">
                name = #{name}
            </if>
            <if test="gender!=null">
                gender = #{gender}
            </if>
            where id = #{id}
        </set>
    </update>

 第五:foreach标签

1. collection
  • 作用: 指定要迭代的集合。这个集合可以是列表、数组或其他 Java 集合类型。
  • 示例: collection="list" 表示要迭代名为 list 的集合。
2. item
  • 作用: 指定每次迭代时集合中元素的变量名。
  • 示例: item="item" 表示每次迭代时,当前集合项会被引用为 item
3. index
  • 作用: 可选参数,指定每次迭代时当前项的索引(从 0 开始)。通常用于在 SQL 语句中需要索引的场景。
  • 示例: index="index" 表示每次迭代时,当前项的索引会被引用为 index
4. open
  • 作用: 在生成的 SQL 片段开头添加的内容。通常用于生成集合的开头部分,如括号。
  • 示例: open="(" 表示生成的 SQL 片段的开头会加上左括号。
5. close
  • 作用: 在生成的 SQL 片段末尾添加的内容。通常用于生成集合的结束部分,如括号。
  • 示例: close=")" 表示生成的 SQL 片段的末尾会加上右括号。
6. separator
  • 作用: 指定每个集合项之间的分隔符。用于生成 SQL 片段中的项之间的分隔符,如逗号。
  • 示例: separator="," 表示集合项之间会用逗号分隔

代码演示:

    <delete id="deleteTeacher" parameterType="list">
        DELETE FROM teacher
        WHERE id IN
        <foreach collection="list" item="ids" open="(" separator="," close=")">
            #{ids}
        </foreach>
    </delete>



 感谢大家的观看,本次分享就到这里。希望我的内容能够对您有所帮助。创作不易,欢迎大家多多支持,您的每一个点赞都是我持续更新的最大动力!如有不同意见,欢迎在评论区积极讨论,让我们一起学习、共同进步!如果有相关问题,也可以私信我,我会认真查看每一条留言。期待下次再见!

                                       希望路飞的笑容可以治愈努力路途中的你我!

博主vx:Dreamkid05 --->欢迎大家和博主讨论问题 

 

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

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

相关文章

基差、升水与贴水,股指期货市场的重要概念解析

在股指期货市场中&#xff0c;基差、升水和贴水是三个至关重要的概念。它们不仅影响着市场的价格动态&#xff0c;还对套利和套期保值者的策略制定具有重大意义。本文将详细解析这三个概念&#xff0c;帮助读者更好地理解期货市场的运作机制。 一、基差&#xff1a;现货与期货…

公司叫你写three.js 编辑器不会写,我这有思路

低代码------就是将一些复用的流程和操作进行封装简化使用&#xff0c;目前 web 二维 在市场上已经非常普遍&#xff0c;而web 三维低代码普及率并不是很高。 这是我早期创造three低代码内核的一个思维导图 开源地址 https://github.com/z2586300277/three-editor 预览查看 …

如何将ip地址随机更换

在数字化时代&#xff0c;‌IP地址作为网络身份的重要标识&#xff0c;‌其管理和使用方式对于个人和企业都具有重要意义。‌在某些场景下&#xff0c;‌如‌突破地域限制、‌数据抓取或隐私保护等&#xff0c;‌用户可能需要实现IP地址的随机更换。‌本文将深入探讨如何将IP地…

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器

Citrix ADC Release 13.1 Build 54.29 (nCore, VPX, SDX, CPX, BLX) - 混合多云应用交付控制器 Citrix ADC - 混合多云应用交付控制器 请访问原文链接&#xff1a;https://sysin.org/blog/citrix-adc-13/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

电脑开机之后进入emergency mode

电脑开机之后进入emergency mode 本章只针对统信系统 emergency mode 统信UOS Cannot open access to console. The root account is locked 故障现象 电脑开机之后进入emergency mode,提示Cannot open access to console. The root account is locked,按回车也无法进系…

SQLi-LABS 通关攻略【36-40】

SQLi-LABS 36关 1.本关依旧是宽字节注入 2.测试闭合方式 ?id1 //正常显示 ?id1 //显示错误 ?id1%df //显示错误 ?id1%df -- //显示正常 3.测试回显点 ?id-1%df%27…

海康二次开发学习笔记5-二次开发小技巧

二次开发小技巧 1. VM安装目录 Samples内包含C#,QT,VC应用程序 Documetnations内包含C#和C语言的帮助文档 2. 错误码 private void button4_Click(object sender, EventArgs e){try{VmSolution.Load(textBox1.Text);listBox1.Items.Add("方案加载成功.");listBox1.…

RAG 技术真的“烂大街”了吗?

大语言模型技术迅猛发展的脚步&#xff0c;正引领着信息检索技术进入一个新的纪元。在这一领域中&#xff0c; RAG 技术将传统信息检索技术与大语言模型技术相结合&#xff0c;为知识理解、知识获取提供了全新的解决方案。然而&#xff0c;尽管 RAG 在很多任务上表现出色&#…

高空抛物目标检测

高空抛物目标检测是一个技术领域&#xff0c;它关注于从高空向下抛掷或坠落的物体的自动识别和检测。这类目标检测在视频监控、安全防范以及事故预防中扮演着重要角色。 视频监控与分析&#xff1a;通过摄像头持续录制特定区域的视频&#xff0c;使用图像处理和机器学习技术分析…

大话C++:第1篇 C++语言概述

1 C简介 C是由C语言扩展升级而来&#xff0c;最早于1979年由本贾尼斯特劳斯特卢普在AT&T贝尔工作室研发。C在继承了C语言过程化程序设计特性的基础上&#xff0c;进一步扩充和完善了C语言&#xff0c;引入了面向对象的程序设计概念&#xff0c;如抽象数据类型、继承和多态…

HikariPool-1 - Exception during pool initialization报错解决

问题&#xff1a;HikariPool-1 - Exception during pool initialization 分析&#xff1a;由控制台的报错发现是连接数据库的问题&#xff0c;网上的解决方案均是在application.yaml文件加入下面的配置项 尝试过后报错并未解决 但发现刷新数据库竟然可以解决问题 最后报错未…

AI黑神话悟空游戏玩法,抓住流量,完爆一波

介绍 黑神话 悟空 这个游戏 这几天真的是太火了&#xff0c;本来呢 不打算写这方面的教程了&#xff0c;因为我自己对游戏不太感兴趣。 不过我们可以抓住这个热点&#xff0c;发展周边的内容来赚取收益&#xff0c;还是可以的。 据说5天销售了20亿&#xff0c;老外甚至为了玩…

短剧CPS分销系统搭建,3分钟快速了解入行短剧项目

目录 前言 &#xff1a; 一、第一分钟&#xff1a;什么是短剧项目&#xff1f; 二、第二分钟&#xff1a;短剧平台建设和短剧推广 第一种模式&#xff1a;搭建短剧分销cps系统: 第二种模式&#xff1a;自建剧场 买片源授权.需要办理广播证和icp证. 三、第三分钟:平台搭建…

NoSQL数据库-Redis集群详解及案例实现

一、 关系型数据库和 NoSQL 数据库 1.1 数据库主要分为两大类&#xff1a;关系型数据库与 NoSQL 数据库 关系型数据库&#xff0c;是建立在关系模型基础上的数据库&#xff0c;其借助于集合代数等数学概念和方法来处理数据库中的数据主流的 MySQL、Oracle、MS SQL Server 和 D…

SSM地铁智慧管理系统---附源码95798

摘要 本研究旨在基于SSM框架设计与实现地铁智慧管理系统&#xff0c;以提升城市地铁运营管理的效率和智能化水平。通过整合各模块的优势&#xff0c;包括通知公告管理、车次信息管理、检查记录管理、出行信息管理统计等功能&#xff0c;系统旨在实现地铁运营过程的信息化、智能…

为什么鼠标移入角色名称显示的图片随着时间走动而显示与隐藏循环

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>为什么鼠标移入角色名称显示的图片随着时间走动而…

考研系列-数据结构冲刺课复习笔记(下)

一、查找 代码可以参考: 查找算法相关代码-CSDN博客 1.顺序查找 算法: 2.折半查找 算法: 注意:查找判定树的构造!!会使用查找判定树

停车场使用反向寻车系统到底有什么好处

在繁忙的都市生活中&#xff0c;停车场早已成为现代人日常生活中不可或缺的一部分。然而&#xff0c;随着车辆数量的激增&#xff0c;如何在偌大的停车场中迅速找到自己的爱车&#xff0c;成为了许多车主头疼的问题。幸运的是&#xff0c;反向寻车系统的出现&#xff0c;如同黑…

Taichi.js 实战 WebGPU 编程

作为一名计算机图形学和编程语言极客&#xff0c;我很高兴在过去两年中参与了多个 GPU 编译器的开发。 这始于 2021 年&#xff0c;当时我开始为 taichi 做贡献&#xff0c;这是一个 Python 库&#xff0c;可将 Python 函数编译为 CUDA、Metal 或 Vulkan 中的 GPU 内核。后来&…

Linux驱动开发—创建总线,创建属性文件

文章目录 1.什么是BUS&#xff1f;1.1总线的主要概念1.2总线的操作1.3总线的实现 2.创建总线关键结构体解析2.1注册总线到系统2.2 struct bus_type *bus 解析 3.实验结果分析1. devices 目录2. drivers 目录3. drivers_autoprobe 文件4. drivers_probe 文件5. uevent 文件 4.在…