0. loxia 简介:
loxia https://github.com/benjaliu/loxia2-repo/tree/master/releases/loxia2 是一款类似于 mybatis 的优秀持久层框架,支持定制化 SQL、存储过程以及高级映射。
loxia 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
1. loxia like 背景
前些天, 雷哥找我咨询 like 避免 sql 注入的问题, 我提供了简单的思路
2.使用方式,第1步 xml
<bean id="HypeRiskResult.findMaliciousMemberByEmail" class="loxia.dao.support.DynamicQueryHolder">
<constructor-arg>
<value>
<![CDATA[
select
id
from member
where
email like :email
]]>
</value>
</constructor-arg>
</bean>
3. 使用方式,第2步java 调用
List<HypeRiskResultCommand> results = riskResultDao.findMaliciousMemberByEmail("%" + email.getRestrictions() + "%");
4. 原理
PreparedStatement
使用like https://blog.csdn.net/wangcunhuazi/article/details/47067389
在使用PreparedStatement
进行模糊查询的时候废了一番周折,
一般情况下我们进行精确查询,sql语句类似: select * from table where name =?
, 然后调用 PreparedStatement
的 setString
等方法给 ?
指定值。
那么模糊查询的时候应该怎么写呢?
4.1 尝试1
先尝试了: select * from customer where name like '%?%'
程序报错,因为 ?
被包含在了单引号中,PreparedStatement
并不视它为一个参数。
4.2 尝试2
发现可以这样写 select * from table where name like ?
在指定参数的时候把 ?
指定为 ”%”+name+”%”
, name 是指定的查询条件, 这样就OK了
一般情况下,潜意识的认定了 ?
就是取代所指定的参数, 实际上可以对指定的参数进行了包装之后再传给?
,如此处在参数的前后都加了一个%
,然后再传给 ?
String expr = "select * from table where url like ?";
pstmt = con.prepareStatement(expr);
String a="a";
pstmt.setString(1, "%"+a+"%");//自动添加单引号 (包装后的参数)
pstmt.execute();
System.out.println(pstmt.toString());//打印sql
//会默认生成sql: select * from table where url like '%http%'