mysql多条件过滤查询之mysq高级查询
原创
©著作权归作者所有:来自51CTO博客作者一乐yile的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、什么是高级查询:
① 多条件的过滤查询
简单说,即拼接sql语句
,在sql查询语句之后使用:
where 条件1 and/or 条件2 and/or 条件3 …
② 分页查询
二、多条件过滤查询:
1,WHERE 1=1:
是一个永远为true的条件【mysql安全注入漏洞】,通过 1=1 的条件,避免判断where后边应该接收那个字段【考虑到拼接的几个字段都为空】。
StringBuilder sql = new StringBuilder();
sql.append(" WHERE 1=1");
if (StringUtils.isNotBlank(name)) {
sql.append(" AND name LIKE ?");
parameters.add("%" + name + "%");
}
if (minAge != null) {
sql.append(" AND age >= ?");
parameters.add(minAge);
}
2、WHERE 1=1 问题:影响性能,因为不能使用索引查询
了。
解决where 1=1 索引问题【定义一个容器,当容器放进了条件,取出容器的条件
(第一个条件前拼接上where,其他拼接and)】
sql.append(" WHERE ");
sql.append(StringUtils.join(conditions, " AND "));
3、思维:封装与职责分离
1:封装:参数过多应该封装成一个对象
2:职责分离:谁拥有该数据,谁就应该包含操作该数据的方法
4、关键字查询(从多个列中做查询)
例如:查询商品名称中或者商品品牌中带有'中国'。
细节:AND的优先级高于OR
关键字查询的多列查询拼接sql
要记得使用()括起来
protected void addQuery(String condition, Object... param) {
this.conditions.add(condition);
this.parameters.addAll(Arrays.asList(param));
}
if (keyword != null) {
super.addQuery("(name LIKE ? OR dormBuildId LIKE ?)","%" + keyword + "%", "%" + keyword + "%");
}
作者:一乐乐