医药采购系统第2天02:用户查询列表的Oracle分页实现&用户添加和提交功能实现&springmvc的统一异常处理

如果想要获取相关的源码,笔记,和相关工具,,增加需求,代码重构,关注我并私信!!!


一 用户查询列表的分页实现

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

  1. 在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层来校验这些数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

elastic_solr

可以对需求进行二次开发

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值