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

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

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

在线书城后台管理设计:

CURD_Hibernate

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

思路分析:

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

5.关于主键生成策略:

native: 会根据底层数据库的能力,从identity、sequence、hilo中选择一个,灵活性更强,但此时,如果选择sequence或者hilo,则所 有的表的主键都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高
对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管(很常用)

assigned:

由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况,如:

这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键(surrogate key),不应使用自然主键(natural key具有业务含义),在没有指定标签时,默认就是assigned主键的生成方式
在插入数据的时候主键由用户自己添加,hibernate也不管

ps:Hibernate所有主键策略解析:http://blog.csdn.net/caiwenfeng_for_23/article/details/43644573

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

关键代码:

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

转载于:https://www.cnblogs.com/boy1025/p/4619793.html

### 回答1: javaweb书城后台管理系统源码是一个用Java语言编写的网站管理系统。它主要用于管理图书网站的后台操作,包括用户管理、图书管理、订单管理、权限管理等功能。 该源码实现了用户管理功能,管理员可以对用户进行增删改查操作,包括修改用户信息、重置用户密码等。同时,系统还具备了图书管理功能,管理员可以对图书进行分类管理、上架下架等操作,还可以添加新的图书信息。另外,系统支持订单管理功能,管理员可以查看和处理用户的订单,包括确认订单、取消订单等。除此之外,系统还具备权限管理功能,管理员可以给不同的角色分配不同的权限,保证系统的安全性。 该源码采用了JavaWeb技术,使用了一些常用的框架和技术,如Spring、SpringMVC、MyBatis等,这些框架可以提高开发效率和代码的可维护性。另外,数据库采用了关系型数据库,如MySQL、Oracle等,用于存储用户信息、图书信息、订单信息等。 该系统源码具有良好的代码结构和注释,易于理解和修改。它不仅实现了基本的功能,还有一些附加的功能,如数据统计、日志记录等。同时,系统还采用了响应式布局和界面美化的设计,让管理员可以在不同终端设备上都能良好地使用。 总之,javaweb书城后台管理系统源码是一个功能完善、操作简便的网站管理系统,代码清晰、结构合理,可以根据需要进行二次开发和定制,非常适合图书网站的后台管理使用。 ### 回答2: javaweb书城后台管理系统源码是一个用Java语言开发的网上书城管理系统的代码。这个系统的主要功能是帮助书城管理员对网上书城进行管理和维护。 这个系统包含了书籍管理、订单管理、用户管理等功能模块。管理员可以通过登录后台系统,查看、新增、编辑、删除书籍信息。管理员可以对书籍进行分类和标签的管理,方便用户进行检索。管理员还可以管理订单信息,查看订单详情,确认订单等操作。另外,管理员还可以管理用户信息,包括查看用户列表、新增用户、重置用户密码等。系统还提供了购物车管理、支付管理等功能模块,方便管理员监控和管理整个书城的运营。 该系统使用了Java的Web开发技术,主要用到了Java Servlet、Java Server Pages(JSP)、Java Bean等技术。前端页面使用HTML、CSS、JavaScript等技术进行开发和美化。数据库方面,系统采用MySQL作为数据存储的主要方式,并通过Java数据库连接(JDBC)技术实现与数据库的连接与操作。此外,系统还使用了一些常用的开源框架和工具,如Spring、Hibernate等,以提升系统的开发效率和可维护性。 该系统的源码可供学习者、开发者使用,通过阅读源码可以深入了解和学习JavaWeb开发中的相关技术和方法。源码中提供了注释和文档说明,方便阅读和理解代码的逻辑和功能实现。 总之,javaweb书城后台管理系统源码是一个功能完善的网上书城管理系统的代码,通过阅读源码和学习代码的实现,可以帮助开发者更好地理解和应用JavaWeb开发技术。 ### 回答3: JavaWeb书城后台管理系统是一个用于管理书城网站的后台系统,帮助管理员对书籍、订单、用户等信息进行管理和处理。 该系统的源码使用Java语言编写,基于JavaWeb技术开发,使用了重要的技术组件如Servlet、JSP、JavaBean等,同时结合了数据库(如MySQL)来存储和管理数据。 系统的功能包括但不限于以下几个方面: 1. 书籍管理:管理员可以添加、修改、删除书籍的基本信息,如书名、作者、出版社等。系统可以根据关键字进行书籍检索和分类展示。 2. 订单管理:管理员可以查看最新的订单信息,包括订单编号、订单总额、购买者信息等。系统可以对订单进行处理,包括确认发货、取消订单等。 3. 用户管理:管理员可以查看注册用户的信息,包括用户名、密码、联系方式等。系统可以对用户进行管理,包括封禁用户、解封用户等。 4. 数据统计:系统可以对各类数据进行统计分析,如销量统计、用户注册量统计等,为管理员提供决策支持。 5. 系统设置:管理员可以对系统进行一些基本设置,如修改管理员密码、配置数据库连接等。 这个后台管理系统源码的实现,结构清晰,代码规范,可读性强。除了基本的功能,还考虑了系统的安全性、稳定性和可扩展性。通过该源码,用户可以学到如何使用JavaWeb技术进行系统开发,同时也可以作为扩展功能的基础,根据具体需求进行二次开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值