MyBatis——增删查改(XML 方式)

news2024/11/22 23:55:14

1. 查询

1.1. 简单查询

使用注解的方式主要是完成一些简单的增删查改功能,如果要实现复杂的 SQL 功能,还是建议使用 XML 来配置映射语句,将 SQL 语句写在 XML 配置文件中

如果要操作数据库,需要做以下的配置,与注解方式不同的是,还需要配置一下 XML 文件的路径,这样才能获取其中的配置信息

spring:
  application:
   name: mybatis-demo
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  # 配置 mybatis xml 的文件路径,在 resources/mapper 创建所有表的 xml 文件
  mapper-locations: classpath:mapper/**Mapper.xml
  configuration: # 配置打印 MyBatis日志
  log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

**Mapper.xml 表示以 Mapper.xml 结尾的文件

然后就是写持久层代码:

@Mapper
public interface UserInfoXmlMapper {
    List<UserInfo> selectAll();
}

XML 配置的方式就不需要把 SQL 语句写在这里了,接下来看怎么配置 XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mybatisdemo.mapper.UserInfoXmlMapper">

  <select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">
    //查询语句
    select * from user_info
  </select>
</mapper>

1.2. 驼峰转化问题

接下来看一下 XML 中是怎么解决的

第一种还是在 SQL 语句中设置别名的方式

<select id="selectAll" resultType="com.example.mybatisdemo.model.UserInfo">
  select id,username,password,age,gender,phone,
  delete_flag as deleteFlag,
  create_time as createTime,
  update_time as updateTime
  from user_info
</select>

来看第二种方式:

<resultMap id="BashMap" type="com.example.mybatisdemo.model.UserInfo">
  <id property="id" column="id"></id>
  <result property="deleteFlag" column="delete_flag"></result>
  <result property="createTime" column="create_time"></result>
  <result property="updateTime" column="update_time"></result>
</resultMap>

<select id="selectAll" resultMap="BashMap">
  select id,username,password,age,gender,phone,
  delete_flag,
  create_time,
  update_time
  from user_info
</select>

id属性指定了这个resultMap的唯一标识符为 BashMap,type 后面表示这个结果映射到对应的 java 对象的类型

<id property="id" column="id"></id>:这一行定义了如何将数据库表中的 “id” 列的值映射到UserInfo对象的 “id” 属性上,虽然说写不写都可以,但是建议还是写上,同时,其他 java 对象的属性名和 MySQL 中的字段对应的也建议写上

第三种方式还是通过配置来实现驼峰自动转换,和注解那里是一样的

mybatis:
  configuration:
    map-underscore-to-camel-case: true #配置驼峰自动转换

1.3. 多表查询

由于是多表查询,所以也要创建第二个表的对象

@Data
public class ArticleInfo {
    private Integer id;
    private String title;
    private String content;
    private Integer uid;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

再来看持久层代码

@Mapper
public interface ArticleInfoMapper {
    @Select("select ta.id,ta.title, ta.content, ta.uid, tb.username, tb.password from article_info ta " +
            "left join user_info tb on ta.uid = tb.id " +
            "where ta.id = #{id} ")
    ArticleInfo selectArticleInfoAndUserInfo(Integer id);
}

但是上面由于获取了两个表的信息,但是返回值是ArticleInfo的对象,所以涉及到UserInfo的信息是没有被赋值的:

Mybatis 是把 SQL 查询到的信息根据参数的映射来赋值的,只需要把ArticleInfo的属性加上这些就可以赋值了

2. 增加

和注解方式的代码类似

先来看持久层代码:

定义好接口,通过传入对象的方式来传参

@Mapper
public interface UserInfoXmlMapper {
    Integer insertUser(UserInfo userInfo);
}

和上面的查询不同的是,这里不用再配置返回值类型,要写的 SQL 语句和注解方式一样,这里也是通过#{}来传参的

<insert id="insertUser">
  insert into user_info(username, password, age, gender)
  values (#{username}, #{password}, #{age}, #{gender})
</insert>

再来看传入的参数是对象时的重命名:

Integer insertUser2(@Param("userInfo") UserInfo userInfo);

这时 XML 中的 SQL 语句中的参数也是和注解方式一样,通过对象名. 的方式来表示参数

<insert id="insertUser2">
  insert into user_info(username, password, age, gender)
  values (#{userInfo.username}, #{userInfo.password}, #{userInfo.age}, #{userInfo.gender})
</insert>

不用对象名. 的方式就会出现绑定异常

关于使用传递对象方式参数重命名要通过对象名. 的方式表示参数的原因:

  1. 当方法有且仅有一个参数(比如 UserInfo 对象)时,可以不用 @Param 注解直接传入对象。这种情况下,在 XML 中可以直接通过 #{属性名} 的方式引用对象的属性,因为 MyBatis 能直接识别这个参数是一个对象。
  2. 当为这个唯一参数加上 @Param 注解(比如 @Param("userInfo")),MyBatis 就会用 userInfo 作为这个参数的别名。MyBatis 会将传入的 UserInfo 对象视为一个名为 userInfo 的封装对象。这样,XML 中的引用就需要带上这个别名前缀(userInfo.),从而确保引用的是这个封装对象下的属性

这一点和注解方式是一样的

3. 修改

先来看持久层代码:

@Mapper
public interface UserInfoXmlMapper {
    Integer updateUser(Integer id,String password);
}

XML 中还是一样的,也是不用配置返回值,然后直接写 SQL 语句

<update id="updateUser">
  update user_info set password = #{password} where id = #{id}
</update>

4. 删除

删除和修改也是类似的

持久层代码:

@Mapper
public interface UserInfoXmlMapper {
    Integer deleteUserById(Integer id);
}

XML配置:

<delete id="deleteUserById">
  delete from user_info where id = #{id};
</delete>

我的主页

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

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

相关文章

YJN5216 手提式升降工作灯

YJN5216 手提式升降工作灯 产品简介&#xff1a; 适用于防汛应急抢修、铁路工务、电务、供电、运输等场所小范围检修、施工照明&#xff0c;也适用于电网、公消等行业小方位应急照明使用。 性能特点&#xff1a; 灯具体积小、重量轻,可以实现手提、背行两种携带方式。 灯具…

LeetCode题练习与总结:完美矩形--391

一、题目描述 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi, yi) &#xff0c;右上顶点是 (ai, bi) 。 如果所有矩形一起精确覆盖了某个矩形区域&#xff0c;则返回 true &#xff1b;否则…

Mac中安装OhMyZsh

Mac中安装OhMyZsh 文章目录 Mac中安装OhMyZsh一、Homebrew二、OhMyZsh1、Oh-My-Zsh配置1.1&#xff1a;主题配置1.2&#xff1a;插件配置&#xff08;语法高亮和自动提示&#xff09;1、zsh-autosuggestions&#xff08;需下载安装&#xff09;&#xff1a;高亮显示所有支持的命…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Llama旋转位置编码代码实现及详解

旋转位置编码RoPE 在旋转位置编码与Transformer和BERT之间的区别中介绍了旋转位置编码&#xff08;RoPE&#xff09;的特点和优势&#xff0c;这种输入长度动态可变的优势使得在Llama编码时&#xff0c;不需要掩码将多余的嵌入掩住。为了详细了解RoPE是如何实现的&#xff0c;…

如何保证Redis与MySQL双写一致性

什么是双写一致性问题&#xff1f; 双写一致性主要指在一个数据同时存在于缓存&#xff08;如Redis&#xff09;和持久化存储&#xff08;如MySQL&#xff09;的情况下&#xff0c;任何一方的数据更新都必须确保另一方数据的同步更新&#xff0c;以保持双方数据的一致状态。这一…

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器&#xff0c;基于CMOSens技术。它提…

计算机新手练级攻略——善用搜索引擎

计算机学生新手练级攻略——善用搜索引擎 在信息爆炸的时代&#xff0c;计算机专业的学生如何有效地自我提升&#xff1f;答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口&#xff0c;更是解决问题的利器。下面&#xff0c;我将分享一些善用搜…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

Unity 网格模型及优化

一个模型中可以包含很多网格&#xff0c;一个模型可以由多个网格组成。在Unity3D中一个网格可以由多个子网格&#xff08;Sub-Mesh)组成。 在渲染引擎的时候&#xff0c;每个子网格都要匹配一个材质球来做渲染&#xff0c;实际上一个子网格本身就是一个个普通的模型&#xff0…

恒源云使用手册记录:从服务器下载数据到本地

文章目录 一、xftp下载二、通过Xftp客户端连接站点 一、xftp下载 先下载xftp&#xff1a;下载连接 二、通过Xftp客户端连接站点 右击文件&#xff0c;点击新建 名称可以任意 主机、端口号、用户名 点击这里的复制登录命令 比如我这里得到ssh -p 41604 rooti-2.gpushare.co…

ReactPress:功能全面的开源发布平台

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 此项目是用于构建博客网站的&#xff0c;包含前台展示、管理后台和后端。 此项目是基于 React antd NestJS NextJS MySQL 的&#xff0c;项目已经开源&#xff0c;项目地址在 …

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

Android CarrierConfig 参数项和正则匹配逻辑

背景 在编写CarrierConfig的时候经常出现配置不生效的情况&#xff0c;比如运营商支持大范围的imsi&#xff0c;或者是测试人员写卡位数的问题等等&#xff0c;因此就需要模式匹配&#xff08;包含但不限于正则表达式&#xff09;。 基本概念: 模式匹配涉及定义一个“模式”&a…

Golang | Leetcode Golang题解之第557题反转字符串中的单词III

题目&#xff1a; 题解&#xff1a; func reverseWords(s string) string {length : len(s)ret : []byte{}for i : 0; i < length; {start : ifor i < length && s[i] ! {i}for p : start; p < i; p {ret append(ret, s[start i - 1 - p])}for i < le…

运行WHTools批量启动游戏房间工具提示要安装.Net Framework3.5解决

确认电脑能正常上网 点击下载并安装此功能&#xff0c;开始安装.Net Framework 3.5 安装成功 成功启动WHTools

Xcode 16 使用 pod 命令报错解决方案

原文请点击这个跳转 一、问题现象&#xff1a; 有人会遇到 Xcode 升级到 16 后&#xff0c;新建应用然后使用 pod init 命令会报错如下&#xff1a; Stack Ruby : ruby 3.3.5 (2024-09-03 revision ef084cc8f4) [x86_64-darwin23]RubyGems : 3.5.22Host : macOS 15.0 (24A335…

STM32WB55RG开发(1)----开发板测试

STM32WB55RG开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32WB55 & SENSOR是一款基于STM32WB55系列微控制器的评估套件。该套件采用先进的无线通信技术&#xff0c;支…

【广西】《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》(桂财建〔2023〕102号)-省市费用标准解读系列09

《广西壮族自治区本级政务信息化建设和运维项目预算支出标准》&#xff08;桂财建〔2023〕102号&#xff09;是广西壮族自治区财政厅于2023年9月26日发布的费用标准&#xff08;了解更多可直接关注我们咨询&#xff09;。我司基于专业第三方信息化项目造价机构角度&#xff0c;…

前端学习笔记-Ajax篇

第1章:原生AJAX 1.1Ajax简介 AAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势:无刷新获取数据。 AAX 不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用…