MyBatis 框架学习(II)

MyBatis 框架学习(II)

文章目录

  • MyBatis 框架学习(II)
    • 1. 介绍
    • 2. 准备&测试
      • 2.1 配置数据库连接字符串和MyBatis
      • 2.2 编写持久层代码
    • 3. MyBatis XML基础操作
      • 3.1 Insert 操作
      • 3.2 Delete 操作
      • 3.3 Update 操作
      • 3.4 Select 操作
    • 4. #{} 与 ${}的使用
    • 5. 动态SQL操作
      • 5.1 < if >标签
      • 5.2 < trim >标签
      • 5.3 < where >标签
      • 5.4 < set >标签
      • 5.5 < foreach >标签
      • 5.6 < include >标签
    • 总结

在上一篇文章中,我们学习了通过 注解的方式( MyBatis 框架学习(I) )来进行 MyBatis开发,接下来我们来学习使用 XML的方式进行 MyBatis开发:

1. 介绍

使用MyBatis注解的方式主要是用来解决简单的SQL操作,如增删改查功能,如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件

2. 准备&测试

想要进行XML的使用,我们需要先完成以下配置:

  • 配置数据库连接字符串和MyBatis;
  • 编写持久层代码

2.1 配置数据库连接字符串和MyBatis

如果配置文件是application.properties,代码如下:

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_test
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=123456#配置mybatis的日志, 指定输出到控制台
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl#开启mybatis的驼峰命名自动映射开关 a_column ------> aCloumn
mybatis.configuration.map-underscore-to-camel-case=true# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件 --> 使用XML需要配置这个
mybatis.mapper-locations=classpath:mapper/**Mapper.xml

如果配置文件是application.yml,代码如下:

# 数据库连接配置 每个空格都不能省略,yml严格要求格式正确
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_testusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver
# 配置打印 MyBatis⽇志
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmybatis:configuration:map-underscore-to-camel-case: true #配置驼峰⾃动转换# 配置 mybatis xml 的⽂件路径,在 resources/mapper 创建所有表的 xml ⽂件
mybatis:mapper-locations: classpath:mapper/**Mapper.xml

2.2 编写持久层代码

持久层代码分两部分:

  1. 方法定义:Interface
  2. 方法实现:XXX.xml

在这里插入图片描述

首先需要定义mapper接口

@Mapper
public interface UserInfoXmlMapper {// 查询所有用户public List<UserInfo> queryAllUser();}

之后创建xml文件

在这里插入图片描述

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="org.example.blog_mybatis.mapper.UserInfoXmlMapper"><select id="queryAllUser" resultType="org.example.blog_mybatis.pojo.UserInfo">select username, password, id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo</select>
</mapper>

对上述内容进行分析:

  • <mapper>标签:需要指定namespace属性,表示命名空间,值为mapper接口的全限定名称,即包括全包名.类名,可以通过以下方式直接获取:

    在这里插入图片描述

  • < select >标签:查询标签,用于进行数据库中的查询操作:

    • id是和mapper接口中定义的方法名称一致,表示对接口的具体实现方法;
    • resultType:返回的数据类型,也就是我们定义的实体类(也需要为全限定名称)

在这里插入图片描述

最后编写测试代码:

package org.example.blog_mybatis.mapper;import org.example.blog_mybatis.pojo.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class UserInfoXmlMapperTest {@Autowiredprivate UserInfoXmlMapper userInfoXmlMapper;@Testvoid queryAllUser() {List<UserInfo> list = userInfoXmlMapper.queryAllUser();System.out.println(list);}
}

在这里插入图片描述

测试成功!!

3. MyBatis XML基础操作

3.1 Insert 操作

UserInfoXmlMapper中进行方法定义:

Integer InsertUser(UserInfo userInfo);

之后在XML文件中进行方法实现:

<insert id="InsertUser">insert into userinfo(username, password, age, phone, gender)values (#{username}, #{password}, #{age}, #{phone}, #{gender})
</insert>

编写测试方法:

@Test
void insertUser() {UserInfo userInfo = new UserInfo();userInfo.setUsername("飞天虎");userInfo.setPassword("125");userInfo.setAge(38);userInfo.setGender(1);userInfo.setPhone("100");Integer count = userInfoXmlMapper.InsertUser(userInfo);System.out.println("添加数据条数:" + count);
}

在这里插入图片描述

在这里插入图片描述

如果使用@Param设置参数名称的话,使用方法和注解类似,同时若需要获取ID,可以在insert标签中添加属性useGeneratedKeyskeyProperty

<insert id="InsertUser" useGeneratedKeys="true" keyProperty="id" >insert into userinfo(username, password, age, phone, gender)values (#{username}, #{password}, #{age}, #{phone}, #{gender})
</insert>

在这里插入图片描述

3.2 Delete 操作

UserInfoXmlMapper中进行方法定义:

void DeleteUser(Integer id);

之后在XML文件中进行方法实现:

<delete id="DeleteUser">delete from userinfo where id = #{id}
</delete>

编写测试方法:

@Test
void deleteUser() {userInfoXmlMapper.DeleteUser(14);
}

在这里插入图片描述

在这里插入图片描述

3.3 Update 操作

UserInfoXmlMapper中进行方法定义:

Integer UpdateUser(UserInfo userInfo); 

之后在XML文件中进行方法实现:

<update id="UpdateUser">update userinfo set username = #{username}, age = #{age} where id = #{id}
</update>

编写测试方法:

@Test
void updateUser() {UserInfo userInfo = new UserInfo();userInfo.setId(12);userInfo.setUsername("张三丰");userInfo.setAge(100);Integer count = userInfoXmlMapper.UpdateUser(userInfo);System.out.println("修改数据:" + count);
}

在这里插入图片描述

在这里插入图片描述

3.4 Select 操作

UserInfoXmlMapper中进行方法定义:

UserInfo queryUser(Integer id);

之后在XML文件中进行方法实现:

<select id="queryUser" resultType="org.example.blog_mybatis.pojo.UserInfo">select id, username, password, age, gender, phone, delete_flag, create_time, update_time from userinfo where id = #{id}
</select>

编写测试方法:

@Test
void queryUser() {UserInfo userInfo = userInfoXmlMapper.queryUser(5);System.out.println(userInfo);
}

在这里插入图片描述

:这里能够正确的获取到全部数据是因为在配置文件里配置了自动进行驼峰命名,若没有添加这个配置则返回结果中后续几个属性值(deleteFlag开始)会为null,如何添加在上篇文章有介绍:[MyBaits 框架学习(I)]

4. #{} 与 ${}的使用

在前面我们使用#{}来进行参数传递,#{}本身属于预编译SQL机制,通过?占位的方式提前对SQL进行编译,然后把参数填充到SQL语句中,如下:

在这里插入图片描述

如果传进来的是String类型的参数,#{}也会根据类型自动添加引号

${}即时SQL,它的作用就是将参数直接拼接到SQL语句中:

在这里插入图片描述

如果传入的参数是字符串的话,需要手动给它添加上引号,否则传入${}的参数不会自动添加引号,进而报错,比如通过名称查询用户信息,若xml代码这样写:

<select id="queryUserByName" resultType="org.example.blog_mybatis.pojo.UserInfo">select id, username, password, age,gender, phone, delete_flag,create_time, update_time from userinfo where username = ${username}
</select>

在这里插入图片描述

可以看到运行结果会报错,此时就需要我们手动给${}添加引号:

<select id="queryUserByName" resultType="org.example.blog_mybatis.pojo.UserInfo">select id, username, password, age,gender, phone, delete_flag,create_time, update_time from userinfo where username = '${username}'
</select>

在这里插入图片描述

此时查询结果就正确了

5. 动态SQL操作

MyBatis为我们提供了一个强大的功能来解决复杂的SQL操作,那就是动态SQL,它能够完成不同条件下不同的sql拼接,接下来我们来学习相应的标签:

5.1 < if >标签

当我们需要根据特定条件进行语句判断时即可以使用if标签,比如之前通过Insert操作向数据库插入用户信息:

<insert id="InsertUser" useGeneratedKeys="true" keyProperty="id" >insert into userinfo(username, password, age, phone, gender)values (#{username}, #{password}, #{age}, #{phone}, #{gender})
</insert>

如果这个时候性别是非必填字段,希望根据用户有无传入这个属性来让sql编译时自动添加gender这个字段,则可以使用if标签来进行判断:

<insert id="InsertUser" useGeneratedKeys="true" keyProperty="id" >insert into userinfo(username,password,age,phone,<if test="gender != null">gender</if>)values (#{username},#{password},#{age},#{phone},<if test="gender != null">#{gender}</if>)
</insert>

在这里插入图片描述

此时因为没有传入gender参数所以sql语句编译时没有显示gender字段

5.2 < trim >标签

在上面的if语句中,其实存在着一个隐藏的问题,那就是字段后面的逗号(","),如果我的gender属性为null,则上述phone字段后面跟着的逗号也会一起被sql语句编译,这个时候就会出现问题了:

在这里插入图片描述

这个时候我们可以通过trim标签来解决这个问题:

insert into userinfo(<trim suffixOverrides=",">username,password,age,phone,<if test="gender != null">gender</if></trim>)values (<trim suffixOverrides=",">#{username},#{password},#{age},#{phone},<if test="gender != null">#{gender}</if></trim>)
</insert>

在这里插入图片描述

对于trim标签,它有以下属性:

  • prefix:表示整个语句块(从<trim>到</trim>),以prefix的值为前缀;
  • suffix:表示整个语句块,以suffix的值为后缀;
  • prefixOverrides:表示整个语句块要除掉的前缀;
  • suffixOverrides:表示整个语句块要除掉的后缀,比如上述代码中的","

在一般情况下,当我们需要对多个字段进行动态生成时即可使用trim标签

5.3 < where >标签

<where>标签只会在子元素有内容的情况下才会插入where子句,而且会自动去除子句开头的 ANDOR:

先在UserInfoXmlMapper中进行方法定义:

List<UserInfo> queryUserByCondition(Integer age, Integer gender, Integer deleteFlag);

之后在XML文件中进行方法实现:

<select id="queryUserByCondition" resultType="org.example.blog_mybatis.pojo.UserInfo">select username, password, id, username,password, age, gender, phone, delete_flag,create_time, update_time from userinfo<where><if test="age != null">and age = #{age} </if><if test="gender != null">and gender = #{gender}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if></where>
</select>

编写测试方法:

@Test
void queryUserByCondition() {List<UserInfo> list = userInfoXmlMapper.queryUserByCondition(18, 1,0);System.out.println(list);
}

在这里插入图片描述

test属性对应的参数为方法传入参数而不是字段名,且如果方法传入参数为空,where标签中子元素无内容,不会插入子句:

在这里插入图片描述

5.4 < set >标签

当我们需要根据用户传入的信息来修改内容时,可以通过set标签实现动态修改,如修改参数不为null的属性:

<update id="UpdateUser">update userinfo<set><if test="username != null">username = #{username}</if><if test="age != null">age = #{age},</if><if test="deleteFlag != null">delete_flag = #{deleteFlag}</if></set>where id = #{id}
</update>

在这里插入图片描述

set标签用于update语句中,并且会删除额外的逗号,以上标签也可以使用替换

5.5 < foreach >标签

当我们需要对集合进行遍历时可以使用该标签,foreach标签有以下属性:

  • collection:绑定方法参数中的集合,如List,Set,Map或数组对象;
  • item:遍历时的每一个对象;
  • open:遍历开始时加的前缀;
  • close:遍历结束时加的后缀;
  • separator:每次遍历之间间隔的字符串

如果我们现在需要批量删除用户信息,就可以使用foreach标签进行遍历删除,代码如下:

UserInfoXmlMapper中进行方法定义:

void DeleteUserById(List<Integer> ids);

之后在XML文件中进行方法实现:

<delete id="DeleteUserById">delete from userinfo<where>id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></where>
</delete>

编写测试代码:

void deleteUserById() {List<Integer> list = new ArrayList<>();list.add(15);list.add(16);list.add(17);userInfoXmlMapper.DeleteUserById(list);
}

在这里插入图片描述

在这里插入图片描述

5.6 < include >标签

XMl文件中配置sql,有时候会出现许多重复的字段,这样会造成一定的代码冗余:

在这里插入图片描述

对此,我们可以对重复的代码进行抽取,将其通过<sql>标签封装到一个SQL片段中,然后再通过<include>标签进行引用:

  • <sql>:定义可重复的SQL片段;
  • <include>:通过属性refid,指定包含的SQL片段

在xml文件中添加:

<sql id="allColum">id, username, password, age,gender, phone, delete_flag,create_time, update_time
</sql>

通过标签引用重复sql片段,且rafid属性的值与sql标签中id的属性值相同

<select id="queryUser" resultType="org.example.blog_mybatis.pojo.UserInfo">select <include refid="allColum"></include> from userinfo where id = #{id}
</select> 

在这里插入图片描述

总结

对于MyBatis XML方式的使用就介绍到这,对于注解和XML两者的使用范围并不固定,推荐在进行简单的SQL操作时可以使用注解更加方便快捷,而对于复杂的SQL操作则可以使用XML的方式来进行高效解决!!

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

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

相关文章

去除图像周围的0像素,调整大小

在做分割任务时&#xff0c;经常需要处理图像&#xff0c;如果图像周围有一圈0像素&#xff0c;需要去除掉&#xff0c;重新调整大小 数组的处理 如果图像的最外一圈为0&#xff0c;我们将图像最外圈的图像0去除掉。 import numpy as npdef remove_outer_zeros(arr):# 获取数…

纠正对CAN的错误认识

STM32CUBEMX系列——CAN通讯的配置_stm32cubemx 配置103 can-CSDN博客 STM32之CAN通信_stm32 can通信-CSDN博客 在回环模式下&#xff0c;发送的数据帧会在控制器内部被立即接收&#xff0c;而不会通过总线传播到其他节点。这种模式可以确保在没有其他节点干扰的情况下&#…

AI边缘计算盒子+ThingSense管理平台,推动明厨亮灶智慧监管新篇章

背景随着“互联网”时代的浪潮汹涌而至&#xff0c;国家及各地政府纷纷在“十四五”规划中明确指出&#xff0c;强化食品安全管理&#xff0c;利用技术手段实现智慧监管是刻不容缓的任务。为此&#xff0c;各地正加速推进“互联网明厨亮灶”的建设步伐&#xff0c;实现系统对接…

C# 使用 ThoughtWorks.QRCode 生成二维码

目录 关于 ThoughtWorks.QRCode 开发运行环境 方法设计 代码实现 调用示例 Logo图标透明化 小结 关于 ThoughtWorks.QRCode 二维码是用某种特定的几何图形按一定规律在平面分布的、黑白相间的、记录数据符号信息的图形&#xff0c;在应用程序开发中也被广泛使用&#x…

vue+node使用RSA非对称加密,实现登录接口加密密码

背景 登录接口&#xff0c;密码这种重要信息不可以用明文传输&#xff0c;必须加密处理。 这里就可以使用RSA非对称加密&#xff0c;后端生成公钥和私钥。 公钥&#xff1a;给前端&#xff0c;公钥可以暴露出来&#xff0c;没有影响&#xff0c;因为公钥加密的数据只有私钥才…

不同分辨率下搜狗输入法输入图标过大

现象 笔记本是2k屏外接1080p显示器&#xff0c;分辨率不同导致搜狗输入法在笔记本显示器上显示正常&#xff0c;而在1080p显示器下图标很大过大&#xff0c;一打字就显得很尴尬。 解决 找到以上三个可执行文件&#xff0c;分别右键打开属性-->兼容性-->更改高DPI设置 按…

安装nvm管理node版本

准备工作 卸载电脑上原有的nodejs&#xff0c;卸载后确保相关的文件夹也删除掉&#xff0c;否则会在nvm安装成功后管理node版本时造成冲突&#xff0c;例如执行nvm use 20.5.0时报exit status 145的错误。原本就没有安装过node的不用管 一、nvm的安装及使用 1、下载nvm&…

SS-Net复现

表1 8 labeled 样本复现结果–Dice&#xff1a;88.540501&#xff0c;Jaccard&#xff1a;79.60452&#xff0c;95HD&#xff1a;7.58588897&#xff0c;误差在可接受范围内 表2 7 labeled 样本复现结果–Dice&#xff1a;86.778431&#xff0c;Jaccard&#xff1a;77.665895&…

算法思想总结:栈

一、栈的经典应用&#xff1a;波兰表达式与逆波兰表达式 我们平时看到的 12*&#xff08;3-4*5&#xff09;6/7 叫做中缀表达式&#xff0c;平时我们习惯用这个计算的原因是我们可以整体地去看到这个表达式并且清楚地知道各个运算符的优先级&#xff0c;但是计算机并不一定知道…

微信小程序四(全局配置和页面配置页面跳转)

全局配置&#xff1a; 小程序根目录下的 app.json 文件用来对微信小程序进行全局配置&#xff0c;决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等 tabBar设置&#xff1a;最少两个最多5个 "tabBar": {"list":[{"pagePath": &qu…

“饕餮之路:贪吃蛇编程精粹“

目录 前言 1.写代码前的预准备 1.1修改控制台 1.2相关WinAPI32知识学习 1.2.1WinAPI32介绍 1.2.2 mode 命令 1.2.3 title 命令 1.2.4COORD 1.2.5GetStdHandle 1.2.6对控制台光标进行设置 1.2.6.1GetConsolrCursorInfo 1.2.6.2 CONSOLE_CURSOR_INFO 1.2.6.3SetConsol…

vos3000外呼系统客户端无法安装如何解决?

如果 VOS3000 外呼系统客户端无法安装&#xff0c;可以尝试以下解决方法&#xff1a; 检查系统要求&#xff1a; 确保你的计算机满足 VOS3000 外呼系统客户端的系统要求&#xff0c;包括操作系统版本、内存、处理器等。如果系统不符合要求&#xff0c;可能会导致安装失败或者运…

c语言中,数组取地址的书写格式

数组取地址 为了更好的区分数组取地址时的情况&#xff0c;我们建立两个数组&#xff0c;arr1一维数组和arr2二维数组&#xff0c;用printf函数来打印出每个例子arr1和arr2的地址&#xff0c;这样可以更加直观的区分出来。 首先我们看到第一组打印&#xff0c;可以看到若是直接…

Qt图片等资源管理

Qt的图片等资源管理通常有两种方式 1&#xff0c;直接将图标和一些配置文件打包在可执行程序中 添加qrc文件&#xff0c;可使用qtcreator直接添加 右键选中工程 点击选择即可。 然后添加文件。我这个例子是添加了Image文件夹下的图片资源 使用的时候&#xff0c;可以在代码…

TCP/IP协议(二)

一、TCP-选项 1.简介 在TCP/IP报文中&#xff0c;固定头部下边就是 "选项"部分。 (1)TCP头部的选项部分是TCP为了适应复杂的网络环境和更好的服务应用层而进行设计的 (2)大多数的TCP选项部分出现在TCP连接建立阶段 2.构成 2.1 最大报文传输段 最大报文传输段(Ma…

Java面试八股之简述Servlet体系结构

简述Servlet体系结构 Servlet是Java Web开发中的核心组件&#xff0c;用于接收和响应HTTP请求&#xff0c;生成动态内容。它具有平台无关性、协议无关性和动态内容生成能力&#xff0c;遵循明确的生命周期。尽管现代Web开发中更多使用高级框架&#xff0c;但Servlet作为基础&a…

【SAP ME 18】SAP ME创建开发组件ear

1、说明 SC开发组件ear项目是所有sap me二次开发项目的编译入和部署入口,通过ear可以有效的针对子项目的编译和部署 2、创建开发组件

【MATLAB源码-第190期】基于matlab的32QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

云打印怎么下单?网上云打印下单教程来了!

近些年来&#xff0c;随着移动互联网的发展&#xff0c;云打印也越来越火热。如今有越来越多的用户选择云打印服务。但是现在仍有很多不知道如何下单。那么云打印怎么下单呢&#xff1f;今天小易就来和大家介绍一下网上云打印的下单教程。 云打印怎么下单&#xff1f;网上云打印…

MYSQL45道练习题---持续更新中

来源&#xff1a; Mysql_45道练习题 - 简书 共四张表&#xff1a; ①、course表&#xff1a; CId&#xff1a;课程id Cname&#xff1a;课程名称 TId&#xff1a;老师id ②、student学生表&#xff1a; SId&#xff1a;学生id Sname&#xff1a;…