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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM