mybatis%_查询
本文章向大家介绍mybatis%_查询(hibernate也可用相同的处理方式),具有一定的参考价值,需要的朋友可以参考一下。
出现问题得原因
在我们做web项目 使用模糊查询的时候,如果前端传% 或者 _ 查询,如果不处理的话,查询是所有的,这样的效果是不对的,所以需要对参数进行转译,从而达到想要的效果。
mysql数据库:
对于mysql来说:
select * from category where name like '%%%'
select * from category where name like '%\%%'
结果:
第一条sql的结果集:
第二条sql的结果集:
第二条sql的结果集是想要的效果,所以需要转译,具体实现如下:
public static String queryString(String temp) {
if (temp==null) {
return "";
}
StringBuilder b = new StringBuilder();
b.append(temp.trim());
StringBuilder tempBuilder = new StringBuilder();
tempBuilder.append(temp.trim());
for (int i = 0, j = 0; i < b.length(); i++) {
char x = b.charAt(i);
if (x == '%' || x == '_') {
tempBuilder.insert(i + j, '\\');
j++;
}
}
return tempBuilder.toString();
}
<select id="getlikeCategory" parameterType="String" resultType="Category">
select * from category where name like concat('%',#{0},'%')
</select>
测试代码:
public class Main {
public static void main (String[] args) throws IOException {
//根据配置文件mybatis-config.xml得到sqlSessionFactory
String resource = "mybatis-config.xml";
InputStream input = Resources.getResourceAsStream(resource);
SqlSessionFactory sf = new SqlSessionFactoryBuilder().build(input);
//然后再根据sqlSessionFactory 得到session
SqlSession session=sf.openSession();
String name = Category.queryString("%");
//执行sql
List<Category> cs = session.selectList("getlikeCategory",name);
for (Category category : cs) {
System.out.println(category.getName());
}
session.commit();
session.close();
}
}
结果为:category%1
Oracle数据库:
对于oracle来说 处理方式与mysql相同,但是SQL语句条件后需要加 ESCAPE ‘/’ ;