【MyBatis笔记】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 '%李%';
【MyBatis笔记】03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询相关推荐
- 03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询
映射文件的sql语句中 #{} 和 ${} 区别以及实现模糊查询 目录 sql 语句中的 #{} #{} 模糊查询错误用法 #{} 实现模糊查询 sql 语句中的 ${} ${} 实现模糊查询 #{} ...
- Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 ‘?
Mybatis 源码探究 (4) 将sql 语句中的#{id} 替换成 '? 出于好奇,然后就有了这篇文章啦. 源码给我的感觉,是一座大山的感觉.曲曲折折的路很多,点进去就有可能出不来. 不过慢慢看下 ...
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
- Mybatis映射文件动态SQL语句-02
foreach UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYP ...
- sql语句中limit的用法,limit分页查询语句以及总结(一)
一. 基本用法 在使用查询语句的时候,经常要返回前几条或者中间某几行数据,但是你的数据库查询记录有几万.几十万时,这个时候怎么办呢?mysql 已经为我们提供了上面这样一个功能. 使用LIMIT查询, ...
- Java不区分大小写模糊查询方法_查询语句中不区分大小写和区分大小写及其模糊查询 的语句...
1:不区分大小写的函数 collate Chinese_PRC_CI_AS select * from J01 left join S40 on J0101=S4004 collate Chinese ...
- oracle不使用游标,oracle – 为什么我们不能在动态SQL语句中使用强引用游标?
这是一个带有强类型引用游标的过程: SQL> create or replace procedure p1 is 2 type dept_rc is ref cursor return dept ...
- sql语句中的limit用法
sql语句中的limit用法 limit 用于限制查询结果返回. 用法: limit a,b 其中a表示查询数据的起始位置,b表示返回的数量. (MySQL数据库中的记录是从0开始的) 举例: SEL ...
- MyBatis学习 之 三、动态SQL语句
2019独角兽企业重金招聘Python工程师标准>>> 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的, ...
最新文章
- 我在攻克机器学习硕士学位的那些年
- influxdb java spring_Spring boot使用influxDB总结
- 关于卷积的6个基本知识
- python怎么导入时间-Python的import导入与时间
- 任正非签发最新电邮:管理者的18种堕怠行为
- go语言通道插入0_Go语言入门必知教程-通道
- Goland使用技巧
- 推理集 —— 现场的观察
- 19【推荐系统9】WideDeep和DeepCross模型
- 如何申请小程序账号及上线一个体验版小程序
- 用python处理蛋白质互作信息
- App自动化测试之企微打卡、快手刷金币
- kettle MongoDB数据迁移至Hbase
- 不懂不要炒股,一定要在调整时买入股票!
- 业务逻辑漏洞之水平越权和垂直越权
- 科技爱好者周刊:第 87 期
- 离线下载实时最新版adobe flash插件地址
- 如何选择MySQL中除一列外的所有列
- Hadoop基本组成
- 【计算机网络】环回接口、lo网卡