03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询
映射文件的sql語句中 #{} 和 ${} 區(qū)別以及實(shí)現(xiàn)模糊查詢
目錄
- sql 語句中的 #{}
- #{} 模糊查詢錯誤用法
- #{} 實(shí)現(xiàn)模糊查詢
- sql 語句中的 ${}
- ${} 實(shí)現(xiàn)模糊查詢
- #{} 與 ${} 對比
?
sql 語句中的 #{}
- 表示一個占位符號,通過 #{} 可以實(shí)現(xiàn) preparedStatement 向占位符中設(shè)置值。
- 自動進(jìn)行 java 類型和 jdbc 類型轉(zhuǎn)換。
- 可以有效防止 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"><!--根據(jù)用戶名模糊查詢客戶--> <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(); }由執(zhí)行結(jié)果可見,這樣寫的話,運(yùn)行時的 sql 語句如下:
SELECT * FROM customer WHERE cust_name LIKE '%?%'傳入的參數(shù)為 “李” ,由于 #{} 會自動進(jìn)行類型轉(zhuǎn)換(給 ?添加單引號,替換成 ’ ?’),所以實(shí)際的 sql 語句如下:
SELECT * FROM customer WHERE cust_name LIKE '%'李'%'很明顯這個是錯誤的 sql 語句,所以模糊查詢時無法這么實(shí)現(xiàn)。
#{} 實(shí)現(xiàn)模糊查詢
如果一定要用 #{} 實(shí)現(xiàn)模糊查詢,必須以下面的方式實(shí)現(xiàn),查詢名字中帶有李字的人:
<?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"><!--根據(jù)用戶名模糊查詢客戶--> <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();}運(yùn)行效果:成功查詢出表中姓名有李的人,并且封裝成對象。
==> 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, 李信, 戰(zhàn)士, 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='戰(zhàn)士', cust_phone='13728964922', email='lixin@qq.com'}sql 語句中的 ${}
- 表示拼接字符串,不防 sql 注入。
- 通過 ${} 可以將 parameterType 傳入的內(nèi)容拼接在 sql 中并且不進(jìn)行 jdbc 類型轉(zhuǎn)換。
- 可以接收簡單類型或 pojo 屬性值。
- 如果 parameterType 傳輸單個簡單類型值,${} 括號中只能是 value。
${} 實(shí)現(xiàn)模糊查詢
用 ${} 實(shí)現(xiàn)模糊查詢方法如下,查詢名字中帶有李字的人:
<?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"><!--根據(jù)用戶名模糊查詢客戶--> <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(); }運(yùn)行結(jié)果:成功查詢出表中姓名中有李的人,并且封裝成對象?!?/p> ==> 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, 李信, 戰(zhàn)士, 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='戰(zhàn)士', cust_phone='13728964922', email='lixin@qq.com'}
#{} 與 ${} 對比
#{} 不可行方法: 映射文件中的sql:SELECT * FROM customer WHERE cust_name LIKE '%#{name}%'; // 沒有固定參數(shù)名,可以不叫 name 傳入?yún)?shù):"李" 運(yùn)行時顯示的sql:SELECT * FROM customer WHERE cust_name LIKE '%?%'; 實(shí)際的sql:SELECT * FROM customer WHERE cust_name LIKE '%'李'%';#{} 可行方法: 映射文件中的sql:SELECT * FROM customer WHERE cust_name LIKE #{name} // 沒有固定參數(shù)名,可以不叫 name 傳入?yún)?shù):"%李%" 運(yùn)行時顯示的sql:SELECT * FROM customer WHERE cust_name LIKE ? 實(shí)際的sql:SELECT * FROM customer WHERE cust_name LIKE '%李%';${} 可行方法: 映射文件中的sql:SELECT * FROM customer WHERE cust_name LIKE '%${value}%'; // 參數(shù)名必須叫 value 傳入?yún)?shù):"李" 運(yùn)行時顯示的sql:SELECT * FROM customer WHERE cust_name LIKE '%李%';總結(jié)
以上是生活随笔為你收集整理的03-映射文件的sql语句中 #{} 和 ${} 的区别以及实现模糊查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SaaS和网络安全公司如何处理隐私问题
- 下一篇: 04-插入操作更新操作删除操作