今日任务:条件查询+实现分页功能+部门表的增删改查
01:条件查询:
需求分析:条件查询是我们最基本的功能,在表查询的时候,一般都是需要的。
在做条件查询的时候,我们首先想到的是sql插叙你语句的拼接,这是最笨的方法,使用起来很不方便,所以我们一般做条件查询的时候,都采用离线查询的方式,QBC查询。从前台,使用属性驱动的方式传数据到后台。
关于条件查询的流程图如下:(解析:先从前端哪部分,我们采用的是属性驱动的方法,需要传到后台的数据命名都是属性的名,然后点击查询,就将数据传给后台,然后后台进行各层的调用,最后到Dao层,然后在Dao层进行数据处理,处理完了以后将数据返回给页面,返回的是JOSN字符串的格式,最后前台再去做数据处理,因为我们前端采用的是esayUI的技术,想要将数据渲成表格的形式,就需要得到的是JSON的格式。)
静态页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>部门管理</title>
<link rel="stylesheet" type="text/css" href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript">
var method="";
$(function(){
//使用数据表格的方式在页面上显示json格式的数据
$('#grid').datagrid({
url:'dep_getList',
striped:true,
//每次只能选中一行,默认为false
singleSelect:true,
//显示分页的工具栏
pagination:true,
columns:[[
{field:'uuid',title:'部门编号',width:100},
{field:'name',title:'部门名称',width:100},
{field:'tele',title:'部门联系电话',width:100,align:'right'},
{field:'-',title:'操作',width:150,align:'right',formatter: function(value,row,index){
var oper='<a href="javascript:void(0)" onclick="edit(' + row.uuid+ ')">修改</a>';
oper +=' ||<a href="javascript:void(0)" onclick="del(' + row.uuid+ ')">删除</a>';
return oper;
}
}
]],
toolbar: [{
text:'新增',
iconCls: 'icon-add',
handler: function(){
method="add";
$('#editDlg').dialog('open');
}
}]
});
$('#btnSearch').bind('click',function(){
//把表单数据转换成json对象
var formData= $('#searchForm').serializeJSON();
$('#grid').datagrid('load',formData);
// alert(JSON.stringify(formData));
/* 其实上边的load方法,就是加载下边ajax,下边我们给指定了一个url。而上边的没有指定url,就用原来的url。
$.ajax({
url:'dep_getList',
data:formData,
dataType:'json',
type:'post',
success:function(rtn){
//加载数据
//datagrid(参数1,参数2)是方法,里边有两个参数,参数一是我们的方法名称,
$('#grid').datagrid('loadData',rtn);
}
});
**/
});
$('#editDlg').dialog({
title: '部门编辑',
width: 300,
height: 200,
closed: true, //初始化窗口是否为关闭
modal: true
});
$('#btnSave').bind('click',function(){
var formData= $('#editForm').serializeJSON();
$.ajax({
url: 'dep_'+method,
data: formData,
dataType: 'json',
type: 'post',
success:function(rtn){
$.messager.alert("提示",rtn.message,'info',function(){
//如果成功就关闭窗口
$('#editDlg').dialog('close');
//还要刷新表单数据
$('#grid').datagrid('reload');
});
}
});
});
});
/**删除**/
function del(uuid){
$.messager.confirm("确认","确认要删除吗?",function(ok){
if(ok){
$.ajax({
url: 'dep_delete?id='+uuid,
dataType: 'json',
type: 'post',
success:function(rtn){
$.messager.alert("提示",rtn.message,'info',function(){
//还要刷新表单数据
$('#grid').datagrid('reload');
});
}
});
}
});
}
/**修改**/
function edit(uuid){
//弹出窗口
$('#editDlg').dialog('open');
//清空表单里边的内容
$('#editForm').form('clear');
method="update";
//加载数据
$('#editForm').form('load','dep_get?id='+uuid);
}
</script>
</head>
<body>
<div class="easyui-panel" style="padding-left:4px;border-bottom:0 px;">
<div style="height:2px;"></div>
<form id="searchForm">
<table>
<tr>
<td>部门名称</td>
<td><input name="dep1.name"></td>
</tr>
<tr>
<td>部门电话</td>
<td><input name="dep1.tele"></td>
</tr>
</table>
<button type="button" id="btnSearch">查询</button>
</form>
<div style="height:2px;"></div>
</div>
<table id="grid"></table>
<div id="editDlg">
<form id="editForm">
<table>
<tr>
<td>部门名称</td>
<td><input name="dep.name"><input type="hidden" name="dep.uuid"/></td>
</tr>
<tr>
<td>部门电话</td>
<td><input name="dep.tele"></td>
</tr>
</table>
<button type="button" id="btnSave">保存</button>
</form>
</div>
</body>
</html>
web层代码:
package com.angus.erp.action;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.alibaba.fastjson.JSON;
import com.angus.erp.biz.IDepBiz;
import com.angus.erp.entity.Dep;
/**
* 部门action
*
* @author DELL
*
*/
public class DepAction {
private IDepBiz depBiz;
public void setDepBiz(IDepBiz depBiz) {
this.depBiz = depBiz;
}
private Dep dep;
public Dep getDep() {
return dep;
}
public void setDep(Dep dep) {
this.dep = dep;
}
// 属性驱动:条件查询
private Dep dep1;
private Dep dep2;
private Object param;
public Dep getDep1() {
return dep1;
}
public void setDep1(Dep dep1) {
this.dep1 = dep1;
}
public Dep getDep2() {
return dep2;
}
public void setDep2(Dep dep2) {
this.dep2 = dep2;
}
public Object getParam() {
return param;
}
public void setParam(Object param) {
this.param = param;
}
//分页查询
private int page;//页码
private int rows;//每页的记录数
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
/**
* 查询所有部门的方法 并使用fastJson将查询到的数据转成json格式
*/
public void list() {
// 调用部门的业务查询所有的部门信息
List<Dep> list = depBiz.getList();
// 把部门列表转换成Json格式
String listString = JSON.toJSONString(list);
write(listString);
}
/** 部门表的条件查询 **/
public void getList() {
int firstResult=(page-1)*rows;
List<Dep> list = depBiz.getList(dep1,dep2,param,firstResult,rows);
long total=depBiz.getCount(dep1,dep2,param);
Map<String,Object> mapData=new HashMap<String,Object>();
mapData.put("total", total);
mapData.put("rows", list);
// 把部门列表转换成Json格式
String listString = JSON.toJSONString(mapData);
write(listString);
}
/**新增方法**/
public void add() {
//{"success":true,"message":""}
//返回前端的JSON数据
Map<String,Object> rtn=new HashMap<String,Object>();
try {
depBiz.add(dep);
ajaxReturn(true, "添加成功");
} catch (Exception e) {
e.printStackTrace();
ajaxReturn(false, "添加失败");
}
}
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
/**删除**/
public void delete() {
try {
depBiz.delete(id);
ajaxReturn(true, "删除成功");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
ajaxReturn(false, "删除失败");
}
}
/**根据编号查询用作数据回显**/
public void get() {
Dep dep=depBiz.get(id);
String jsonString=JSON.toJSONString(dep);
//{"name":"吃货部","tele":"1245","uuid":17}
String jsonStringAfter=mapData(jsonString,"dep");
write(jsonStringAfter);
}
/**修改部门数据**/
public void update() {
try {
depBiz.update(dep);
ajaxReturn(true, "修改成功");
} catch (Exception e) {
e.printStackTrace();
ajaxReturn(false, "修改失败");
}
}
/**这个方法的作用是在json字符串的key上加上前缀,方便我们的前天数据的回显**/
/** jsonString 是字符串 prefix 是前缀**/
public String mapData(String jsonString,String prefix ) {
Map<String,Object> map=JSON.parseObject(jsonString);
//存储加上前缀的Key值
Map<String,Object> dataMap=new HashMap<String,Object>();
//给每个Key值加上前缀
for(String key : map.keySet()) {
dataMap.put(prefix+"."+key, map.get(key));
}
return JSON.toJSONString(dataMap);
}
/**相同代码的抽取**/
public void write(String jsonString) {
try {
// 相应对象
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
// 将json格式的数据输出给页面
response.getWriter().write(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
}
/**相同代码的抽取,向页面写数据**/
public void ajaxReturn(boolean success,String message) {
Map<String,Object> rtn=new HashMap<String,Object>();
rtn.put("success", success);
rtn.put("message", message);
write(JSON.toJSONString(rtn));
}
}
业务层代码:
package com.angus.erp.biz.impl;
/**
* 查询所有部门的实现类
*/
import java.util.List;
import com.angus.erp.biz.IDepBiz;
import com.angus.erp.dao.IDepDao;
import com.angus.erp.entity.Dep;
public class DepBiz implements IDepBiz {
private IDepDao depDao;
public void setDepDao(IDepDao depDao) {
this.depDao = depDao;
}
@Override
public List<Dep> getList() {
return depDao.getList();
}
/**分页查询**/
@Override
public List<Dep> getList(Dep dep1,Dep dep2,Object param,int firstResult,int maxResults) {
return depDao.getList(dep1,dep2,param, firstResult, maxResults);
}
/**总记录数**/
@Override
public long getCount(Dep dep1,Dep dep2,Object param) {
return depDao.getCount(dep1,dep2,param);
}
/**新增**/
@Override
public void add(Dep dep) {
depDao.add(dep);
}
/**删除**/
@Override
public void delete(Long uuid) {
depDao.delete(uuid);
}
/**根据编号查询用作修改的数据回显**/
@Override
public Dep get(Long uuid) {
return depDao.get(uuid);
}
/**更新部门数据**/
@Override
public void update(Dep dep) {
depDao.update(dep);
}
}
dao层代码:
package com.angus.erp.dao.impl;
/**
* 部门数据访问
*/
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.angus.erp.dao.IDepDao;
import com.angus.erp.entity.Dep;
public class DepDao extends HibernateDaoSupport implements IDepDao {
/** 查询出所有的部门信息**/
@Override
public List<Dep> getList() {
return (List<Dep>) this.getHibernateTemplate().find("from Dep");
}
@Override
/**部门表的条查询**/
public List<Dep> getList(Dep dep1,Dep dep2,Object param,int firstResult,int maxResults) {
DetachedCriteria dc=getDetachedCriteriaDep(dep1);
return (List<Dep>) this.getHibernateTemplate().findByCriteria(dc,firstResult,maxResults);
}
/**查询部门表的总的数据数得到count**/
@Override
public long getCount(Dep dep1,Dep dep2,Object param) {
DetachedCriteria dc=getDetachedCriteriaDep(dep1);
dc.setProjection(Projections.rowCount());
List<Long> list=(List<Long>)getHibernateTemplate().findByCriteria(dc);
return list.get(0);
}
/**关于查询时的相同代码的抽取**/
private DetachedCriteria getDetachedCriteriaDep(Dep dep1) {
DetachedCriteria dc=DetachedCriteria.forClass(Dep.class);
if(null!=dep1) {
//判断是否输入了部门名称,并且判断去掉空格以后的长度大于0
if(null!=dep1.getName()&&dep1.getName().trim().length()>0) {
//MatchMode.ANYWHERE 相当于是 % %
//MatchMode.END 相当于是 % name 以什么什么结尾的模糊查询
//MatchMode.START 相当于是以什么开始的迷糊查询
dc.add(Restrictions.like("name", dep1.getName(),MatchMode.ANYWHERE));
}
//判断输入的部门电话是否为空
if(null!=dep1.getTele()&&dep1.getTele().trim().length()>0) {
dc.add(Restrictions.like("tele", dep1.getTele(),MatchMode.ANYWHERE));
}
}
return dc;
}
@Override
public void add(Dep dep) {
this.getHibernateTemplate().save(dep);
}
/**删除的方法**/
@Override
public void delete(Long uuid) {
//让对象进入持久化状态
Dep dep=this.getHibernateTemplate().get(Dep.class, uuid);
getHibernateTemplate().delete(dep);
}
/**通过编号进行修改**/
@Override
public Dep get(Long uuid) {
return getHibernateTemplate().get(Dep.class, uuid);
}
/**更新部门数据**/
@Override
public void update(Dep dep) {
this.getHibernateTemplate().update(dep);
}
}
第一天知识点总结: