浅谈高校网站群的建设/雅虎搜索引擎中文版

浅谈高校网站群的建设,雅虎搜索引擎中文版,江苏建设厅,做网站销售的目录 1. 前言 2. 动态插入 2.1 if 标签 2.2 trim 标签 2.2.1 注解完成动态 SQL 3. 动态查询 3.1 添加 1 1 3.2 where 标签 4. 动态更新 4.1 set 标签 5. foreach 标签 6. sql 标签 & include 标签 1. 前言 之前博文所讲的 MyBatis SQL 操作, 都必须按照注解或…

目录

1. 前言

2. 动态插入

2.1 if 标签 

2.2 trim 标签

2.2.1 注解完成动态 SQL

3. 动态查询

3.1 添加 1 = 1

3.2 where 标签

 4. 动态更新

4.1 set 标签

 5. foreach 标签

6. sql 标签 & include 标签


1. 前言

之前博文所讲的 MyBatis SQL 操作, 都必须按照注解或者标签中定义的 SQL 严格执行, 一个注解/标签, 对应的是不同的 SQL 操作. 比如: 一个 select 注解中, 定义了 3 个字段, 那这个注解只能插入这三个列的值, 如果想要插入更多的列, 必须重新再写一个注解.

而动态 SQL, 我们可以根据用户输入的值, 动态的进行字段的插入, 当用户输入这一字段的值时, 就插入这一字段. 当用户没有输入这一字段的值时, 就不插入这一字段. 能够完成不同条件下, 不同的 SQL 拼接.

注意: 本文主要通过 XML 完成动态 SQL!! 

2. 动态插入

2.1 if 标签 

通过 if 标签, 对传入的参数的值进行判断, 若未传入相关列的值, 则不拼接该列的 SQL 片段. 

如下图所示, 只有当传入参数的值不为 null 时, 才会拼接该 SQL 片段.

注意: if 标签, 判断的是传入的参数的值(#{} 中的参数), 即 java 属性, 而不是数据库字段!!

因此, 我们就可以通过这一个 insert 标签对应的方法, 进行任意字段的插入:

但是, 当对最后一个字段传入的值为 null 时, 错误就发生了:

这是因为最后一个字段 gender 的值为 null, 导致 if 标签的判断为 false, 因此 gender 字段的 SQL 没有进行拼接, 导致倒数第二个字段 phone 后多了一个逗号(,), 拼接的内容是 "phone , "因此造成语法错误.

此时, 就需要 trim 标签出马了~~

2.2 trim 标签

trim 标签中有以下属性:

  1. prefix: 表示整个语句块, 以 prefix 的值作为前缀
  2. suffix: 表示整个语句块, 以suffix的值作为后缀
  3. prefixOverrides: 表示整个语句块要去除掉的前缀
  4. suffixOverrides: 表示整个语句块要去除掉的后缀

有 trim 标签, 就可以通过 prefixOverrides/suffixOverrides 属性解决上文中由于没有拼接最后一个字段, 导致倒数第二个字段后拼接了逗号(,)的问题, 并且还可以通过 prefix/suffix 属性将 SQL 中的 "(" 和 ")" 自动拼接到 SQL 中:

 运行观察结果:

<insert id="insertUser4">insert into user_info<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=","><if test="username != null">username,</if><if test="password != null">password,</if><if test="age != null">age,</if><if test="phone != null">phone,</if><if test="gender != null">gender</if></trim>values<trim prefix="(" suffix=")" prefixOverrides="," suffixOverrides=","><if test="username != null">#{username},</if><if test="password != null">#{password},</if><if test="age != null">#{age},</if><if test="phone != null">#{phone},</if><if test="gender != null">#{gender}</if></trim></insert>

2.2.1 注解操作动态 SQL

上文是通过 XML 进行的动态 SQL , 在注解中同样也是可以的, 并且方式相同.

若要通过注解完成动态 SQL, 只需将上文 XML 中动态 SQL 的代码, 以字符串的形式拼接到 <script> 标签中即可.

    @Insert("<script>" +"insert into user_info " +"<trim prefix=\"(\" suffix=\")\" prefixOverrides=\",\" suffixOverrides=\",\">" +"<if test=\"username != null\">username,</if>" +"<if test=\"password != null\">password,</if>" +"<if test=\"age != null\">age,</if>" +"<if test=\"phone != null\">phone,</if>" +"<if test=\"gender != null\">gender</if>" +"</trim> values " +"<trim prefix=\"(\" suffix=\")\" prefixOverrides=\",\" suffixOverrides=\",\">" +"<if test=\"username != null\">#{username},</if>" +"<if test=\"password != null\">#{password},</if>" +"<if test=\"age != null\">#{age},</if>" +"<if test=\"phone != null\">#{phone},</if>" +"<if test=\"gender != null\">#{gender}</if>" +"</trim>" +"</script>")int insertUser4(UserInfo userInfo);

3. 动态查询

进行 select 查询操作时, 常常会用到 where 关键字进行条件查询, 进行条件查询时, 同样也可以通过 if 标签进行动态查询:

但是, 当参数 phone 为 null 时, 就发生错误了:

出错的原因很简单: 因为 phone 属性的值为 null, 导致 where 关键字后跟的是 "and gender", 导致 SQL 语法错误.

解决办法很简单, 使用 trim 标签, 将 and 关键字去除即可:

但是, 当 phone 和 gender 两个属性都为 null 时, 问题又出现了:

这里错误的原因是: phone 和 gender 都为 null, 导致出现了多余的 where 关键字, 导致 SQL 语法错误.

解决方法有两种:

  1. 添加 1 = 1, 保证 where 后有条件
  2. 使用 <where>, 去除 where 关键字

3.1 添加 1 = 1

在 where 关键字后添加 1 = 1, 保证 where 后有条件. 并在每条拼接的 SQL 片段前添加 and, 保证 SQL 片段可以进行拼接: 

<select id="selectByCondition" resultType="com.study.mybatis.model.UserInfo">select * from user_infowhere 1 = 1<if test="phone != null">and phone = #{phone}</if><if test="gender != null">and gender = #{gender}</if></select>

3.2 where 标签

使用 where 标签代替 where 关键字:

where 标签有两个作用:

  1. 当 where 标签语块内没有内容时, 不会生成 where 关键字
  2. 当 where 标签语块内有查询条件时, 会自动生成 where 关键字, 并且会去除最前面的 and 关键字

因此, 即使查询条件全为 null, 或者第一个查询条件前有 and 关键字, where 标签都会帮我们解决这些问题:

但是, 在实际工作中, 要避免使用 where 标签, 因为当我们遗漏传入条件查询的参数时, 程序也会正确执行, 而无任何条件限制的 select 是非常严重的!!

<select id="selectByCondition" resultType="com.study.mybatis.model.UserInfo">select * from user_info<where><if test="phone != null">phone = #{phone}</if><if test="gender != null">and gender = #{gender}</if></where>
</select>

 4. 动态更新

update 语句也可以结合 if 和 trim 标签, 完成动态更新操作:

<update id="updateUser2">update user_infoset<trim suffixOverrides=","><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="age != null">age = #{age}</if></trim>where id = #{id}</update>

4.1 set 标签

除了上文将 if 和 trim 标签结合完成动态的 update 操作外, 也可以使用 set 标签来完成.

set 标签的作用:

  1. 生成 set 关键字
  2. 去除多余的逗号(只能去除最后一个逗号)

<update id="updateUser3">update user_info<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="age != null">age = #{age}</if></set>where id = #{id}</update>

 5. foreach 标签

在进行数据库操作时, 我们常会在一个条 SQL 语句中, 对数据批量的进行操作, 如下:

SELECT * FROM user_info where id = 1 or id = 2 or id = 3;INSERT into user_info (username, `password`) VALUES ('1', '1'), ('2', '2');UPDATE user_info set delete_flag = 1 WHERE id IN(1, 2, 3);DELETE from user_info WHERE id IN(4, 5, 6);

如果要通过 MyBatis 对数据进行批量处理, 就需要使用 foreach 标签. \

使用 foreach 批量操作数据, 传入的参数必定是一个集合(包括 Map).

foreach 标签中有以下几个关键属性:

  1. collection (必须): 指定要迭代的集合. (如果方法参数是 Listcollection 就是 List 的参数名)

  2. item (必须): 指定迭代过程中元素的名称.

  3. index (可选): 表示集合中每个元素的索引

  4. separator (可选): 指定每个元素之间的分隔符

  5. open (可选): 循环开始前要添加的字符串. 通常用于在 IN 语句中添加左括号 (

  6. close (可选): 循环结束后要添加的字符串. 通常用于在 IN 语句中添加右括号 )

<!--    DELETE from user_info WHERE id IN(1, 2, 3);--><delete id="deleteUser2">delete from user_info whereid in<foreach collection="ids" open="(" close=")" item="id" separator=",">#{id}</foreach></delete>
<!--    delete FROM user_info where id = 1 or id = 2 or id = 3;--><delete id="deleteUser3">delete from user_info where<foreach collection="ids" item="id" separator="or">id = #{id}</foreach></delete>
<!--    insert into user_info (username, `password`) VALUES ('1', '1'), ('2', '2');--><insert id="insertUser1">insert into user_info (username, password) values<foreach collection="userInfos" item="user" separator=",">(#{user.username}, #{user.password})</foreach></insert>

6. sql 标签 & include 标签

sql 标签和 include 标签通常搭配使用.

在 sql 标签中定义一个 sql 片段, 并指定这个 sql 标签的 id.

在其他任何标签中, 就可以通过 include 标签指定某个 sql 标签的 id, 直接引用该 sql 标签中的 sql 片段.

也就是说, 我们可以直接通过 sql 标签的 id, 实现 sql 片段的复用.

注意:

SQL 标签中可以定义任意的 SQL 片段(字符串), 不一定是可执行的 SQL !!


END 

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

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

相关文章

【从零开始学习计算机科学】编译原理(七)运行时刻环境

【从零开始学习计算机科学】编译原理(七)运行时刻环境 运行时刻环境存储组织空间的栈式分配活动树活动记录和控制栈简单栈式存贮分配C语言的过程调用和过程返回时的存贮管理堆式存储分配堆式存储分配的功能垃圾回收基于跟踪的垃圾回收短停顿垃圾回收运行时刻环境 存储组织 …

2025-03-08 学习记录--C/C++-PTA 习题10-1 判断满足条件的三位数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h>int search( int n );int…

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…

化工厂防爆气象站:为石油化工、天然气等领域提供安全保障

【TH-FB02】在石油化工、天然气等高危行业中&#xff0c;安全生产是至关重要的。这些行业常常面临着易燃易爆、有毒有害等潜在风险&#xff0c;因此&#xff0c;对气象条件的监测和预警显得尤为重要。化工厂防爆气象站作为一种专门设计用于这些特殊环境的气象监测设备&#xff…

《MySQL数据库从零搭建到高效管理|库的基本操作》

目录 一、数据库的操作 1.1 展示数据库 1.2 创建数据库 1.3 使用数据库 1.4 查看当前数据库 1.5 删除数据库 1.6 小结 二、常用数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 一、数据库的操作 打开MySQL命令行客户端&#xff0c;安装完MySQL后会有两个客户端…

计算机考研C语言

C语言程序设计从入门到精通【2025完整版】考研复试 嵌入式 计算机二级 软考 专升本也适用_哔哩哔哩_bilibili 1、第一个C程序 helloC #include <stdio.h>int main(){printf("hehe");return 0;}每个C语言程序不管有多少行代码&#xff0c;都是从main函数开始执…

力扣hot100二刷——链表

第二次刷题不在idea写代码&#xff0c;而是直接在leetcode网站上写&#xff0c;“逼”自己掌握常用的函数。 标志掌握程度解释办法⭐Fully 完全掌握看到题目就有思路&#xff0c;编程也很流利⭐⭐Basically 基本掌握需要稍作思考&#xff0c;或者看到提示方法后能解答⭐⭐⭐Sl…

Word 小黑第2套

对应大猫42 Word1 从文件中导入新样式 样式组 -管理样式 -导入导出 -关闭Normal文件 -打开文件 -修改文件 -选中所需 -复制 调整字符宽度 调整字符间距 -字体组 加宽 适当修改磅值 文字效果通过文字组修改 另起一页&#xff0c;分隔符&#xff08;布局 -分隔符 -分节符 -下一…

【RabbitMQ】Spring Boot 结合 RabbitMQ 完成应用间的通信

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【中间件】企业级中间件剖析 Spring 框架与 RabbitMQ 的整合主要通过 Spring AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;模块实现&#xff0c;提供了便捷的消息队列开发能力。 引…

UVC摄像头命令推流,推到rv1126里面去

ffmpeg命令查询UVC设备 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上图是查询UVC设备的效果图&#xff0c;画红框的部分是UVC设备的设备名称"USB2.0 PC CAMERA"和设备号 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

Linux中的基本指令(上)

目录 ls指令 判断linux中文件 pwd指令 认识路径 ​编辑 绝对路径/相对路径 cd指令 简要理解用户 理解家目录 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

Qt 数据库操作(Sqlite)

数据库简介 关于数据库的基础知识这里就不做介绍了&#xff0c;相关博客可以查看&#xff1a; SQL基础知识 数据库学霸笔记 上面博客都写的比较详细&#xff0c;本文主要介绍如何使用Qt进行数据库相关操作&#xff0c;数据库分为关系型数据库和非关系型数据&#xff0c;关系…

网络安全 api 网络安全 ast技术

随着应用或者API被攻击利用已经越来越多&#xff0c;虽然来自开源组件的漏洞加剧了这一现象的发生&#xff0c;但是&#xff0c;其实主要还是在于应用程序或者API本身没有做好防范&#xff0c;根源在于源代码本身的质量没有严格把控。AST是指Application Security Testing&…

Mac 配置 Maven JDK

不使用 Homebrew&#xff0c;创建指定版本 JDK 1、官网下载指定版本并安装……省略 2、vi &#xff5e;/.zshrc 同时要检查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

【病毒分析】熊猫烧香病毒分析及其查杀修复

目录 前言 一、样本概况 1.1 样本信息 1.2 测试环境及工具 1.3 分析目标 二、具体行为分析 2.1 主要行为 2.1.1 恶意程序对用户造成的危害 2.2 恶意代码分析 2.2.1 加固后的恶意代码树结构图(是否有加固) 2.2.2 恶意程序的代码分析片段 三、解决方案(或总结) 3.1 …

sqli-lab靶场学习(八)——Less26-28

前言 25关已经出现了初步的一些关键字过滤&#xff0c;通过双写可以绕过。后面的关卡&#xff0c;我们会遇到更多关键字过滤&#xff0c;需要各种技巧绕过。 Less26 第26关写了会过滤空格和注释符。有很多的答案&#xff0c;会用%a0替代空格&#xff0c;但据说这是sqli-labs部…

python:VOC格式数据集转换为YOLO数据集格式

作者&#xff1a;CSDN _养乐多_ 本文将介绍如何将目标检测中常用的VOC格式数据集转换为YOLO数据集&#xff0c;并进行数据集比例划分&#xff0c;从而方便的进行YOLO目标检测。 如果不想分两步&#xff0c;可以直接看第三节代码。 文章目录 一、将VOC格式数据集转换为YOLO格…

Docker容器安装软件(完整版)

文章目录 一、安装Docker1.1 docker 相关的命令1.2 配置镜像加速 二. 安装es2.1 创建网络2.2 拉取镜像2.3 创建挂载点目录2.4 部署单点es&#xff0c;创建es容器2.5 编写elasticsearch.yml2.6 重启es容器2.7 测试Elasticsearch是否安装成功 三. 基于Docker安装Kibana3.1 拉取镜…

NetAssist 5.0.14网络助手基础使用及自动应答使用方案

以下是NetAssist v5.0.14自动应答功能的详细使用步骤&#xff1a; 一、基础准备&#xff1a; 工具下载网址页面&#xff1a;https://www.cmsoft.cn/resource/102.html 下载安装好后&#xff0c;根据需要可以创建多个server&#xff0c;双击程序图标运行即可&#xff0c;下面…

node.js-node.js作为服务器,前端使用WebSocket(单个TCP连接上进行全双工通讯的协议)

1.WebSocket全双工通信协议 WebSocket是HTML5开始提供的一种单个TCP连接上进行全双工通讯的协议。让客户端和服务器间的数据交互变得简单&#xff0c;允许服务端向客户端主动推送数据。浏览器和服务器间只需要完成一次握手&#xff0c;两者间创建持久性的连接&#xff0c;并进行…