映射文件的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 '%李%';

【MyBatis笔记】03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询相关推荐

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

    映射文件的sql语句中 #{} 和 ${} 区别以及实现模糊查询 目录 sql 语句中的 #{} #{} 模糊查询错误用法 #{} 实现模糊查询 sql 语句中的 ${} ${} 实现模糊查询 #{} ...

  2. Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 ‘?

    Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 '? 出于好奇,然后就有了这篇文章啦. 源码给我的感觉,是一座大山的感觉.曲曲折折的路很多,点进去就有可能出不来. 不过慢慢看下 ...

  3. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  4. Mybatis映射文件动态SQL语句-02

    foreach UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...

  5. sql语句中limit的用法,limit分页查询语句以及总结(一)

    一. 基本用法 在使用查询语句的时候,经常要返回前几条或者中间某几行数据,但是你的数据库查询记录有几万.几十万时,这个时候怎么办呢?mysql 已经为我们提供了上面这样一个功能. 使用LIMIT查询, ...

  6. Java不区分大小写模糊查询方法_查询语句中不区分大小写和区分大小写及其模糊查询 的语句...

    1:不区分大小写的函数 collate Chinese_PRC_CI_AS select * from J01 left join S40 on J0101=S4004 collate Chinese ...

  7. oracle不使用游标,oracle – 为什么我们不能在动态SQL语句中使用强引用游标?

    这是一个带有强类型引用游标的过程: SQL> create or replace procedure p1 is 2 type dept_rc is ref cursor return dept ...

  8. sql语句中的limit用法

    sql语句中的limit用法 limit 用于限制查询结果返回. 用法: limit a,b 其中a表示查询数据的起始位置,b表示返回的数量. (MySQL数据库中的记录是从0开始的) 举例: SEL ...

  9. MyBatis学习 之 三、动态SQL语句

    2019独角兽企业重金招聘Python工程师标准>>> 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的, ...

最新文章

  1. 我在攻克机器学习硕士学位的那些年
  2. influxdb java spring_Spring boot使用influxDB总结
  3. 关于卷积的6个基本知识
  4. python怎么导入时间-Python的import导入与时间
  5. 任正非签发最新电邮:管理者的18种堕怠行为
  6. go语言通道插入0_Go语言入门必知教程-通道
  7. Goland使用技巧
  8. 推理集 —— 现场的观察
  9. 19【推荐系统9】WideDeep和DeepCross模型
  10. 如何申请小程序账号及上线一个体验版小程序
  11. 用python处理蛋白质互作信息
  12. App自动化测试之企微打卡、快手刷金币
  13. kettle MongoDB数据迁移至Hbase
  14. 不懂不要炒股,一定要在调整时买入股票!
  15. 业务逻辑漏洞之水平越权和垂直越权
  16. 科技爱好者周刊:第 87 期
  17. 离线下载实时最新版adobe flash插件地址
  18. 如何选择MySQL中除一列外的所有列
  19. Hadoop基本组成
  20. 【计算机网络】环回接口、lo网卡

热门文章

  1. 想要获得别人尊重,你必须得自己先牛逼起来
  2. ThreadLocal设计
  3. 邻居家小孩来问WiFi密码,告诉后邻居家竟然几部手机电视全用上,该怎么办?
  4. 编码与调制(曼彻斯特编码、调制解调器等)
  5. sql中变量用法_SQL变量:基础和用法
  6. SQL Server数据挖掘–如何将数据转化为有价值的信息
  7. 将本地SQL Server数据库迁移到Azure SQL数据库
  8. sql always on_Always On可用性组中具有发布者数据库SQL复制
  9. Python 爬虫实战2 百度贴吧帖子
  10. 程序员面试必备:动图演示十大经典排序算法及代码实现