今天内容

1 新增客户

2 客户列表

3 修改客户

4 删除客户

5 分页显示客户列表

Hibernate模板里面的方法

1 新增客户

配置

<mapping resource="cn/itcast/entity/Customer.hbm.xml" />

创建userAction和CustomerAction,然后在struts.xml中进行配置。

创建实体类,User和Customer,并创建配置文件,在数据库中建表。

使用模型驱动的条件:模型驱动的属性(javabean)名字和表单输入项name属性值要一样。

出现如下异常

这样改变即可。

import org.springframework.transaction.annotation.Transactional;

import cn.itcast.dao.CustomerDao;
import cn.itcast.entity.Customer; @Transactional
public class CustomerService {

表单提交方式是post提交,不需要进行处理,自动处理乱码。

客户列表功能

1 查询所有的客户显示到页面的列表里面

(1)查询所有客户,在dao里面调用Hibernate模板里面的find方法

(2)在action得到返回所有客户list集合,把list集合传递到页面中显示

-把list放到域对象

-把list放到值栈

2 具体实现

(1)在dao使用hibernate模板的find方法

//客户列表功能
@SuppressWarnings("all")
public List<Customer> findAll() {
return (List<Customer>) this.getHibernateTemplate().find("from Customer");
}

在action中

// 3 客户添加列表的方法
public String list() {
List<Customer> list = customerService.findAll();
//放到域对象
ServletActionContext.getRequest().setAttribute("list", list);
return "list";
}

使用值栈的方式

//定义list变量
private List<Customer> list;
//生成变量的list方法
public List<Customer> getList(){
return list;
} // 3 客户添加列表的方法
public String list() {
//List<Customer> list = customerService.findAll();
//放到域对象
//ServletActionContext.getRequest().setAttribute("list", list); //返回list放到值栈里面
list = customerService.findAll();
//上面操作就是把数据放到值栈
//运行成功没有报错
return "list";
}

使用struts2标签+ognl表达式

<s:iterator value="list" var="cus">
<TR
style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none">
<TD><s:property value="#cus.custName" /></TD>
<TD><s:property value="#cus.custLevel" /></TD>
<TD><s:property value="#cus.custSource" /></TD>
<TD><s:property value="#cus.custPhone" /></TD>
<TD><s:property value="#cus.custMobile" /></TD> </TR>
</s:iterator>

而用EL表达式的性能比较低。

删除客户功能

1 在每条记录后面删除超链接,点击超链接删除这条记录

<a href="${pageContext.request.contextPath}/customer_delete.action?cid=${customer.cid}">删除</a>

2 创建action的删除方法

(1)得到cid值

<result name="delete" type="redirectAction">customer_list</result>
//根据id查询
public Customer findOne(int cid) {
return this.getHibernateTemplate().get(Customer.class, cid);
} //删除功能
public void delete(Customer c) {
this.getHibernateTemplate().delete(c);
}

(1)有的浏览器会出问题,如两次提交。

添加判断是否为空的语句就行了。

Customer c = customerService.findOne(cid);
//判断根据id查询对象是否为空
if(c != null){
//调用方法删除
customerService.delete(c);
//级联,分页
}

(2)在修改页面表单里面,修改内容,点击保存,真正修改数据库

<input type="hidden" name="custId" value="${customer.cid }"/>

分页相关知识点

1 在mysql里面使用分页sql语句:

(1)使用关键字limit

select * from t_customer limit 0,3

第一个参数是开始位置,第二个参数是每页显示几条记录

2 分页相关属性

(1)当前页

(2)每页显示记录数

(3)总记录数

(4)总页数

-总记录数 除以 每页显示记录数

-比如10条记录,每页显示5条,有2页

-比如10条记录,每页显示9条,有两页

-总记录除以每页显示记录数,如果能够整除,结果是相除结果,如果不能整除,结果为整数结果+1

int a = 10;

int b = 9;

a/b = 1

1+1 = 2;

(5)开始位置

(6)每页记录的list集合

3 hibernate分页操作

(1)hql

(2)qbc

//封装分页的数据到pagebean里面
public PageBean listpage(Integer currentPage) {
//创建PageBean对象
PageBean pageBean = new PageBean();
//当前页
pageBean.setCurrentPage(currentPage);
//总记录数
int totalCount = customerDao.findCount();
pageBean.setTotalCount(totalCount); //每页显示记录数
int pageSize = 3; //总页数
//总记录数除以每页显示记录数
//能够整除
int totalPage = 0;
if(totalCount % pageSize == 0){//整除
totalPage = totalCount / pageSize;
}else{
totalPage = totalCount / pageSize + 1;
}
pageBean.setTotalPage(totalPage); //开始位置
int begin = (currentPage - 1) * pageSize; //每页记录的list集合
List<Customer> list = customerDao.findPage(begin,pageSize); pageBean.setList(list); return pageBean;
}

在页面中显示分页数据,判断前一页和后一页

<c:if test="${pageBean.currentPage!=1 }">
[<A href="${pageContext.request.contextPath}/customer_listpage.action?currentPage=${pageBean.currentPage-1 }">前一页</A>]
</c:if> <c:if test="${pageBean.currentPage!=pageBean.totalPage }">
[<A href="${pageContext.request.contextPath}/customer_listpage.action?currentPage=${pageBean.currentPage+1 }">后一页</A>]
</c:if>

分页基本信息

共[<B>${pageBean.totalCount}</B>]条记录,[<B>${pageBean.totalPage}</B>]页
,当前第[<b>${pageBean.currentPage}</b>]页

2 在dao进行分页操作

(1)查询记录数

//查询记录数
public int findCount() {
//调用hibernateTemplate里面的find方法实现
List<Object> list = (List<Object>) this.getHibernateTemplate().find("select count(*) from Customer");
//从list中得到值
if(list != null && list.size() != 0){
Object obj = list.get(0);
//变成int
Long lobj = (Long)obj;
int count = lobj.intValue();
return count;
}
return 0;
}

(2)分页查询

有两种方式

第一种 在hibernate模板里面使用底层hibernate代码实现(不用,但是需要知道)。

第二种 使用离线对象和Hibernate模板的方法

第二种方式是对第一种方式的封装

//分页查询操作
public List<Customer> findPage(int begin, int pageSize) {
//第一种 使用Hibernate底层代码实现(了解)
//得到sessionFactory
//SessionFactory sessionFactory = this.getHibernateTemplate().getSessionFactory();
//得到session对象
//Session session = sessionFactory.getCurrentSession();
//设置分页信息
/*Query query = session.createQuery("from Customer");
query.setFirstResult(begin);
query.setMaxResults(pageSize);
List<Customer> list = query.list();*/
//hibernate本身有一定缺陷,无法做复杂查询,
//这种情况是在复杂查询的时候会用到 //第二种 使用离线对象和hibernateTemplate的方法实现
//1 创建离线对象,设置对哪个实体类进行操作
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class); //调用hibernateTemplate的方法实现
//第一个参数是离线对象
//第二个参数是开始位置
//第三个参数是每页记录数
//用find的方法无法实现分页
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria,begin,pageSize);
return list;
}

条件查询

//条件查询
public List<Customer> findCondition(Customer customer) {
//第一种方式:
/*SessionFactory sessionFactory = this.getHibernateTemplate().getSessionFactory();
//得到session对象
Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from Customer where custName=?");
query.setParameter(0, "%"+customer.getCustName()+"%"); List<Customer> list = query.list();
return list;*/ //第二种方式:调用hibernateTemplate的find方法实现
List<Customer> list = (List<Customer>) this.getHibernateTemplate().find("from Customer where custName like ?", "%"+customer.getCustName()+"%");
return list;
}

第三种方式

(1)使用离线对象,调用hibernateTemplate里面的方法

//第三种方式
// 1 创建离线对象,设置对哪个实体类进行操作
DetachedCriteria criteria = DetachedCriteria.forClass(Customer.class);
// 2 设置对实体类哪个属性
criteria.add(Restrictions.like("custName", "%"+customer.getCustName()+"%"));
// 3 调用hibernateTemplate里面的方法得到list集合
List<Customer> list = (List<Customer>) this.getHibernateTemplate().findByCriteria(criteria);
return list;

5 web阶段多条件组合查询,拼接sql语句实现

String sql = "select * from user where 2=2";

List list = new ArrayList();

if(username != null){

sql += "and username=?";

}

if(password != null){

sql += "and password=?";

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. 基于SSH的网上图书商城-JavaWeb项目-有源码

    开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 技术:Java:JSP:JDBC,struts2,spring,hibernate数据库: mysqlweb ...

随机推荐

  1. visual studio 2017 编译v140 TRACKER : error TRK0005: Failed to locate: "CL.exe". 系统找不到指定的文件

    原因可能是vs2017中配置v140 的编译命令路径有问题 解决方案: 用vs2017的在线安装程序,选择修改 进去后选择单个组建,在编译器.生成工具和运行时里面把vc++2015.3…… 打钩的取消 ...

  2. IO流入门-第九章-BufferedReader_BufferedWriter复制

    利用BufferedReader和BufferedWriter进行复制粘贴 import java.io.*; public class BufferedReader_BufferedWriterCo ...

  3. 自定义ActionBar图标

    <style name="Theme.glTheme" parent="android:Theme.Holo"> <item name=&qu ...

  4. Keras网络层之常用层Core

    常用层 常用层对应于core模块,core内部定义了一系列常用的网络层,包括全连接.激活层等 Dense层 keras.layers.core.Dense(units, activation=None ...

  5. xxxservlet继承HttpServlet类

    "HttpServlet类被定义为抽象类,但是源码里面没有抽象方法.所以没有一定要求实现的方法.之所以定义为抽象类,是因为他继承了GenericServlet这个抽象类.并没有全部实现里面的 ...

  6. JS 中的substring ,substr ,slice,split,join

    substr with different arguments passed in: str.substring(startNum,stopNum ); str.slice(startNum,stop ...

  7. Angular 学习笔记 :初识 $digest , $watch , $apply,浅析用法 。

    传统的浏览器事件循环 :浏览器本身一直在等待事件,并作出响应.如果你点击一个button或者在input 中输入字符,我们在 JS 中 监听这些事件并设定了回调函数,那么这些事件被触发以后,回调函数就 ...

  8. s5_day4作业

    # #流程控制练习题: # #==========>基础部分 # #练习一: # if True or False and False: # print('yes') # else: # pri ...

  9. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  10. ruby underscore

    “examScore".underscore : exam_score "ExamScore".underscore: exam_score