动态:更新几篇工作中ligerUI的文章。
目的:记录、累积经验;既作自己收藏、同也分享大家。
归档:最近几篇博客全部归档在《LigerUI—工作随记》中,方便查阅哈
博客中不更新控件js使用,因为都用具体的教程demo和api。稍后上传博客中~
在此写一些工作中使用,在api中没有找到,或没有在明显地方。
今天核心:LigerUI中根据表单查询条件进行查询,使用表格Grid展示
其实原型如下:
我们原来做法是怎么样的呢?
第一:不用LigerUI。
思路:实现这个原型,要写两个方法。
初次打开,全部查询。queryAll()方法。其次:带参数的查询方法queryAll(params)
这样的话,三层中肯定需要再增加queryAll(params)这个方法,并且还必须写sql语句。
第二:使用LigerUI。
一种:采用类似原始的JSP做法。
其中第一种方法中,写两个方法,也许是最直白的思维,但是可以再仔细想想,queryAll()和queryAll(params)区别在哪?比如:select * from user; select * from user where id=? and name=?【当然,这个sql有点简单( ⊙ o ⊙ )】
仔细看看,其实第二个就比第一个多where查询而已。若用面向对象的思维来审视的话,“代码”大部分重复,就会有一种坏掉的味道。
代码重复,则会想到抽象;对于以上情况,则会想到合二为一。
呵呵,对于sql也是一样的。比如当传入的参数id和name不为null,则进行条件查询进行所谓第二个,否则进行第一个。
按照这种思路,则:
List queryUsers(params){
if (判断为null) 则select * from user;
else 则 select * from user where id=? and name=?
}
以上是针对一个需求而言的抽象,若对于整个系统而言,当然也可以抽象出此类方法:
思路如下:
既然要抽象整个系统的公共方法,那么sql语句肯定也有动态传入。
动态sql语句可以写在配置文件中,比如按照某种格式写sql配置。【以下的?是参数传入】
比如:select * from user where 1=1 { and id=? } {and name=?}
若id存在、name不存在:【id不存在、name存在】
select * from user where 1=1 and id=?【select * from user where 1=1 and name=?】
若id不存在、name不存在【都存在】
select * from user 【select * from user where 1=1 and id=? and name=?】
则1.sql截取到第一次带有{}
temp1=select * from user where 1=1
2.判断第一次遇到{}的,取对应的参数,是否为null,若为null,则游标进行前进,若不为null,则拼接此字符串
temp2=temp1+"and id=?"【temp2=select * from user where 1=1 and id=?】
3.继续向前。。。。类似第二步
这样,我们就可以按照格式,进行配置sql语句即可,然后按照约定进行传入参数了。
第二种:使用LigerUI自带固有的本领【where属性】。
where: f_getWhere()【其中f_getWhere是自定义函数】
//过滤属性 function f_getWhere(){ // alert(JSON.stringify(griddata)); if (!assrRelation) return null; var clause = function (rowdata, rowindex) { var dutyname=depart.getText(); //部门 var assrname=$("#assrname").val(); //考核人的姓名 var groupname=flag.getText(); //分组名称 return ( (rowdata.DUTYNAME.indexOf(dutyname) > -1) && (rowdata.EMPEREALNAME.indexOf(assrname) > -1) && (rowdata.GROUPNAME.indexOf(groupname) > -1)); }; return clause; }查询按钮的事件如下:
$("#submit").ligerButton({ click:function(){ assrRelation.options.data = $.extend(true, {}, griddata); assrRelation.loadData(f_getWhere()); } });这里面需要有个问题注意:
因为where属性本质是从后台全取,然后再从中进行属性筛选。
所以必须保证拿到data,其中代码中的griddata是第一次展示grid,保存下来的gridata
在客户端进行查询匹配。从后台取出所有的,然后再前台进行刷选。
总的来说,查询分为几类:【针对一个模块,比如用户查询模块】
1.一个模块,几个需求几个方法。【查询所有、根据用户ID查询、根据用户名称查询……】
2.一个模块,一个公共代码方法【if sql1 else sql2】
3.整个系统,提炼一个公共代码方法【见上文分析思想】
4.后台全拿过来,前台再筛【使用前端框架】
另外还有一种,后台框架具有特性,比如ibatis中:
根据自己固有的标签,来进行拼接sql,则不用自己封装公共方法【不用2、3】比如:
<dynamic>
<isNotNull property="name" prepend="AND"> name=#name#</isNotNull>
</dynamic>
至于使用哪种形式,因事制宜。。。。。