1 信息查询

(1)多条件组合查询

-拼接hql语句

-使用离线对象

2 添加数据字典表

(1)改造添加客户功能

3 统计分析

(1)调用普通sql实现

(2)结果处理操作

4 使用ssh注解整合

(1)spring注解创建对象、注入属性

(2)hibernate配置映射注解

联系人信息查询

1 点击 联系人信息查询 超链接的时候,到查询页面

(1)在查询页面中,选择客户,根据客户进行查询

//到联系人添加页面
public String toSelectPage(){
//查询所有客户,把传递到页面到下拉列表中
List<Customer> list = customerService.findAll();
ServletActionContext.getRequest().setAttribute("list", list);
return "toSelectPage";
}

页面中显示

<td>所属客户</td>
<td>
<select name="customer.cid">
<option value="0">--请选择--</option>
<c:forEach items="${list }" var="cus">
<option value="${cus.cid }">${cus.custName}</option>
</c:forEach>
</select> </td>

2 在查询页面中,输入值,提交表单到action,查询数据库得到结果

//多条件组合查询-hql语句拼接方式实现
public List<LinkMan> findCondition(LinkMan linkMan) {
String hql = "from LinkMan where 1=1";
List<Object> p = new ArrayList<Object>();
//判断条件是否为空
if(linkMan.getLkmName() != null && !"".equals(linkMan.getLkmName())){
hql += " and lkmName=?";
p.add(linkMan.getLkmName());
}
//判断是否选择客户
if(linkMan.getCustomer().getCid() != null && linkMan.getCustomer().getCid() > 0){
//判断客户里面cid值
hql += " and customer.cid=?";
p.add(linkMan.getCustomer().getCid());
} return (List<LinkMan>) this.getHibernateTemplate().find(hql, p.toArray());
}

重点语句在于

hql += " and customer.cid=?";

3 使用离线对象实现查询

//多条件组合查询-离线对象方式实现
public List<LinkMan> findCondition(LinkMan linkMan) {
//创建离线对象
DetachedCriteria criteria = DetachedCriteria.forClass(LinkMan.class);
if(linkMan.getLkmName() != null && !"".equals(linkMan.getLkmName())){
criteria.add(Restrictions.eq("lkmName", linkMan.getLkmName()));
}
if(linkMan.getCustomer() != null && linkMan.getCustomer().getCid() > 0){
criteria.add(Restrictions.eq("customer.cid", linkMan.getCustomer().getCid()));
} return (List<LinkMan>) this.getHibernateTemplate().findByCriteria(criteria);
}

添加数据字典表

1 什么是数据字典表

(1)存储基础数据

-比如添加客户信息的时候,添加客户级别,这个级别不能随便输入,把客户级别存到数据字典表里面,添加的时候,查询数据字典所有记录显示

(2)码表

2 数据字典表 和 客户表之间关系是一对多关系

(1)数据字典表是一

(2)客户表示 多

-一个级别里面可以被多个客户拥有,一个客户只能是一个级别。

(3)让数据字典表对应一个实体类

-配置数据字典表和客户表关系

改造添加客户功能

1 创建数据字典表实体类,配置映射

public class Dict {

    private String did;
private String dname;
public String getDid() {
return did;
}
public void setDid(String did) {
this.did = did;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
} }

配置文件中

<class name="cn.itcast.entity.Dict" table="t_dict">
<id name="did" column="did">
<!--
native:主键自动增长,类型必须是int类型
实体类did是string,可以写uuid
还要一个值,increment
-->
<generator class="increment">
</generator>
</id>
<property name="dname" column="dname"></property> </class>

2 配置数据字典和客户映射关系

(1)需求:根据客户查询级别,没有根据级别查询客户的需求

(2)只需要在客户实体类表示所属级别

//在客户实体类表示所属级别
private Dict dictCustLevel; public Dict getDictCustLevel() {
return dictCustLevel;
} public void setDictCustLevel(Dict dictCustLevel) {
this.dictCustLevel = dictCustLevel;
}

(3)在映射文件中表示关系

-在客户映射文件中,配置所属级别就可以了

<!-- 所属级别 -->
<many-to-one name="dictCustLevel" class="cn.itcast.entity.Dict" column="custLevel"></many-to-one>

t_customer的建表语句如下所示:

 CREATE TABLE `t_customer` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`custName` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`custSource` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`custPhone` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`custMobile` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`custLevel` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`cid`),
KEY `FKo6oqtbbjmu6890to85xbpymcd` (`custLevel`),
CONSTRAINT `FKo6oqtbbjmu6890to85xbpymcd` FOREIGN KEY (`custLevel`) REFERENCES `t_dict` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |

3 功能分析

(1)到添加客户页面中,在下拉列表中把所有级别显示

(2)点击保存,把数据添加到数据库里面

-使用模型驱动封装得到值

-列表页面中修改位置

统计分析

1 系统中可能有复杂查询操作,使用hibernate不能实现,需要调用普通sql语句实现

(1)在dao里面使用hibernate模板,使用hibernate模板调用普通sql

select count(*) as num,custSource from t_customer
group by custSource

(2)根据客户级别统计

只使用客户表,客户级别id值不是名称,但是显示客户级别名称

-让客户表和数据字典表多表查询操作

sql

select c.num,d.dname
from (select count(*)as num,custLevel from t_customer group by custLevel) c,
t_dict d
where c.custLevel=d.did;

2 统计查询之后,返回多条记录,每条记录里面有两个值,返回list集合,

但是list里面泛型没有实体类封装,让list里面的泛型是map集合

sqlquery里面有一个方法可以把查询结果进行转换,setResultTransformer()

根据客户级别统计

1 在dao里面调用普通sql语句

//根据客户级别统计
public List findCountLevel() {
//获取session对象
Session session = this.getSessionFactory().getCurrentSession();
//创建SQLQuery对象
SQLQuery sqlQuery = session.createSQLQuery("select c.num,d.dname from (select count(*)as num,"
+ "custLevel from t_customer group by custLevel) c,t_dict d where c.custLevel=d.did");
//得到结果
//转换成map结果
sqlQuery.setResultTransformer(Transformers.aliasToBean(HashMap.class));
List list = sqlQuery.list();
return list;
}

返回list集合,list集合中每部分是数组形式。

总结crm

1 struts2上传

(1)表单满足三个要求

-提交方式是post,enctype属性值设置,表单里面要有文件上传项和name属性

(2)在action直接获取上传文件和文件名称

(3)上传逻辑:

-在服务器上创建文件

-把上传文件复制到服务器文件里面

(4)struts2上传文件大小限制2M

2 多对多配置方式

(1)使用hibernate配置多对多,缺陷:第三张表只有两个id值

(2)拆分成两个一对多实现

3 离线对象使用

(1)分页查询

(2)多条件组合查询

-离线对象

-hql实现

-拼接hql语句,使用list集合设置参数值

4 调用底层sql实现

(1)得到sessionFactory对象,得到session对象

(2)得到session里面的方法创建SQLQuery对象

(3)返回结果的结构转换

5 配置实体类之间关系的时候,不需要两端都进行配置,根据具体需求实现

6 BaseDao抽取

(1)创建basedao接口,使用大写字母T,代表任意类型,定义crud方法

(2)创建basedao接口实现类,实现crud操作

-术语,在构造方法里面实现代码

(3)在具体功能的接口继承basedao接口

(4)在具体功能实现类继承basedao实现类

-在接口和实现类里面,把crud方法去掉。

crm开发(基于ssh)(五)的更多相关文章

  1. 基于ssh框架的在线考试系统开发的质量属性

    我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...

  2. 实现基于SSH的门票管理系统开发的质量属性

    我要做的是一个基于SSH的门票售卖系统,在系统中常见的质量属性有:可用性.可修改性.性能.安全性.易用性. 可用性方面: 可用性是指系统正常运行时间的比例,是通过两次故障之间的时间长度或在系统崩溃情况 ...

  3. 基于SSH框架的在线考勤系统开发的质量属性

    我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...

  4. 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现

    基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...

  5. 基于SSH框架的网上书店系统开发的质量属性

    基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...

  6. 【Ansible】 基于SSH的远程管理工具

    [Ansible] 参考文档:[http://www.ansible.com.cn/docs/intro.html] 和ansible类似的工具还有saltstack,puppet,sshpass等, ...

  7. 基于SSH的高校网上选课系统的质量属性的实现

    我对于基于SSH的高校网上选课系统的质量属性的实现是从可用性.性能.安全性.可维护性.易用性五个方面进行的实现. 可用性方面: 实现方式:(1)当系统试图超出限制范围来进行课程查询或选课时必须进行错误 ...

  8. 基于SSH框架的学生公寓管理系统的质量属性

    系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...

  9. Masstransit开发基于消息传递的分布式应用

    使用Masstransit开发基于消息传递的分布式应用 Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必 ...

  10. 基于ssh反向代理实现的远程协助

    本文描述了怎么通过ssh反向代理实现远程协助,并提供了相关代码. 可满足web开启远程协助功能后,维护人员能够通过ssh和http登录客户机器(包括在nat环境下) web开启该功能后,ssh才能登录 ...

随机推荐

  1. 外观模式(Facade) Adapter及Proxy 设计模式之间的关系 flume

    小结: 1. 外观模式/门面模式 Facade  往是多个类或其它程序单元,通过重新组合各类及程序单元,对外提供统一的接口/界面. Proxy(代理)注重在为Client-Subject提供一个访问的 ...

  2. 超过70亿条数据的mysql 去重

    1.数据库层面: 2.业务层面:接口去重.浏览器显示端去重:

  3. Nginx-rtmp直播之业务流程分析 http://www.mamicode.com/info-detail-2287896.html

    Nginx-rtmp直播之业务流程分析 http://www.mamicode.com/info-detail-2287896.html

  4. js function,prototype,sub.

    Ojbect 和Function 与普通函数和实例对象 1.实例对象的proto 指向构造函数的原型对象 2.实例对象的proto 指向Ojbect的原型 3.所有函数的proto 都指向Functi ...

  5. python中counter()记数

    一:定义一个list数组,求数组中每个元素出现的次数 如果用Java来实现,是一个比较复杂的,需要遍历数组list. 但是Python很简单:看代码 a = [1,4,2,3,2,3,4,2] fro ...

  6. css的常用知识点

    一.css的引入方式 1.行内引入 直接在标签中定义样式 <p style="background-color: red">test</p> 2.嵌入式引入 ...

  7. django 配置 多数据库

    django多数据库 阅读spider platform时发现前端项目中使用了多数据库,那么django实现多数据库需要哪些配置呢,又如何使用呢? 定义及路由机制 定义 在settings里面的DAT ...

  8. PYTHON 最佳实践指南(转)

    add by zhj: 本文参考了The Hitchhiker's Guide to Python,当然也加入了作者的一些东西.The Hitchhiker's Guide to Python 的gi ...

  9. django-admin详细设置

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制.以下是我最近摸索总结出比较实用的配置.若你有什么比较好的配置 ...

  10. mysql 中sum (if()) 用法

    原表: id    fenlei     time 1      分类1      20130316 2      分类2      20130316 3      分类3      20130317 ...