03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询

映射文件的sql语句中 #{} 和 ${} 区别以及实现模糊查询

目录

  • sql 语句中的 #{}
  • #{} 模糊查询错误用法
  • #{} 实现模糊查询
  • sql 语句中的 ${}
  • ${} 实现模糊查询
  • #{} 与 ${} 对比

 

sql 语句中的 #{}

  • 表示一个占位符号,通过 #{} 可以实现 preparedStatement 向占位符中设置值。
  • 自动进行 java 类型和 jdbc 类型转换。
  • 可以有效防止 sql 注入。
  • 可以接收简单类型值或 pojo 属性值。
  • 如果 parameterType 传输单个简单类型值,#{} 括号中可以是任意名称。

#{} 模糊查询错误用法

在模糊查询中,#{} 在以下用法是错误的,查询名字中带有李字的人:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myTest"><!--根据用户名模糊查询客户-->
<select id="queryCustomerByName" parameterType="String" resultType="com.itlike.domain.Customer">SELECT * FROM customer WHERE cust_name LIKE '%#{cust_name}%';
</select></mapper>

查询代码如下:

public void test3(){SqlSession sqlSession = MybatisUtils.openSession();List<Customer> customers = sqlSession.selectList("queryCustomerByName", "李");for (Customer customer : customers) {System.out.println(customer);}sqlSession.close();
}

由执行结果可见,这样写的话,运行时的 sql 语句如下:

SELECT * FROM customer WHERE cust_name LIKE '%?%'

在这里插入图片描述

传入的参数为 “李” ,由于 #{} 会自动进行类型转换(给 ?添加单引号,替换成 ’ ?’),所以实际的 sql 语句如下:

SELECT * FROM customer WHERE cust_name LIKE '%'李'%'

很明显这个是错误的 sql 语句,所以模糊查询时无法这么实现。

#{} 实现模糊查询

如果一定要用 #{} 实现模糊查询,必须以下面的方式实现,查询名字中带有李字的人:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myTest"><!--根据用户名模糊查询客户-->
<select id="queryCustomerByName" parameterType="String" resultType="com.itlike.domain.Customer">SELECT * FROM customer WHERE cust_name LIKE #{cust_name}
</select></mapper>

查询代码如下:

 @Testpublic void test3(){SqlSession sqlSession = MybatisUtils.openSession();List<Customer> customers = sqlSession.selectList("queryCustomerByName", "%李%");for (Customer customer : customers) {System.out.println(customer);}sqlSession.close();}

运行效果:成功查询出表中姓名有李的人,并且封装成对象。

==>  Preparing: SELECT * FROM customer WHERE cust_name LIKE ? 
==> Parameters: %李%(String)
<==    Columns: cust_id, cust_name, cust_profession, cust_phone, email
<==        Row: 2, 李白, 刺客, 18977665521, libai@163.com
<==        Row: 11, 李信, 战士, 13728964922, lixin@qq.com
<==      Total: 2
Customer{cust_id=2, cust_name='李白', cust_profession='刺客', cust_phone='18977665521', email='libai@163.com'}
Customer{cust_id=11, cust_name='李信', cust_profession='战士', cust_phone='13728964922', email='lixin@qq.com'}

sql 语句中的 ${}

  • 表示拼接字符串,不防 sql 注入。
  • 通过 ${} 可以将 parameterType 传入的内容拼接在 sql 中并且不进行 jdbc 类型转换。
  • 可以接收简单类型或 pojo 属性值。
  • 如果 parameterType 传输单个简单类型值,${} 括号中只能是 value。

${} 实现模糊查询

用 ${} 实现模糊查询方法如下,查询名字中带有李字的人:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myTest"><!--根据用户名模糊查询客户-->
<select id="queryCustomerByName" parameterType="String" resultType="com.itlike.domain.Customer">SELECT * FROM customer WHERE cust_name LIKE '%${value}%';
</select></mapper>

查询代码如下:

public void test3(){SqlSession sqlSession = MybatisUtils.openSession();List<Customer> customers = sqlSession.selectList("queryCustomerByName", "李");for (Customer customer : customers) {System.out.println(customer);}sqlSession.close();
}

运行结果:成功查询出表中姓名中有李的人,并且封装成对象。·

==>  Preparing: SELECT * FROM customer WHERE cust_name LIKE '%李%'; 
==> Parameters: 
<==    Columns: cust_id, cust_name, cust_profession, cust_phone, email
<==        Row: 2, 李白, 刺客, 18977665521, libai@163.com
<==        Row: 11, 李信, 战士, 13728964922, lixin@qq.com
<==      Total: 2
Customer{cust_id=2, cust_name='李白', cust_profession='刺客', cust_phone='18977665521', email='libai@163.com'}
Customer{cust_id=11, cust_name='李信', cust_profession='战士', cust_phone='13728964922', email='lixin@qq.com'}

#{} 与 ${} 对比

#{} 不可行方法:
映射文件中的sql:SELECT * FROM customer WHERE cust_name LIKE '%#{name}%'; // 没有固定参数名,可以不叫 name
传入参数:"李"
运行时显示的sql:SELECT * FROM customer WHERE cust_name LIKE '%?%';
实际的sql:SELECT * FROM customer WHERE cust_name LIKE '%'李'%';#{} 可行方法:
映射文件中的sql:SELECT * FROM customer WHERE cust_name LIKE #{name} // 没有固定参数名,可以不叫 name
传入参数:"%李%"
运行时显示的sql:SELECT * FROM customer WHERE cust_name LIKE ? 
实际的sql:SELECT * FROM customer WHERE cust_name LIKE '%李%';${} 可行方法:
映射文件中的sql:SELECT * FROM customer WHERE cust_name LIKE '%${value}%'; // 参数名必须叫 value
传入参数:"李"
运行时显示的sql:SELECT * FROM customer WHERE cust_name LIKE '%李%';

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

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

相关文章

SpringBoot集成Flowable

一、项目结构 二、maven配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

04-插入操作更新操作删除操作

保存更新删除 目录 插入操作获取插入的最后一个id更新操作删除操作插入操作 映射文件 Customer.xml &#xff1a; 插入数据的标签为 insert&#xff0c;与查询 select 区分开来。 parameterType 是输入参数类型&#xff0c;这里指定为 Customer 对象&#xff0c;即需要传入一…

微软跨平台移动开发工具套件HockeyApp宣布免费

HockeyApp 是一款领先的移动崩溃分析和应用发布服务&#xff0c;可为开发者提供实时崩溃分析报告、用户反馈、测试版分发平台以及测试分析等功能&#xff0c;于 2016 年被微软收购&#xff0c;随后集成在了 Visual Studio 应用中心中&#xff0c;与 Xamarin Insights 一起提供移…

ASP.NET Core使用静态文件、目录游览与MIME类型管理

前言今天我们来了解了解ASP.NET Core中的静态文件的处理方式.以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了.ASP.NET Core则不同,因为是跨平台的,解耦了IIS,所以这些工作 我们可以在管道代码中处理.正文在我们的Web程序开发中,肯定要提…

ES快速入门

转载自 ES快速入门 3 ES快速入门 ES作为一个索引及搜索服务&#xff0c;对外提供丰富的REST接口&#xff0c;快速入门部分的实例使用head插件来测试&#xff0c;目的是对ES的使用方法及流程有个初步的认识。 3.1 创建索引库 ES的索引库是一个逻辑概念&#xff0c;它包括了分…

05-传统开发模式DAO

传统开发模式DAO 目录 定义接口 CustomerDao.java实现接口 CustomerDaoImpl.java测试类在传统开发模式DAO下&#xff0c;我们自己先定义好接口&#xff0c;然后再去定义实现类&#xff0c;在实现类中实现接口的操作。到时候只需要创建一个 dao 对象&#xff0c;即可调用其中的…

AspnetCore 2.0 自动API文档生成组件,支持protobuffer

关于API文档自动生成&#xff0c;用于对APP端的开发帮助文档生成&#xff0c;默认ProtoBuffer传输格式。本项目并不是RESTful风格&#xff0c;是面向功能的API类型。ApiDoc的作用是根据定义好的API接口和注释来自动生成给内部开发者提供的API对接文档。欢迎Star一下&#xff0c…

06-Mapper动态代理

Mppaer 动态代理 目录 创建 Mapper 工程定义接口的要求测试类Mapper 中参数传递单个参数多个参数param命名参数多个参数封装成 Map多个参数之 POJO参数处理源码分析之前我们一直都使用传统开发模式DAO&#xff0c;即定义接口&#xff0c;然后定义实现类。这个其实是较为繁琐的…

ASP.NET Core MVC中的 [Required]与[BindRequired]

在开发ASP.NET Core MVC应用程序时&#xff0c;需要对控制器中的模型校验数据有效性&#xff0c;元数据注释(Data Annotations)是一个完美的解决方案。元数据注释最典型例子是确保API的调用者提供了某个属性的值&#xff0c;在传统的ASP.NET MVC中使用的是RequiredAttribute特性…

ES集群管理

转载自 ES集群管理 8 集群管理 ES通常以集群方式工作&#xff0c;这样做不仅能够提高 ES的搜索能力还可以处理大数据搜索的能力&#xff0c;同时也增加了系统的容错能力及高可用&#xff0c;ES可以实现PB级数据的搜索。 下图是ES集群结构的示意图&#xff1a; 从上图总结以下…

【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Java的注释方式二. 标识符三. 关键字四. 全篇总结 &#x1f4d1;前言 在Java编程…

07-MyBatis 核心配置文件

MyBatis 核心配置文件 目录 properties 定义属性及读取属性文件settings 设置运行时行为typeAliases 类型别名定义单个别名批量定义别名typeHandlers 类型处理器Plugins&#xff08;后续有文章专门介绍这个&#xff09;Environments 运行环境databaseIDProvider 定义数据库厂…

Office 365也是.NET Core应用开发新战场

最近有幸阅读了陈希章花了一年时间为国内开发者贡献的《Office 365 开发入门指南》。 虽然早期接触过SharePoint的开发&#xff0c;2007年之后就再也没有接触SharePoint的开发&#xff0c;这次阅读这本书让我重新认识了Office的系统开发技术&#xff0c;让我意识到现在的Office…

jzoj4802-[GDOI2017模拟9.24]探险计划【费用流,拆点】

正题 题目大意 一个nnn行的不完全矩阵第iii行有mi−1mi-1mi−1个格子&#xff0c;然后每个格子有危险度。 每次可以从(i,j)(i,j)(i,j)走到(i−1,j)(i-1,j)(i−1,j)或(i−1,j−1)(i-1,j-1)(i−1,j−1) 求 m次&#xff0c;每个格子和路不可以重复走的最小危险度。m次&#xff0…

08-输出类型

输出类型 目录 输出简单类型输出 Map 类型key:列名 value:列名对应的值key:自己指定的列 value:自定义对象resultMap输出简单类型 CustomerMapper.java&#xff1a;返回值为简单类型。 public interface CustomerMapper {/*查询总数*/public Integer getAccountCustomer();…

在Ubuntu 16.04环境下安装Docker-CE(附视频教程)

“ 任何的课程都逃不开理论的支持”久等了各位&#xff0c;上一篇说Docker开始的消息已经过去了一周多的时间&#xff0c;今天推送的消息是告诉大家视频可以学习了&#xff01;52ABP .NET CORE QQ群 : 633751348大纲Docker的介绍Ubuntu下安装Docker快速体验Docker利用Docker搭…

WebApi client 的面向切面编程

.Net的面向切面编程.Net的服务端应用AOP很常见&#xff0c;在Asp.net MVC与Asp.net WebApi等新框架里到处都有AOP的影子&#xff0c;我们可以把一个服务方法“切”为很多面&#xff0c;日志面、验证面、请求方式处理、接口业务实现等多个面&#xff0c;有一些面可以使用过滤器特…

09-一对多关系建表

多表操作 目录 表之间关系一对多关系建表原则表之间关系 一对一关系&#xff1a;一夫一妻。 一对多关系&#xff1a; 一个部门有多个员工&#xff0c;一个员工只能属于某一个部门。 一个班级有多个学生&#xff0c;一个学生只能属于一个班级。 多对多关系&#xff1a; 一个…

10-多对一左连接查询分步查询(查询所有订单及订单对应的客户)

左连接查询&#xff08;级联查询&#xff09; 回顾一下&#xff1a;左连接查询&#xff0c;将左边表(order)里的全部内容查出&#xff0c;右边表(customer)查满足条件的。 SELECT * FROM order AS o LEFT JOIN customer AS c on o.cust_id c.cust_id;1那么在 MyBatis 中如何…

入门干货之Grpc的.Net 封装-MagicOnion

0x01、Grpc1、介绍Google主导开发的RPC框架&#xff0c;使用HTTP/2协议并用ProtoBuf作为序列化工具&#xff0c;支持多种语言。在.NET Core “大更新” 之前&#xff0c;也就是目前来说还算是个很不错的选择。2、吐槽a、有很多性能比较的文章拿Grpc开涮.b、搭建困难&#xff0c…