当前位置:网站首页>模糊查询like用法实例(Bee)
模糊查询like用法实例(Bee)
2022-08-02 20:29:00 【abckingaa】
like通过两个匹配符%和_进行模糊查询.
%: 匹配任意个任意字符
_: 匹配一个字符
以下以userid为例, 在数据库中的值如下图所示:

V1.11及之前版本, 使用Op.like, 需要判断值是否为空字段,是否只含有匹配符(%和_)
Op.like可以创建比左右匹配更复杂的模糊查询,但需要防止,最终的值只包含有匹配符(%和_)
在V1.17( 1.17.0.9) 中,能明确%使用在左还是右,还是同时使用在左右, 则应该选用:likeLeft,likeRight,likeLeftRight;
Bee框架会对这三种用法的值进行转义(匹配符%,由框架添加), 转义后值中的%(如果有),只代表符号%.
where 条件中,不建议只使用not like一个过滤条件(结合其它条件使用则可以)
public class LikeTest {
public static void main(String[] args) {
test();
}
public static void test() {
try{
Suid suid = BeeFactory.getHoneyFactory().getSuid();
Orders orders = new Orders();
Condition condition=BF.getCondition();
// condition
.op("1=1 -- userid", Op.like, "bee%") // test invalid field
.op("userid", Op.like, "bee%") //模糊查询
// .op("userid", Op.like, "%") //模糊查询 只有%或_, 从1.17开始,Bee会抛出异常.
.op("userid", Op.like, "_")
.op("userid", Op.like, "")
使用Op.like,调用方需要对传入的字符进行过滤,特别是1.17之前的版本.
// ;
List<Orders> list2 =null;
list2=suid.select(orders, condition);
// for (int i = 0; i < list2.size(); i++) {
// Logger.info(list2.get(i).toString());
// }
condition=BF.getCondition();
condition.op("userid", Op.like, "test\\%"); //userid是test%
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.like, "test%"); //test开头的
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.like, "test_"); //test开头有5个字符的
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.like, "test\\_"); //userid是test_
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeLeft, "test"); //likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeRight, "test"); //likeRight
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeLeftRight, "test"); //likeLeftRight
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeLeft, "test%"); //likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
// condition=BF.getCondition();
// condition.op("userid", Op.likeLeft, ""); //likeLeft
// list2 = suid.select(orders, condition);
// for (int i = 0; i < list2.size(); i++) {
// Logger.info(list2.get(i).toString());
// }
// condition=BF.getCondition();
// condition.op("userid", Op.likeLeft, null); //likeLeft
// list2 = suid.select(orders, condition);
// for (int i = 0; i < list2.size(); i++) {
// Logger.info(list2.get(i).toString());
// }
condition=BF.getCondition();
condition.op("userid", Op.likeLeft, "test\\%"); //likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeLeft, "test_"); //likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeLeft, "test\\u0025"); //likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2");
condition=BF.getCondition();
condition.op("userid", Op.like, "\\\u0025\\\u0025"); //like \u0025 is % 转义 \%是\\\u0025
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
condition=BF.getCondition();
condition.op("userid", Op.likeLeft, "\\\u0025"); //like \u0025 is % 转义 \%是\\\u0025
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
//查询 userid=\u0025
condition=BF.getCondition();
condition.op("userid", Op.like, "\\\\u0025"); //like \u0025 is %
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
}catch (Exception e) {
Logger.error("In ConditionExam (Exception):"+e.getMessage());
e.printStackTrace();
}
}
}like需要防止是否会受到攻击,而暴露整个表的数据.
where 条件中,不建议只使用not like一个过滤条件(结合其它条件使用则可以)
最终的值只包含有匹配符(%和_)
/**
* V1.11及之前版本, 使用Op.like, 需要判断值是否为空字段,是否只含有匹配符(%和_)
* <br>Op.like可以创建比左右匹配更复杂的模糊查询,但需要防止,最终的值只包含有匹配符(%和_)
* <br>在V1.17( 1.17.0.9) 中,能明确%使用在左还是右,还是同时使用在左右, 则应该选用:likeLeft,likeRight,likeLeftRight
* <br>where 条件中,不建议只使用not like一个过滤条件(结合其它条件使用则可以)
* @author Kingstar
* @since 1.17
*/
public class LikeEnhanceTest {
private static PreparedSql preparedSql = BF.getPreparedSql();
private static Suid suid = BF.getSuid();
public static void main(String[] args) {
try {
Map<String, Object> map = new HashMap<>();
map.put("name", "");
selectNoPage(CustomSql.getCustomSql("example.autosql.like.isNotNull"), map);
// example.autosql.like.isNotNull=select * from orders where <if isNotNull>name like #{%name}</if>
// name的值非null,会保留<if isNotNull></if>之前的内容,但name的值为空字符,会有注入风险,所以报错.
} catch (Exception e) {
e.printStackTrace();
}
Condition condition = null;
List<Orders> list2 = null;
Orders orders = new Orders();
try {
condition = BF.getCondition();
condition
// .op("1=1 -- userid", Op.like, "bee%") // test invalid field
// .op("userid", Op.like, "bee%") //模糊查询
.op("userid", Op.like, "%") // 模糊查询 只有%或_, 从1.17开始,Bee会抛出异常.
// .op("userid", Op.like, "_")
// .op("userid", Op.like, "")
// 使用Op.like,调用方需要对传入的字符进行过滤,特别是1.17之前的版本.
;
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
condition = BF.getCondition();
condition.op("userid", Op.like, "\u0025"); // like \u0025 is %
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
condition = BF.getCondition();
condition.op("userid", Op.like, "\u005f"); // like \u005f is _
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
condition = BF.getCondition();
condition.op("userid", Op.like, "\u0025\u0025"); // like \u0025 is %
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
condition = BF.getCondition();
condition.op("userid", Op.likeLeft, ""); // likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
try {
condition = BF.getCondition();
condition.op("userid", Op.likeLeft, null); // likeLeft
list2 = suid.select(orders, condition);
for (int i = 0; i < list2.size(); i++) {
Logger.info(list2.get(i).toString());
}
} catch (Exception e) {
e.printStackTrace();
}
// PreparedSqlExam.java
PreparedSql preparedSql = BF.getPreparedSql();
String sql3_2 = CustomSql
.getCustomSql("osql.example.entity.selectOrdersLikeNameViaMap2"); // %name
Map<String, Object> map2 = new HashMap<>();
// map2.put("name", "Bee");
// map2.put("name", ""); //1.17之前的版本,需要判断传入的值不能为空字符,%,_.
// case "%"
try {
map2.put("name", "%");
// map2.put("name", "_");
// map2.put("name", null);
preparedSql.select(sql3_2, new Orders(), map2);// map
} catch (Exception e) {
e.printStackTrace();
}
// case ""
try {
map2 = new HashMap<>();
map2.put("name", ""); // 1.17之前的版本,需要判断传入的值不能为空字符,%,_.
preparedSql.select(sql3_2, new Orders(), map2);// map
} catch (Exception e) {
e.printStackTrace();
}
// case "_"
try {
map2 = new HashMap<>();
map2.put("name", "_"); // 1.17之前的版本,需要判断传入的值不能为空字符,%,_.
preparedSql.select(sql3_2, new Orders(), map2);// map
} catch (Exception e) {
e.printStackTrace();
}
// case null
//[WARN] the parameter value in like is null !
try {
map2 = new HashMap<>();
map2.put("name", null); // 1.17之前的版本,需要判断传入的值不能为空字符,%,_.
preparedSql.select(sql3_2, new Orders(), map2);// map
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("finished!");
}
private static void selectNoPage(String sql, Map<String, Object> map) {
List<Orders> list3 = preparedSql.select(sql, new Orders(), map);// map
}
}
边栏推荐
- 【数据分析】:什么是数据分析?
- Flink Yarn Per Job - 启动AM
- 封装和包、访问修饰权限
- 框架设计:PC 端单页多页框架如何设计与落地
- Informatics Olympiad All-in-One (1260: [Example 9.4] Intercepting Missiles (Noip1999))
- C primer plus学习笔记 —— 9、联合&枚举&typdef
- APP自动化uiautomator2获取toast
- Xcode13.1 run engineering error fatal error: 'IFlyMSC/IFly h' file not found
- Bena的生命周期
- YOLOv5+BiSeNet——同时进行目标检测和语义分割
猜你喜欢

奥特学园ROS笔记--7(289-325节)

iframe------------frame-

Informatics orsay a tong (1258: 【 9.2 】 digital pyramid)

vscode如何能将输出从OUTPUT改为TERMINAL或者DebugConsole

Digital twins help visualize the construction of smart cities

Flink Yarn Per Job - 启动AM

【SLAM】DM-VIO(ros版)安装和论文解读

Qt提升自定义控件,找不到头文件

信息学奥赛一本通(1259:【例9.3】求最长不下降序列)

TodoList案例
随机推荐
56.【全局变量和局部变量专题】
ORB SLAM3加载Vocabulary更快ORBvoc.bin
【实战 已完结】WPF开发自动化生产管理平台
C#异步和多线程
Thread线程类基本使用(下)
如何使用windbg查看C#某个线程的栈大小 ?
Flink Yarn Per Job - 创建启动Dispatcher RM JobManager
"A daily practice, happy water problem" 1374. Generate a string with an odd number of each character
ALV concept explanation
信息学奥赛一本通(1258:【例9.2】数字金字塔)
Qt提升自定义控件,找不到头文件
引用类型 ,值类型 ,小坑。
拥抱Cmake小朋友 简单又实用,但是不灵活
接口测试常用工具及测试方法(入门篇)
五大维度解读软件测试分类
并发与并行
14、学习MySQL 连接的使用
有效解决MySQL报错:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO/YES)
EasyExcel dynamic parsing and save table columns
Jar包启动通过ClassPathResource获取不到文件路径问题