写在前面:小编经历了昨天一晚上加今天一整天的“不吃不喝(夸张点…总之就是把时间全分享给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

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

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

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

    如题:         在写后台管理系统时,需要实现后台界面的局部动态刷新.         左边的导航栏使用a标签进行设置,通过href和target属性的配合,就可以将iframe中的子页实现动态 ...

  2. 我的第一个python web开发框架(34)——后台管理系统权限设计

    框架底层和接口终于改造完成了,小白再次找到老菜. 小白:老大,上次你对后台权限系统简单的讲了一下,我一点头绪都没有,现在有空完整的说一说吗? 老菜:说到权限系统,要讲明白真不容易,权限系统并不是越复杂 ...

  3. zsy后台管理系统-架构设计

    Zsy框架总体架构设计 1.Mysql数据库,存储所有表的数据. 2.Zsy-基础项目(Zsy-Model,Zsy-Dao,Zsy-Service,Zsy-Web),基于SSM框架.项目功能包含基本的 ...

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

    通用后台管理系统(ExtJS 4.2 +Spring MVC 3.2 + Hibernate) 开发语言JAVA 成品成品 前端技术extjs 数据库mysql,sql server,oracle 系 ...

  5. 【后台管理系统】—— Ant Design Pro入门学习&项目实践笔记(三)

    前言:前一篇记录了[后台管理系统]目前进展开发中遇到的一些应用点,这一篇会梳理一些自己学习Ant Design Pro源码的功能点.附:Ant Design Pro 在线预览地址. Dashboard ...

  6. 一种小型后台管理系统通用开发框架中的Cache缓存设计

    本篇博客记录一下我在实习的公司的后台管理系统开发框架中学习到的一种关于网站的缓存(Cache)的实现方法,我会在弄懂的基础上,将该方法在.net core上进行实现.因为公司开发都是基于.net fr ...

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

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(48)-工作流设计-起草新申请 系列目录 创建新表单之后,我们就可以起草申请了,申请按照严格的表单步骤和分 ...

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

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(47)-工作流设计-补充 系列目录 补充一下,有人要表单的代码,这个用代码生成器生成表Flow_Form表 ...

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

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(46)-工作流设计-设计分支 系列目录 步骤设置完毕之后,就要设置好流转了,比如财务申请大于50000元( ...

随机推荐

  1. There is no ‘Animation’ attached to the “Player” game object

    There is no ‘Animation’ attached to the “Player” game object 在照着龚老师的Unity3D投篮游戏视频教程练习时,遇到这个错误提示. 我知道 ...

  2. SQL 2014新特性- Delayed durability

    ACID 是数据库的基本属性.其中的D是指"持久性":只要事务已经提交,对应的数据修改就会被保存下来,即使出现断电等情况,当系统重启后之前已经提交的数据依然能够反映到数据库中. 那 ...

  3. Windows 8.1 应用开发 – 触控操作

    与WPF相同Windows 8.1应用中也具有高级触控操作(Manipulation),其中包含了三种常见的触屏手势:平移.缩放.旋转,通过以下四种事件可为控件实现各种触控操作:Manipulatio ...

  4. Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?

    现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...

  5. Install Visual Studio For Mac Preview

    在Hack News上看到Visual Studio For Mac Preview的链接,上面有许多评论,纪录下尝鲜安装过程. 第一次尝试 VisualStudioforMacPreviewInst ...

  6. 谈谈patch strategy

    所谓的patch strategy,就是软件发布后出现bug时打补丁的方式 - 主要是关于源代码branch如何组织的方式 针对项目的开发阶段.开发状态.维护方式不同,可以有不同的patching s ...

  7. meta标签大全

    meta标签大全 <!--     x-ua-compatible(浏览器兼容模式)     仅对IE8+以效     告诉浏览器以什么版本的IE的兼容模式来显示网页     <meta ...

  8. JavaScript的理解记录(3)

    ---接上篇 一.函数:    1. 函数定义后直接执行:var f = (function(x){ return x*10}(10)); 2. 函数的调用有四种方式: 作为函数:作为方法:作为构造函 ...

  9. Mysql 慢查询和慢查询日志分析

    众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的.下面总结一些使用过或者研究过的经验,从配置以及调节索引的方面入手,对mysql进行一 ...

  10. HTML5+AJAX原生分块上传文件的关键参数设置

    processData:false 这是jquery.ajax的一个参数.默认值为true,表示会将非字符串对象自动变成k1=v1&k2=v2的形式,例如一个数组参数{d:[1,2]},到服务 ...