模糊查询like用法实例(Bee)

article/2025/9/14 8:34:24

 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"); //likeLeftlist2 = 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"); //likeRightlist2 = 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"); //likeLeftRightlist2 = 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%"); //likeLeftlist2 = 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\\%"); //likeLeftlist2 = 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_"); //likeLeftlist2 = 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"); //likeLeftlist2 = 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 %  转义 \%是\\\u0025list2 = 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 %  转义 \%是\\\u0025list2 = suid.select(orders, condition);for (int i = 0; i < list2.size(); i++) {Logger.info(list2.get(i).toString());}//查询 userid=\u0025condition=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, ""); // likeLeftlist2 = 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); // likeLeftlist2 = 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"); // %nameMap<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}}

 


http://chatgpt.dhexx.cn/article/7b3ISW9D.shtml

相关文章

sql模糊查询 like

like 经常与where 字句和通配符在一块进行使用&#xff0c;表示像啥啥&#xff0c;模糊查询 通配符 主要是 _ 和 %   &#xff05; 百分号表示零个&#xff0c;一个或多个字符   _ 下划线表示单个字符 **注意&#xff1a;**1、 MS Access使用问号&#xff08;?&#xff09…

SQL中的模糊查询like

首先我们创建一个Person表。 create table Person(cname varchar2(50),cage number(3) );插入一些数据: insert into Person (cname,cage) values(张三,19); insert into Person (cname,cage) values(张三丰,20); insert into Person (cname,cage) values(张一,30); insert i…

使用关键字like进行模糊查询

【模糊查询】&#xff1a;使用关键字like [支持%或者下划线匹配&#xff0c;%匹配任意多个字符&#xff0c;一个下划线只匹配任意一个字符。] 实例&#xff1a; 查询名字中带有字母o的员工&#xff1a; select * from emp where ename like %o%; 找出名字以T结…

redis过期策略和持久化

Redis过期策略 注&#xff1a;本文主要参考自《Redis设计与实现》 1、设置过期时间 expire key time(以秒为单位)--这是最常用的方式setex(String key, int seconds, String value)--字符串独有的方式 具体的使用方式&#xff1a;查看"java企业项目开发实践"的第九章…

redis之十一(Redis 过期策略与源码分析)

在 Redis 中我们可以给一些元素设置过期时间&#xff0c;那当它过期之后 Redis 是如何处理这些过期键呢&#xff1f; 过期键执行流程 Redis 之所以能知道那些键值过期&#xff0c;是因为在 Redis 中维护了一个字典&#xff0c;存储了所有设置了过期时间的键值&#xff0c;我们…

Redis过期策略 实现原理

https://blog.csdn.net/xiangnan129/article/details/54928672 https://www.cnblogs.com/zhangchao-letv/p/6114030.html#undefined 1、redis设置过期时间&#xff1a; expire key time(以秒为单位)--这是最常用的方式 setex(String key, int seconds, String value)--字符串…

redis过期策略有哪些?内存淘汰机制有哪些?

文章目录 前言过期策略&#xff1a;定期删除惰性删除redis中的key和数据过期后&#xff0c;为什么内存空间还没有释放呢&#xff1f; 定期删除惰性删除 如果内存空间将要满的时候该怎么办呢&#xff1f;设置过期时间的key中所有的key中 小结 前言 小咸儿的项目中使用redis来做缓…

redis过期策略及持久化机制

文章目录 一、Redis设置过期时间二、Redis的过期策略1、定时过期2、惰性过期3、定期过期 三、Redis的8种内存淘汰策略LRU与LFU 四、Redis 的持久化机制1、RDB快照持久化&#xff08;redis默认&#xff09;2、AOF追加文件持久化3、AOF和RDB都开启 一、Redis设置过期时间 Redis有…

Redis过期删除策略和内存淘汰策略

目录 一、过期删除策略 1、如何设置过期时间&#xff1f; 2、如何判定 key 已过期了&#xff1f; 3、过期删除策略有哪些&#xff1f; 1、定时删除策略 2、惰性删除策略 3、定期删除策略 4、Redis 过期删除策略 5、Redis 是怎么实现定期删除 1、这个间隔检查的时间是…

Redis过期策略与淘汰策略

redis为什么这么快&#xff0c;原因之一就是Redis操作都是基于内存的&#xff0c;既然是基于内存的&#xff0c;而内存的大小是有限的&#xff0c;当内存不足或占用过高时&#xff0c;Redis会采用内存淘汰机制进行数据淘汰。 一、Redis的过期策略 Redis在设置缓存数据时指定了…

Redis过期策略及内存淘汰机制

redis中缓存的数据是有过期时间的&#xff0c;当缓存数据失效时&#xff0c;redis会删除过期时间以节省内存&#xff0c;那redis是如何删除过期数据的&#xff1f;删除过期数据的策略是什么&#xff1f;Redis过期策略是怎么样的&#xff1f; redis为什么这么快&#xff0c;原因…

Redis过期策略详解

为什么要有过期策略&#xff1f; 因为我们的redis是一个内存型数据库&#xff0c;我们的数据都是放在内存里面的!但是内存是有大小的! 比如&#xff0c;redis有个很重要的配置文件&#xff0c;redis.conf&#xff0c;里面有个配置 # maxmemory <bytes> //redis占用的最…

Redis过期策略以及内存淘汰机制

redis所以的操作都是基于内存的&#xff0c;而每台机器的内存大小都有限制&#xff0c;且全没有磁盘空间那么大&#xff0c;所以如何高效的使用内存对于redis来说是非常关键的。 一、Redis过期策略 如果我们一直往redis中存储数据的话&#xff0c;总会有占满内存的那一刻&…

redis过期策略和内存淘汰机制

Redis的过期策略 1 定时过期 每个设置过期时间的key都需要创建一个定时器&#xff0c;到过期时间就会立即清除。该策略可以立即清除过期的数据&#xff0c;对内存很友好&#xff1b;但是会占用大量的CPU资源去处理过期的数据&#xff0c;从而影响缓存的响应时间和吞吐量。 2…

Redis 过期策略+conf 记录

一&#xff1a;redis的过期策略 三种过期键删除策略 1&#xff09;定时删除&#xff1a;创建一个定时器&#xff0c;到时间立即执行删除操作&#xff08;对内存友好&#xff0c;因为能保证过期了立马删除&#xff0c;但是对cpu不友好&#xff09; 2&#xff09;惰性删除&…

Redis之过期策略

一、设置过期时间 Redis对存储值的过期处理实际上是针对该值的键&#xff08;key&#xff09;处理的&#xff0c;即时间的设置也是设置key的有效时间。Expires字典保存了所有键的过期时间&#xff0c;Expires也被称为过期字段。 expire key time(以秒为单位)--这是最常用的方式…

redis的过期策略【转】

转&#xff1a;Redis的过期策略以及内存淘汰机制_Felix-CSDN博客_redis过期策略和内存淘汰机制 我们知道&#xff0c;redis中缓存的数据是有过期时间的&#xff0c;当缓存数据失效时&#xff0c;redis会删除过期数据以节省内存&#xff0c;那redis是怎样删除过期数据的&#xf…

主成分分析;主成分回归分析——Hald水泥问题;主成分分析案例——各地区普通高等教育发展水平综合评价;matlab

目的 对原变量加以“改造”&#xff0c;在不致损失原变量太多信息的条件下尽可能地降低变量地维数&#xff0c;即用较少的“新变量”代替原来地各变量。通过变换&#xff1a;用低维&#xff08;主成分&#xff09;近似高维&#xff08;较全面&#xff09;信息。 思想 若有二维…

hadoopHA

一、HA介绍 HA(High Available), 高可用&#xff0c;是保证业务连续性的有效解决方案&#xff0c;一般有两个或两个以上的节点&#xff0c;分为活动节点&#xff08;Active&#xff09;及备用节点&#xff08;Standby&#xff09;。 hadoop2.x之后Clouera提出了QJM/Qurom Jou…

AIDL 和 HIDL

AIDL概述 aidl是常用的android IPC方式&#xff0c;本文将根据一个demo来解析下AIDL的原理。 为了便于读者理解&#xff0c;本文不会探究Binder的实现细节&#xff0c;可以认为Binder在此文的分析中被看做是一个“黑盒”。 有一定经验的读者可以直接到文末看总结&#xff0c;最…