都知道,做数据库操作拼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”
欢迎伙伴们点评。也请波总指教,看看还有没有可以调整或者优化的地方~