第14章WEB14-JDBC案例篇
今日任务 Ø 使用JDBC技术完成对商品的添加修改查询及分页的操作 教学导航 | 掌握JDBC的CRUD的操作 掌握JDBC的分页操作 | | |
1.1 上次课内容回顾:JSP的模式: * JSP的设计模式: * JSP的模式一:JSP + JavaBean设计模式: * JSP的模式二:JSP + Servlet + JavaBean设计模式:MVC设计模式. * M:Model * V:View * C:Controller * MVC和EE开发三层结构的关系: * 反射:(*****) * 获得类的字节码对象:Class对象.三种获得的方式. * 类名.class; * 类的实例.getClass(); * Class.forName(); * 获得构造器:Constructor * 获得属性:Field * 获得方法:Method JDBC的事务管理: * 事务的概念:指的是逻辑上的一组操作,要么一起成功,要么一起失败. * 事务的特性: * 原子性:事务的不可分割 * 一致性:事务执行的前后,数据完整性保持一致. * 隔离性:一个事务的执行不应该受到另一个事务的干扰 * 持久性:事务一旦结束,将会永久修改到数据库. * 如果不考虑隔离性: * 脏读 :一个事务读到另一个未提交的数据. * 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致多次的查询结果不一致. * 虚读 :一个事务读到另一个事务已经提交的insert的数据,导致多次的查询结果不一致. * 解决读问题: * 未提交读:以上情况都能发生. * 已提交读:解决脏读,但是不可重复读和虚读有可能发生 * 重复读:解决脏读和不可重复读,但是虚读有可能发生. * 串行化:可以解决以上的所有情况. * JDBC进行事务的管理: * Connection: * setAutoCommit(boolean flag); * commit(); * rollback(); * DBUtils进行的事务的管理: 1.2 完成对商品的CRUD的操作,进行条件查询,分页查询.1.2.1 需求:购物的网站中需要显示商品的信息,在商品信息的显示中,如果商品的信息比较多.需要将比较多的商品进行分页的显示.进行条件查询.同时对商品进行修改,插入,删除. 1.2.2 分析:1.2.2.1 技术分析:使用MVC设计模式JSP + Servlet + JavaBean + JDBC实现商品信息的CRUD的操作. 1.2.2.2 步骤分析:【步骤一】:创建数据库和表 * create database web_14; * use web_14; * create table `product` ( `pid` varchar (96), `pname` varchar (150), `market_price` double , `shop_price` double , `pimage` varchar (600), `pdate` date , `is_hot` double , `pdesc` varchar (765), `pflag` double , `cid` varchar (96) ); 【步骤二】:创建工程导入jar包. * msysql驱动 * c3p0的包 * dbutils的包 * beanUtils的包:两个. * JSTL的包:两个 【步骤三】:创建包结构. 【步骤四】:创建一个首页: <h1>欢迎来到商品信息管理平台</h1> <h3><a href="${ pageContext.request.contextPath }/ProductFindAllServlet">查询所有商品</a></h3> 1.2.3 代码实现:1.2.3.1 商品的查询的功能:在首页上点击【查询所有商品】链接: 提交到Servlet中: * 调用业务层-->调用DAO: * 将商品列表保存到request域中: * 转发到商品列表页面: 在商品列表的页面中显示商品: 1.2.3.2 商品的添加的功能:在首页点击【添加】链接:跳转到添加页面. 在添加页面中输入信息:点击【提交】提交到Servlet 在Servlet中: * 接收数据: * 封装数据: * 调用业务层: * 页面跳转 * 重复提交的问题: * 添加完商品之后,转发到一个页面,刷新该页面. * 网速很慢,点击提交的按钮,其实已经在提交了但是网速慢,不停的点击提交. * 解决重复提交的根本解决办法:令牌机制(一次性). * 生成随机的令牌保存在session中. * 在表单的提交的时候,将随机的令牌放入到表单的隐藏字段中. * 在Servlet中获得session中和表单中的令牌是否一致. * 如果一致执行插入操作,不一致跳转到其他页面.将令牌销毁. * 代码实现: // 判断是否是重复提交: String token1 = (String)request.getSession().getAttribute("token"); String token2 = request.getParameter("token"); // 清空session中的令牌: request.getSession().removeAttribute("token"); if(!token2.equals(token1)){ request.setAttribute("msg", "亲!您已经提交过!请不要重复提交了!"); request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response); return; } 1.2.3.3 商品的信息的修改:在列表页面上点击【修改】链接: 提交到Servlet:根据id查询该商品.将商品的信息显示到修改页面: 在修改的页面上修改数据,点击【提交】按钮: 提交到Servlet:完成商品信息的修改: 1.2.3.4 商品的信息的删除:在列表页面上点击【删除】链接: 提交到Servlet: 调用业务层完成删除的操作: ***** 扩展删除多条记录: 1.2.3.5 商品模糊查询: 1.2.3.6 商品分页显示:分页条: 【首页】【上一页】[1][2][3][4]【下一页】【尾页】 分页功能的实现: * 物理分页:一次只查10条记录,点击下一页,再去查询后10条.使用SQL语句进行控制的分页. * 缺点:经常需要和数据库交互. * 优点:数据量特别大,不会导致内存的溢出. * 逻辑分页:一次性将所有数据全都查询出来,根据需要进行截取.List集合进行控制. subList(); * 缺点:数据量如果特别大,容易导致内存溢出. * 优点:与数据库交互次数少. * 不同的数据库对分页的语句也是不一样的: * MYSQL进行分页: 使用limit关键字. * select * from xxx where .. Group by ... Having ... Order by ... limit a,b; -- a:从哪开始 b:查询的记录数. * 根据页数计算 limit后面的两个参数: * currPage begin pageSize 1 0 10 2 10 10 3 20 10 * begin = (currPage - 1) * pageSize; * 参数的传递: * 前台--->后台:currPage * 后台--->前台:currPage,totalPage(总页数),totalCount(总记录数),pageSize,List集合. * 使用JavaBean封装参数: * 后台--->前台:传递一个JavaBean就可以. * Oracle进行分页: 使用SQL语句嵌套. * SQL Server数据库进行分页: 使用 top 关键字. * 在首页上添加一个分页查询的链接: 更多 传智播客·黑马程序员郑州校区地址 河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层 联系电话 0371-56061160/61/62 来校路线 地铁一号线梧桐街站A口出 |