Hibernate学习-在线书城后台管理系统的设计

写在前面:小编经历了昨天一晚上加今天一整天的“不吃不喝(夸张点…总之就是把时间全分享给TA了)”终于把程序的问题全部解决了,小编现在的心情十分的开森,开森,开森,Happy,话不多说,直接进入正题:

------------------------------------------------------------我是一条帅气的分割线---------------------------------------------------

在线书城后台管理设计:

------------------------------------------------------------我是一条帅气的分割线------------------------------------------------------

思路分析:

1.使用的技术:MVC+Hibernate

2.首先用户进入sign-in.jsp,然后成功登陆后进入LoginServelt进行页面跳转,跳转到BooksListServlet中,然后在这个Servlet中进行页面跳转,跳转到all-books.jsp页面,通过taglib标签进行读取attribute中的数据的值

3.当用户进行删除的操作的时候,进入DeleteBooksServlet,成功删除后返回到BooksListServlet中进行页面跳转

3.当用户进行添加数据的时候,特别需要注意这一点,由于我们的isbn不是自动增长的,所以我们需要设置主键策略为assigned,而不是native,添加的时候进入add-books.jsp,表单的action对象为AddBooksServlet,当用户成功添加数据后,将页面跳转到BooksListServlet中,通过它进行页面的跳转

4.当用户进行更新数据的时候,首先需要通过QueryBooksByIdServlet<url传值>进行查询数据,并且返回到update-books.jsp,然后通过taglib进行数据读取,由于技术有限,需要对里面可以修改的数据修改,否则会出现错误,错误将导致你所在数据库的字段为null,这个因素源于更新的时候使用了seesion api,这个因素的主要是在于它的“主键”,更新结束后页面跳转到UpdateBooksServlet中,经过处理后将页面跳转到BooksListServlet

------------------------------------------------------------我是一条帅气的分割线--------------------------------------------------------

关键代码:

1.数据库操作类(含有数据库的CURD操作)

package org.monster.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.FlushMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.monster.dao.HibernateSessionFactory;
import org.monster.dao.IBooksDao;
import org.monster.entity.Books;

/**
 * 书籍数据库操作实现类
 */
public class BooksDaoImpl implements IBooksDao {
    /**
     * 取得书籍分页信息,这个分页是个模板,对所有的数据库都一样
     * @param pageSize 每个分页的记录数
     * @param pageNum 当前要获取分页页码
     * @return
     */
    @SuppressWarnings("unchecked")   //这句话去掉不匹配的提示
    public List<Books> getBooksPageList(int pageSize, int pageNum){
        List<Books> list = new ArrayList<Books>();
        Session session = HibernateSessionFactory.getSession();
        try{
            String hql = "from Books order by id desc";     //hql是从对象中进行查询,使用Books而不是表Books
            Query q = session.createQuery(hql);
            q.setFirstResult((pageNum-1)*pageSize);   //过滤前面的pageNum-1页的数据
            q.setMaxResults(pageSize);   //取出当前页的数据来
            list = q.list();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            session.close();
        }
        return list;
    }

    /**
     * 取得书籍对象信息
     * @param id
     * @return  Books
     */
    public Books getBooksItem(String id){
        Books item = null;
        Session session = HibernateSessionFactory.getSession();
        try{
            String hql = "from Books where id=?";     //hql是从对象中进行查询,使用Books而不是表Books
            Query q = session.createQuery(hql);
            q.setString(0, id);
            item = (Books) q.uniqueResult();
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            session.close();
        }
        return item;
    }

    /**
     * 添加书籍信息
     *  需要事务处理
     */
    public void addBooks(Books item){
        Session session = HibernateSessionFactory.getSession();
        Transaction tran = session.beginTransaction();  //开启事务
        try{
            session.save(item);
            tran.commit();   //执行事务
        }catch(Exception ex){
            tran.rollback();  //回滚事务
            ex.printStackTrace();
        }finally{
            session.close();
        }

    }

    /**
     * 修改书籍信息[由于图书的字段值很多,管理员也许只需要添加部分字段,所以可以通过session接口进行操作]
     * @param item 要修改的对象
     * @return
     */
    public void  editBooks(Books item){
        Session session = HibernateSessionFactory.getSession();
        Transaction tran = session.beginTransaction();  //开启事务
        try{
            session.update(item);
            tran.commit();
        }catch(Exception ex){
            tran.rollback();
            ex.printStackTrace();
        }finally{
            session.close();
        }
    }

    /**
     * 删除书籍信息
     * @param id
     * @return iRow
     */
    public int delBooks(int id){
        int iRow =0 ;  //影响的行数
        Session session = HibernateSessionFactory.getSession();
        Transaction tran = session.beginTransaction();  //开启事务

        try{
            String hql = "delete from Books where id=?";     //hql是从对象中进行查询,使用Books而不是表Books
            Query q = session.createQuery(hql);
            q.setInteger(0,id);
            iRow = q.executeUpdate();
            tran.commit();   //执行事务
        }catch(Exception ex){
            tran.rollback();  //回滚事务
            ex.printStackTrace();
        }finally{
            session.close();
        }
        return iRow;
    }
}

ps:上述代码经单元测试全部通过

2. 单元测试的代码:

package org.monster.test;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.monster.dao.IBooksDao;
import org.monster.entity.Books;
import org.monster.impl.BooksDaoImpl;

import junit.framework.TestCase;

public class TestCURD extends TestCase {

    public void testGetBooksPageList() {
        IBooksDao dao=new BooksDaoImpl();
        List<Books> bookList=dao.getBooksPageList(20, 1);  //得到图书列表
        for(int i=0;i<bookList.size();i++){
            Books book=bookList.get(i);
            System.err.println("出版社"+book.getPublisherName());
        }
    }

    public void testGetBooksItem() {
        IBooksDao dao=new BooksDaoImpl();
        Books book=dao.getBooksItem("0130284190");
        System.out.println("数据"+book.getPublisherName());
    }

    public void testAddBooks() {
            /**创建Books对象并且赋值**/
            Books book=new Books();
            book.setIsbn("010102023");
            book.setTitle("亲,我怎么又成炮灰了");
            book.setPrice(250.0);
            book.setPubDt(new Date());
            book.setPublisherName("滨州出版社");

            /**进行添加操作**/
            IBooksDao dao=new BooksDaoImpl();
            dao.addBooks(book);
        }

    private String getData() {
        // 得到时间的方法
        Date date=new Date();
        SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd hh:SS;mm");
        String str=format.format(date);
        return str;
    }

    public void testEditBooks() {
        IBooksDao dao=new BooksDaoImpl();
        Books book=new Books();
        book.setIsbn("0130829288");
        book.setPublisherName("临沂出版社");
        book.setPrice(120.00);
        book.setTitle("我是书名,我好伤心- -!!");
        book.setPubDt(new Date());
        dao.editBooks(book);
    }

    public void testDelBooks() {
        IBooksDao dao=new BooksDaoImpl();
        int i=dao.delBooks(1);
        System.out.println("返回行数" +i);
    }

}

3.关于数据更新时的乱码问题解决:

request.setCharacterEncoding("utf-8"); //转码操作

4.小编觉得在在数据库的CURD操作的时候,应该注意各个servlet类间的灵活调用,因为servlet作为一个控制器,负责对各页面进行跳转并且携带数据跳转,小编觉得关于跳转时候的关键代码:

eg:以查询所有图书为例

IBooksDao dao=new BooksDaoImpl();
List<Books> bookList=dao.getBooksPageList(20, 1);  //得到图书列表
request.setAttribute("BooksList", bookList);
request.getRequestDispatcher("all-books.jsp").forward(request, response);

5.关于在页面中进行显示,由于我们对数据进行setAttribute操作,所有我们在页面中可以通过taglib标签进行显示

<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<c:set var="BooksList"  value="${requestScope.BooksList}"></c:set>
          <c:forEach items="${BooksList}" var="item">
        <tr>
          <td>${item.isbn}</td>
          <td>${item.title}</td>
          <td>${item.price}</td>
          <td>${item.pubDt}</td>
          <td>图片收集中</td>
          <td>${item.publisherName}</td>
          <td>
                <!--商品信息更改和删除开始-->
              <a href="QueryBooksByIdServlet?isbn=${item.isbn}"><i class="icon-pencil"></i></a>
              <a href="DeleteBooksServlet?isbn=${item.isbn}" role="button" data-toggle="modal"><i class="icon-remove"></i></a>
              <!--商品信息更改和删除结束-->
          </td>
        </tr>
         </c:forEach>

6.源码分享

https://github.com/monsterLin/WebShopBackstage

时间: 2024-11-08 01:52:42

Hibernate学习-在线书城后台管理系统的设计的相关文章

【ThinkPHP框架学习 】(2) --- 后台管理系统如何用iframe点击左边右边局部刷新

如题: 在写后台管理系统时,需要实现后台界面的局部动态刷新. 左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态刷新. 原理:设这你的 iframe  的名字  比如iframe name="main"你左边的页面中 <a href="Article_Manage.asp" target="main">文章管理</a> 解读源码: 1.在右边嵌套框中   写入嵌套代码

react学习之搭建后台管理系统

1.使用create-react-app搭建基础react基础框架 npm install -g create-react-app yarn // 如果电脑已经全局安装过即可跳过 create-react-app antd-demo cd antd-demo yarn start 2.安装antd Ui框架,具体参考官网中antd在 create-react-app 中使用(配置按需引入) https://ant.design/docs/react/use-with-create-react-a

通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)

通用后台管理系统(ExtJS 4.2 +Spring MVC 3.2 + Hibernate) 开发语言JAVA 成品成品 前端技术extjs 数据库mysql,sql server,oracle 系统可作为OA.网站.电子政务.ERP.CRM.APP后台等基于B/S架构的应用软件系统的快速开发框架. 详细信息 原文:http://www.yctxkj.com/product/showproduct.php?lang=cn&id=16 系统可作为OA.网站.电子政务.ERP.CRM.APP后台等

Bootstrap扁平化设计的网站后台管理系统源代码下载

原文:Bootstrap扁平化设计的网站后台管理系统源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463771626496.htm 扁平化设计的网站后台管理系统. 官方补充: 非常不错的基于bootstrap的后台管理模板框架metronic,在线演示地址:http://www.keenthemes.com/preview/metronic_admin/

基于ExtJS 4.2.1 + Hibernate 4.1.7 + Spring MVC 3.2.8 的通用后台管理系统

一.系统介绍 1.基于最新的ExtJS 4.2.1.883开发. 2.支持MySQL.SQL Server.Oracle.DB2等关系数据库. 3.本系统可作为OA.网站.电子政务.ERP.CRM等基于B/S架构的应用软件系统的快速开发框架. 源码有50多M(包括Jar包和SQL文件),点此获取. 二.特色功能1.采用Spring MVC的静态加载缓存功能,在首页将Javascript文件.CSS文件和图片等静态资源文件加载进来放进内存,极大提高ExtJS的加载速度.2.增加新的ExtJS Ne

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(47)-工作流设计-补充

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(47)-工作流设计-补充 系列目录 补充一下,有人要表单的代码,这个用代码生成器生成表Flow_Form表的Index代码就可以 加上几个按钮就可以了 <div class="mvctool"> <input id="txtQuery" type="text" class="searchText" /> @Ht

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(48)-工作流设计-起草新申请

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(48)-工作流设计-起草新申请 系列目录 创建新表单之后,我们就可以起草申请了,申请按照严格的表单步骤和分支执行. 起草的同时,我们分解流转的规则中的审批人并保存,具体流程如下 接下来创建DrafContoller控制器,此控制器只有2个页面,一个Create(起草页面)Index(表单列表) 表单列表显示个人想法,我是根据分类直接获取其下表单,即Flow_Type下的Flow_Form public

构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(42)-工作流设计01

原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(42)-工作流设计01 工作流在实际应用中还是比较广泛,网络中存在很多工作流的图形化插件,可以做到拉拽的工作流设计,非常简便,再配合第三方编辑器,可以直接生成表单,我没有刻意的浏览很多工作流的实际设计,我认为工作流只要有动态可修改的流转,有时可按角色,部门,上级或者职位流转即是比较好的正常工作流!这里只带给一个思路的简单工作流... 工作流其实有几种,也可以设计得很简单: 1.固定的工作流,很小的公司,

struts+hibernate+jsp开发MedicineManager医疗后台管理系统源代码下载

原文:struts+hibernate+jsp开发MedicineManager医疗后台管理系统源代码下载 源代码下载地址:http://www.zuidaima.com/share/1550463451368448.htm MedicineManager医疗管理系统 代码没有建库脚本,会报错