今天内容
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=?";
}