如果想要获取相关的源码,笔记,和相关工具,,增加需求,代码重构,关注我并私信!!!
一 用户查询列表的分页实现
1 dao
1.1 技术分析:oracle的分页sql语句之rownum的使用
Oracle中的分页sql语句,比如:显示的第20条到第30条的记录,我们要实现的是一个可以共用的sql分页语句。
(因为该项目的其他需求中都需要用到分页)步骤如下:
第1步:先取出前30条记录,如下:
第2步:取出20到30的记录条数,如下:
第3步:扩展它,还是取出20到30的记录条数,如下:
第4步:再扩展,最终的sql语句如下:
---oracle分页 select page_2.* from (select page_1.*, rownum page_num from (
--这里可以填入任意查询的sql,包括之前用到的用户条件查询的sql语句也可以放在此位置,这样就可以根据条件来查询 select * from sysuser
) page_1 where rownum <= 30 ) page_2 where page_2.page_num >= 20 |
该分页语句只是在pl/sql下可以调试通过,还不能作为mapper.xml映射文件中的sql分页语句,因为起始下标(20)和结束下标(30)都写死了,解决方法参考下节所介绍的工具类----->PageQuery。
1.2 工具类PageQuery的使用
因为Oracle的分页sql中需要起始下标和结束下标,因此,需要当前页码、每页显示数量(固定的)、总条数(总条数就是符合查询条件的记录数)这3个参数来确定sql语句的起始下标和结束下标。
使用系统提供的一个工具类PageQuery.java来计算起始和结束的下标,复制该类到如下所示的目录中:
PageQuery.java对象如何使用呢?
使用New来构造pageQuery对象,调用该对象的setPageParams()方法,该方法中需要传入infoCount总记录数、pageSize每页 显示数量、currPage当前页码这3个形参后,pageQuery对象中的属性PageQuery_start和PageQuery_end就会
自动计算 出起始和结束的下标。(参考下面的“action”中的实现)
因此,如果想将PageQuery对象传入mybatis,就需要将此对象作为包装类SysuserQueryVo的属性即可,修改后如图:
并提供该pageQuery属性的set和get()方法。
1.3 修改mapper.xml
- 在SysuserMapperCustom.xml中需要完成两件事:
第一:修改用户查询的sql语句,要为该sql语句添加分页语句(分别添加分页的头和分页的尾的sql语句)。
第二:在该映射文件中添加符合查询条件的总记录数的sql语句的statement。
SysuserMapperCustom.xml的内容如下:字体颜色加深的部分为添加的内容
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="yycg.base.dao.mapper.SysuserMapperCustom">
<!-- sql片段 : 用户查询条件. 通常情况,为了提高 sql片段可重用性,按单表创建sql片段 --> <sql id="query_sysuser_where"> <if test="sysuserCustom!=null"> <if test="sysuserCustom.userid!=null and sysuserCustom.userid!=''"> and sysuser.userid = #{sysuserCustom.userid} </if> <if test="sysuserCustom.username!=null and sysuserCustom.username!=''"> and sysuser.username = #{sysuserCustom.username} </if> <if test="sysuserCustom.sysmc!=null and sysuserCustom.sysmc!=''"> and sysuser.sysmc like '%${sysuserCustom.sysmc}%' </if> <if test="sysuserCustom.groupid!=null and sysuserCustom.groupid!=''"> and sysuser.groupid = #{sysuserCustom.groupid} </if> </if> </sql> <!-- 用户查询 --> <select id="findSysuserList" parameterType="yycg.base.pojo.vo.SysuserQueryVo" resultType="yycg.base.pojo.vo.SysuserCustom"> <!-- 添加分页的头. pageQuery是包装类SysuserQueryVo中的属性--> <if test="pageQuery!=null"> select page_2.* from (select page_1.*, rownum page_num from ( </if> select * from ( select SYSUSER.id, SYSUSER.userid, SYSUSER.username, SYSUSER.groupid, sysuser.USERSTATE, SYSUSER.sysid, decode(SYSUSER.Groupid, '1', (select mc from userjd where id = sysuser.sysid), '2', (select mc from userjd where id = sysuser.sysid), '3', (select mc from useryy where id = sysuser.sysid), '4', (select mc from usergys where id = sysuser.sysid) ) sysmc from SYSUSER )sysuser <where> <include refid="query_sysuser_where" /> </where> ) page_1 <!-- 添加分页的尾 --> <if test="pageQuery!=null"> <!-- CDATA转义字符 --> <![CDATA[ where rownum <= ${pageQuery.PageQuery_end}) page_2 ]]> where page_2.page_num >= ${pageQuery.PageQuery_start} </if> </select> <!-- 查询符合条件的列表的总记录数 .该sql语句只需要添加count(*)即可,其他的复制上面的sql语句!--> <select id="findSysuserCount" parameterType="yycg.base.pojo.vo.SysuserQueryVo" resultType="int"> select count(*) from ( select SYSUSER.id, SYSUSER.userid, SYSUSER.username, SYSUSER.groupid, sysuser.USERSTATE, SYSUSER.sysid, decode(SYSUSER.Groupid, '1', (select mc from userjd where id = sysuser.sysid), '2', (select mc from userjd where id = sysuser.sysid), '3', (select mc from useryy where id = sysuser.sysid), '4', (select mc from usergys where id = sysuser.sysid) ) sysmc from SYSUSER )sysuser <where> <include refid="query_sysuser_where" /> </where> </select> </mapper> |
1.4 在mapper接口中添加方法
Dao层的最后一步是在mapper接口中添加计算符合查询条件的总记录数的方法findSysuerCount(SysuserQueryVo sysuserQueryVo),如图:
2 service
3 action
Action中就需要准备好分页的数据来传到客户端页面!!
当点击查询页面queryuser.jsp页面中的分页按钮(即显示列表的小箭头)时,Datagrid会固定的向后台的UserAction中传递两个分页参数page(当前页页码)和rows(每页显示记录数),这是由datagrid的特性所决定的,如图:
这两个参数分别表示:page是当前页码和rows是每页显示行数。关于这两个参数的使用可以参考“lucence文档中的easyui的datagrid组件的用法”。
UserAction.java中需要修改queryuser_result()方法,在该方法中添加如下的源码:颜色加深部分为添加的代码
............................................ //用户查询页面的结果集,并将结果集转换成Json所要求的格式。 //DataGridResultInfo类通过@ResponseBody将java对象转成json @RequestMapping("/queryuser_result") public @ResponseBody DataGridResultInfo queryuser_result( SysuserQueryVo sysuserQueryVo, //page是当前页的页码,它接收从queryuer.jsp页面中的datagrid组件所传递过来的page参数. int page, //rows表示每页显示的条数,它接收从queryuer.jsp页面中的datagrid组件所传递过来的rows参数 int rows )throws Exception{ //为了代码的严谨,需要非空校验. sysuserQueryVo = sysuserQueryVo!=null?sysuserQueryVo:new SysuserQueryVo(); //查询列表的总数 int total = userService.findSysuserCount(sysuserQueryVo); //准备数据 PageQuery pageQuery = new PageQuery(); //设置总记录数tatol,每页显示记录数rows,当前页码page.setPageParams()方法会自动的计算出起始和结束的下标 pageQuery.setPageParams(total, rows, page); //填充数据 sysuserQueryVo.setPageQuery(pageQuery); //分页查询,向sysuserQueryVo中传入pageQuery List<SysuserCustom> list = userService.findSysuserList(sysuserQueryVo); DataGridResultInfo dataGridResultInfo = new DataGridResultInfo(); //填充 total dataGridResultInfo.setTotal(total); //填充 rows dataGridResultInfo.setRows(list); return dataGridResultInfo; } ......................................... |
该方法中充满了大量的模板代码,非要实用,后面的大部分功能实现都需要此模板方法!!!
关于queryuser.jsp的页面的部分不用任何改动,需要注意的是在预计加载的方法中设置的datagrid的分页条数,如下:
这里设置15条,30条,50条。pageList属性的作用请参考easyui的相关文档。
4 调试
二 用户添加和提交功能实现
1 需求
1.1原型系统的操作流程
登录原型系统(原型系统是指功能已经全部开发好了)的页面,操作如下:
使用荥(xing)阳市卫生局身份来登录系统,用户名:xyswsj 密码:111111
再次说明:用户管理模块是卫生局才有的功能,其他的角色(卫生院、卫生室和供应商)则没有!因此,必须使用卫生局来登录系统----->因为权限管理模块还没有讲解,因此这里需要记住使用该模块的角色是谁!
然后,操作如下:
在弹出的“添加医院信息”窗口中添加用户的信息,包括:
用户账号(输入)、用户名称(输入)、用户密码(输入)、用户类型(选择下拉)、用户单位名称(输入)、用户状态(单选),其中的用户类型有如下几个选项:
1.2 约束条件
1) 添加用户的前置条件(操作约束):
1. 用户账号不允许重复。
2. 当用户选择用户类型下拉列表框中的选项后,用户输入的单位名称必须存在于对应的单位表,所以,需要根据用户类型来判断用 户所属的单位。如下图:
例如:选择了卫生局或者卫生院,那么这两个选项必须存在于userjd(用户监督)表中。
3. 以及输入的数据合法性的校验。
当然,在action层也可以实现这些校验。但是如果有人自己编写软件绕过action层的校验的话就很可怕了,例如:刷票软件。所有还是有必要在service层来校验这些数据