九、条件查询
(一)条件查询分析:动态组合条件查询
1、伪代码分析
if(如果输入部门名称){
过滤部门名称
}
if(如果输入部门电话){
过滤部门电话
}
动态组合条件查询。表格上有查询表单,输入部门名称,部门电话进行条件查询,如果同时输入条件侧全部进行查询
HQL编写伪代码
(二)后端代码的编写
1、在erp_dao下的IDepDao当中创建接口
package com.itzheng.erp.dao;
import java.util.List;
import com.itzheng.erp.entity.Dep;
public interface IDepDao {
public List<Dep> getList();
List<Dep> getList(Dep dep1);
}
2、在DepDao实现类当中
package com.itzheng.erp.dao.impl;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.itzheng.erp.dao.IDepDao;
import com.itzheng.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) {
DetachedCriteria dc = DetachedCriteria.forClass(Dep.class);// 条件,如果满足下面的判断就,添加相应的条件
if (null != dep1) {
// 判断传入Dep的条件是否为空
// 是否输入部门名称
if (null != dep1.getName() && dep1.getName().trim().length() > 0) {
// 判断名称不为空的情况下
// MatchMode.ANYWHERE => % %
// MatchMode.END => %name
// MatchMode.START => name%
// 如果输入了部门名称
dc.add(Restrictions.like("name", dep1.getName(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
// 是否输入了部门的电话
if (null != dep1) {
// 是否输入部门名称
if (null != dep1.getTele() && dep1.getTele().trim().length() > 0) {
// 不为空的情况下
dc.add(Restrictions.like("tele", dep1.getTele(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
return (List<Dep>) this.getHibernateTemplate().findByCriteria(dc);// 添加条件之后再进行查询
}
}
3、在erp_biz下的IDepBiz当中创建接口
package com.itzheng.erp.biz;
import java.util.List;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务接口
*/
public interface IDepBiz {
/*
* 查询所有部门列表
*/
List<Dep> getList();
/*
* 条件查询
*/
List<Dep> getList(Dep dep1);
}
4、DepBiz当中实现对应的接口的内容
package com.itzheng.erp.biz.impl;
import java.util.List;
import com.itzheng.erp.biz.IDepBiz;
import com.itzheng.erp.dao.IDepDao;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务实现
*/
public class DepBiz implements IDepBiz {
/*
* 数据访问层的调用
*/
private IDepDao depDao;
public void setDepDao(IDepDao depDao) {
this.depDao = depDao;
}
@Override
public List<Dep> getList() {
// TODO Auto-generated method stub
return depDao.getList();
}
@Override
public List<Dep> getList(Dep dep1) {
// TODO Auto-generated method stub
return depDao.getList(dep1);
}
}
5、在erp_web下的DeptAction当中
package com.itzheng.erp.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.alibaba.fastjson.JSON;
import com.itzheng.erp.biz.IDepBiz;
import com.itzheng.erp.entity.Dep;
/*
* 部门Action
*/
public class DeptAction {
private IDepBiz depBiz;
public void setDepBiz(IDepBiz depBiz) {
this.depBiz = depBiz;
}
// 属性驱动:条件查询
private Dep dep1;
public Dep getDep1() {
return dep1;
}
public void setDep1(Dep dep1) {
this.dep1 = dep1;
}
//条件查询
public void getList() {
List<Dep> list = depBiz.getList(dep1);
// 把部门列表转换为JSON字符串
String listString = JSON.toJSONString(list);
try {
// 响应对象
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
// 输出给页面
response.getWriter().write(listString);
System.out.println(listString);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 查询所有部门
*/
public void list() {
/*
* 调用业务部门的业务,查询所有部门信息
*/
List<Dep> list = depBiz.getList();
// 把部门列表转换为JSON字符串
String listString = JSON.toJSONString(list);
try {
// 响应对象
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
// 输出给页面
response.getWriter().write(listString);
System.out.println(listString);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
6、测试运行发现错误,编码格式有错误,需要在Maven当中自带的Tomcat当中设置编码格式
再次运行模糊查询匹配成功
(三)前端代码的编写
复制到ui文件下
1、在webapp下的webapp下面的dep.html当中
在dep.html当中先引入上面的js然后编写前端代码
全部代码
<!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">
$(function() {
$('#grid').datagrid({
url : 'dep_getList',
columns : [ [ {
field : 'uuid',
title : '部门编号',
width : 100
}, {
field : 'name',
title : '部门名称',
width : 100
}, {
field : 'tele',
title : '部门联系电话',
width : 100,
align : 'right'
} ] ]
});
$('#btnSearch').bind('click', function() {
//$('#searchForm').serializeJSON();把表单数据转换成为JSON对象
var formData = $('#searchForm').serializeJSON();
$('#grid').datagrid('loadData', formData);
});
});
</script>
</head>
<body>
<div class="easyui-panel"
style="padding-left: 4px; border-bottom: 0px;">
<div style="height: 2px;"></div>
<form id="searchForm">
<table>
<tr>
<td>部门名称</td>
<td><input name="dep1.name"></td>
<td>部门电话</td>
<td><input name="dep1.tele"></td>
<td><button id="btnSearch" type="button">查询</button></td>
</tr>
</table>
</form>
<div style="height: 2px;"></div>
</div>
<table id="grid">
</table>
</body>
</html>
2、运行测试
条件查询成功
十、分页查询
1、在erp_web下的 applicationContext_action.xml当中的修改为多例模式
2、在DeptAction当中设置接收页码和行数对应的值,生成set和get方法
3、修改dao层当中getList方法
4、修改dao接口
package com.itzheng.erp.dao;
import java.util.List;
import com.itzheng.erp.entity.Dep;
public interface IDepDao {
public List<Dep> getList();
/*
* 条件查询 查询所有部门信息
*/
List<Dep> getList(Dep dep1, int firstResult, int maxResults);
}
5、修改erp_biz当中对应的接口和实现类
package com.itzheng.erp.biz;
import java.util.List;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务接口
*/
public interface IDepBiz {
/*
* 查询所有部门列表
*/
List<Dep> getList();
/*
* 条件查询
*/
List<Dep> getList(Dep dep1, int firstResult, int maxResults);
}
package com.itzheng.erp.biz.impl;
import java.util.List;
import com.itzheng.erp.biz.IDepBiz;
import com.itzheng.erp.dao.IDepDao;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务实现
*/
public class DepBiz implements IDepBiz {
/*
* 数据访问层的调用
*/
private IDepDao depDao;
public void setDepDao(IDepDao depDao) {
this.depDao = depDao;
}
@Override
public List<Dep> getList() {
// TODO Auto-generated method stub
return depDao.getList();
}
@Override
public List<Dep> getList(Dep dep1, int firstResult, int maxResults) {
// TODO Auto-generated method stub
return depDao.getList(dep1, firstResult, maxResults);
}
}
6、修改DeptAction
7、修改IDepDao接口当中的内容
8、修改DepDao
@Override
public long getCount(Dep dep1) {
/*
* 记录条件查询的记录数
*/
DetachedCriteria dc = DetachedCriteria.forClass(Dep.class);// 条件,如果满足下面的判断就,添加相应的条件
if (null != dep1) {
// 判断传入Dep的条件是否为空
// 是否输入部门名称
if (null != dep1.getName() && dep1.getName().trim().length() > 0) {
// 判断名称不为空的情况下
// MatchMode.ANYWHERE => % %
// MatchMode.END => %name
// MatchMode.START => name%
// 如果输入了部门名称
dc.add(Restrictions.like("name", dep1.getName(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
// 是否输入了部门的电话
if (null != dep1) {
// 是否输入部门名称
if (null != dep1.getTele() && dep1.getTele().trim().length() > 0) {
// 不为空的情况下
dc.add(Restrictions.like("tele", dep1.getTele(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
dc.setProjection(Projections.rowCount());
return (long) getHibernateTemplate().findByCriteria(dc).get(0);
}
9、DepDao当中创建方法
@Override
public long getCount(Dep dep1) {
/*
* 记录条件查询的记录数
*/
DetachedCriteria dc = DetachedCriteria.forClass(Dep.class);// 条件,如果满足下面的判断就,添加相应的条件
if (null != dep1) {
// 判断传入Dep的条件是否为空
// 是否输入部门名称
if (null != dep1.getName() && dep1.getName().trim().length() > 0) {
// 判断名称不为空的情况下
// MatchMode.ANYWHERE => % %
// MatchMode.END => %name
// MatchMode.START => name%
// 如果输入了部门名称
dc.add(Restrictions.like("name", dep1.getName(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
// 是否输入了部门的电话
if (null != dep1) {
// 是否输入部门名称
if (null != dep1.getTele() && dep1.getTele().trim().length() > 0) {
// 不为空的情况下
dc.add(Restrictions.like("tele", dep1.getTele(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
dc.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
return list.get(0);
}
10、在erp_dao当中的DepDao当中创建接口
对应接口的实现类当中DepDao
@Override
public long getCount(Dep dep1) {
/*
* 记录条件查询的记录数
*/
DetachedCriteria dc = DetachedCriteria.forClass(Dep.class);// 条件,如果满足下面的判断就,添加相应的条件
if (null != dep1) {
// 判断传入Dep的条件是否为空
// 是否输入部门名称
if (null != dep1.getName() && dep1.getName().trim().length() > 0) {
// 判断名称不为空的情况下
// MatchMode.ANYWHERE => % %
// MatchMode.END => %name
// MatchMode.START => name%
// 如果输入了部门名称
dc.add(Restrictions.like("name", dep1.getName(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
// 是否输入了部门的电话
if (null != dep1) {
// 是否输入部门名称
if (null != dep1.getTele() && dep1.getTele().trim().length() > 0) {
// 不为空的情况下
dc.add(Restrictions.like("tele", dep1.getTele(), MatchMode.ANYWHERE));// 通过模糊查询
}
}
dc.setProjection(Projections.rowCount());
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
return list.get(0);
}
11、在DepBiz当中的(Dep dep1)
12、DepAction当中
// 条件查询
public void getList() {
System.out.println("页码:" + page + "记录数:" + rows);
int firstResult = (page - 1) * rows;
List<Dep> list = depBiz.getList(dep1, firstResult, rows);
long total = depBiz.getCount(dep1);// 查询数据的条数
// 把部门列表转换为JSON字符串
// {
{total: total, rows:[]};}
Map<String, Object> mapData = new HashMap<String,Object>();
mapData.put("total", total);
mapData.put("rows", list);
String listString = JSON.toJSONString(mapData);
write(listString);
}
十一、查询的优化
1、创建一个方法返回值为DetachedCriteria(抽取公共方法)在DepDao当中
package com.itzheng.erp.dao.impl;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.itzheng.erp.dao.IDepDao;
import com.itzheng.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, int firstResult, int maxResults) {
DetachedCriteria dc = getDetachedCriteria(dep1);
return (List<Dep>) this.getHibernateTemplate().findByCriteria(dc, firstResult, maxResults);// 添加条件之后再进行查询
}
@Override
public long getCount(Dep dep1) {
DetachedCriteria dc = getDetachedCriteria(dep1);
dc.setProjection(Projections.rowCount());// 获取的是表中元素的个数
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
return list.get(0);
}
private DetachedCriteria getDetachedCriteria(Dep dep1) {
/*
* 记录条件查询的记录数
*/
DetachedCriteria dc = DetachedCriteria.forClass(Dep.class);// 条件,如果满足下面的判断就,添加相应的条件
if (null != dep1) {
// 判断传入Dep的条件是否为空
// 是否输入部门名称
if (null != dep1.getName() && dep1.getName().trim().length() > 0) {
// 判断名称不为空的情况下
// MatchMode.ANYWHERE => % %
// MatchMode.END => %name
// MatchMode.START => name%
// 如果输入了部门名称
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;
}
}
2、如果在页面上需要多添加一列内容的时候,直接在对应的方法上设置对应的内容,在DepDao当中
(1)先在实现类上
(2)在对应的接口上,在DepDao当中
package com.itzheng.erp.dao;
import java.util.List;
import com.itzheng.erp.entity.Dep;
public interface IDepDao {
public List<Dep> getList();
/*
* 条件查询 查询所有部门信息
*/
List<Dep> getList(Dep dep1, Dep dep2, Object param, int firstResult, int maxResults);
long getCount(Dep dep1, Dep dep2, Object param);
}
3、在IDepBiz当中的(erp_biz当中)
(1)修改接口的方法
package com.itzheng.erp.biz;
import java.util.List;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务接口
*/
public interface IDepBiz {
/*
* 查询所有部门列表
*/
List<Dep> getList();
/*
* 条件查询
*
*/
List<Dep> getList(Dep dep1, Dep dep2, Object param, int firstResult, int maxResults);
public long getCount(Dep dep1, Dep dep2, Object param);
}
(2)修改对应的实现类DepBiz
package com.itzheng.erp.biz.impl;
import java.util.List;
import com.itzheng.erp.biz.IDepBiz;
import com.itzheng.erp.dao.IDepDao;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务实现
*/
public class DepBiz implements IDepBiz {
/*
* 数据访问层的调用
*/
private IDepDao depDao;
public void setDepDao(IDepDao depDao) {
this.depDao = depDao;
}
@Override
public List<Dep> getList() {
// TODO Auto-generated method stub
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);
}
}
4、在erp_web下的DepAction,当中创建两个查询属性、
并生成get和set方法
十二、实现增加部门功能,要求使用弹出窗口无刷新效果实现
1、 配置主键生成策略
(1)IDepDao
(2)在实现类当中
@Override
public void add(Dep dep) {
this.getHibernateTemplate().save(dep);
}
2、 对应的映射文件:在erp_entity当中的Dep.hbm.xml
3、 在erp_biz当中的IDepBiz
void add(Dep dep);
4、 在erp_biz当中的DepBiz实现类当中,调用接口当中的add方法
5、 在DeptAction当中增加add方法
public void add() {
// {"success":true,"message":""}
Map<String, Object> rtn = new HashMap<String, Object>();
try {
depBiz.add(dep);
rtn.put("success", true);
rtn.put("message", "新增成功");
} catch (Exception e) {
e.printStackTrace();
rtn.put("success", false);
rtn.put("message", "新增失败");
}
write(JSON.toJSONString(rtn));
}
十三、新增部门前端
<!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(){
$('#grid').datagrid({
//获取id为grid的内容
url:'dep_getList',//向action当中方式请求方法为dep_getList()
columns:[[
{
field:'uuid',title:'部门编号',width:100},
{
field:'name',title:'部门名称',width:100},
{
field:'tele',title:'部门联系电话',width:100,align:'right'}
]],
singleSelect: true,
pagination: true,
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);
});
$('#editDlg').dialog({
title: '部门编辑',
width: 300,
height: 200,
closed: true,//窗口是是否为关闭状态, 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');
});
}
});
});
});
</script>
</head>
<body>
<div class="easyui-panel" style="padding-left:4px;border-bottom:0px;">
<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 id="btnSearch" type="button">查询</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 id="btnSave" type="button">保存</button>
</form>
</div>
</body>
</html>
十四、删除部门
1、删除部门的前端页面
2、删除部门的后端实现
(1) 在erp_dao当中的DepDao类当中设置删除方法
(2) 在erp_dao当中的IDepDao类当中设置删除方法
(3)在业务层当中的dao当中
(4)在业务层当中的dao当中的实现类当中
调用对应的dao层的delete方法
3、在DepAction当中,设置删除的方法
4、测试运行代码
删除成功
十五、修改部门
(一)实现加载修改数据
1、前端页面的实现(在erp_web下的dep.html)
2、在erp_dao的
(1)当中创建接口DepDao
(2)在对应的接口当中实现接口当中定义的get方法
3、在erp_biz当中
(1)实现对应的IDepBiz
(2)实现对应的IDepBiz接口
4、在DepAction当中:设置修改的方法,并设置对应字符串的转换方法
/*
* 通过编号查询对象
*/
public void get() {
Dep dep = depBiz.get(id);
String jsonString = JSON.toJSONString(dep);
System.out.println("转换前:" + jsonString);
// 将JSON数据转换为MAP对象
// 转换为map对象
String jsonStringAfter = mapData(jsonString, "dep");
System.out.println("转换后:" + jsonStringAfter);
write(jsonStringAfter);
}
// JSON 数据字符串
// 要加上的前缀
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);
}
5、点击修改对应信息,将信息查询出来显示到弹框当中
(二)修改部门(也就是更新数据)
1、在IDepDao当中声明接口
2、在实现类当中实现对应的接口
3、在IDepBiz当中设置接口
4、对应的实现类调用对应的到层
5、在DepAction当中设置对应更新的方法
6、修改dep.html页面
更新成功