jfinal 的sql模板中where子句的小技巧,不知道有没有人分享过

都知道,做数据库操作拼sql是个很磨人的工作,尤其是where,分享一点点小经验:


all.sql中引入book.sql

#namespace("book")
    #include("book.sql")
#end


book.sql中定义getByQuery,里面实现了where子句的拼接

#sql("getByQuery")
	select	b.*
		from t_book b   
			#set(isFirst=true)
			#if(nos)
				#(isFirst?"where":"and")
				#set(isFirst=false)
				b.no in ( #for(no : nos)
    						#para(no)
    						#if(!for.last) , #end
    					#end )
    		        #end
			#if(no)
				#(isFirst?"where":"and")
				#set(isFirst=false)
				b.no = #para(no)
			#end
			#if(catelog_no)
				#(isFirst?"where":"and")
				#set(isFirst=false)
				b.catelog_no = #para(catelog_no)
			#end
			#if(isbn)
				#(isFirst?"where":"and")
				#set(isFirst=false)
					b.isbn = #para(isbn)
			#end
			#if(userNo)
				#(isFirst?"where":"and")
				#set(isFirst=false)
					b.user_no = #para(userNo)
			#end
				order by create_time desc
#end


service中的方法query

	public MyResult query(
			Integer pageNumber, 
			Integer pageSize, 
			Book record){
		
		Kv kv = Kv.create();
		if (StrKit.notBlank(record.getNo())) {
			if (record.getNo().contains(",")) {
				kv.set("nos", record.getNo().split(","));
			} else {
				kv.set("no", record.getNo());
			}
		}
		if (StrKit.notBlank(record.getCatelogNo())) {
			kv.set("catelog_no", record.getCatelogNo());
		}
		if (StrKit.notBlank(record.getIsbn())) {
			kv.set("isbn", record.getIsbn());
		}
		if (StrKit.notBlank(record.getUserNo())) {
			kv.set("userNo", record.getUserNo());
		}

		SqlPara sqlPara = bookDao.getSqlPara("book.getByQuery", kv);
		Page<Book> resultPage = bookDao.paginate(pageNumber, pageSize, sqlPara);
		return MyResult.ok(resultPage);
	}


  • 重点1:4个参数no,catelogNo,isbn,userNo都是可选的,即使全都没有也没关系,那就成了全表查询

  • 重点2:no参数内容既可以是单个的id,比如“xxxx”;也可以是一个逗号分隔的ids,比如“xxx,yyy,zzz”


欢迎伙伴们点评。也请波总指教,看看还有没有可以调整或者优化的地方~


评论区

macaque

2017-12-25 09:41

where 后面加个 1=1多好 就不用判断是where 还是and了

l745230

2017-12-25 10:05

顶楼上,看你这用法又是java里拼sql,又是enjoy模板的,越做越复杂 1=1 搞定了

l745230

2017-12-25 10:13

http://www.jfinal.com/share/567 评论里贴不了图,可以看看这个,把demo跑一下,里面的#sql(queryList) 你想要的2个重点都实现了

suxiaoqiuking

2017-12-25 15:21

参考文档最新版的5.11.6 高级用法,要比你这个少写点代码

wumugulu

2017-12-25 16:42

@suxiaoqiuking 这个方法考虑过,但是如果有orderby参数的话又得麻烦了,呵呵

suxiaoqiuking

2017-12-25 19:23

@wumugulu 排序就更简单了

ddjfinal

2017-12-27 14:19

modal装载前台传递过来的查询参数,然后modal转map,然后写个公用的map,写个通用方法去除空值的key-value项,service里面不加任何空值和逻辑运算的判断,全部写在enjoy模板文件里面,多表关联查询的话,前台查询参数js组装成json,将sql逻辑运算也组装进json数据中,后台转换成map,将逻辑运算符和查询字段作为map的key,查询字段的值作为value,sql模板遍历下map即可,超级方便service里面基本没几行代码!

热门分享

扫码入社