第 5 章 结合javabean实现CRUD
第 5 章 结合javabean实现CRUD
注意
- 了解如何在jsp中使用自定义的javabean。
- 了解一些jsp动作(action)。
- 使用jdbc操作数据库。
5.1. 概念和命名方式
- CRUD是Create(创建)、Read(读取)、Update(更新)和Delete(删除)的缩写,一般应用有这四项也就足够了。我们这里的例子是对联系人信息进行CRUD操作。
- javabean是把一些操作集合在一起写成一个java类,想要进行什么操作直接调用这个类里的方法就行。咱们这里使用javabean的地方有两处,一个是链接数据库并进行CRUD操作,另一个把每条数据都写 成一个类。
- list.jsp。读取所有信息并显示到页面上,这个是CRUD中Read(读取)。
- create.jsp。进入添加联系信息的页面,等待用户输入信息。save.jsp。接收用户提交的信息,添加到数据库中。这两步对应CRUD中的Create(创建)。
- edit.jsp。进入修改联系信息的页面,等待用户修改信息。update.jsp。接收用户提交的信息,修改数据库中对应的信息。这两步对应CRUD中的Update(更新)。
- remove.jsp。删除用户选择的信息。这步对应CRUD中的Delete(删除)。
5.2. Read(读取)
<%@ page contentType="text/html; charset=gb2312"%> <jsp:forward page="list.jsp"/>
<%request.getRequestDispatcher("list.jsp").forward(request, response); %>
<jsp:useBean class="anni.ContactDao" id="contactDao" scope="application"/>
<%anni.ContactDao contactDao = (anni.ContactDao) application.getAttribute("contactDao");if (contactDao == null) {contactDao = new anni.ContactDao();application.setAttribute("contactDao", contactDao);} %>
<%List list = contactDao.getAll();for (int i = 0; i < list.size(); i++) {pageContext.setAttribute("contact", list.get(i));pageContext.setAttribute("row", i % 2 != 0 ? "odd" : "even"); %><tr class="${row}" οnmοuseοver="this.className='highlight';" οnmοuseοut="this.className='${row}';"><td>${contact.username}</td><td>${contact.sex}</td><td>${contact.email}</td><td>${contact.qq}</td><td>${contact.descn}</td><td><a href="edit.jsp?id=${contact.id}">修改</a> | <a href="remove.jsp?id=${contact.id}">删除</a></td></tr> <%} %>
5.3. Create(创建)
<jsp:useBean class="anni.ContactDao" id="contactDao" scope="application"/> <jsp:useBean class="anni.Contact" id="contact"/> <jsp:setProperty name="contact" property="*"/> <%contactDao.save(contact);response.sendRedirect("list.jsp"); %>
contact.setUsername(request.getParameter("username")); contact.setSex(request.getParameter("sex")); contact.setEmail(request.getParameter("email")); contact.setQq(request.getParameter("qq")); contact.setDescn(request.getParameter("descn"));
contactDao.save(contact); response.sendRedirect("list.jsp");
5.4. Update(更新)
<a href="edit.jsp?id=${contact.id}">修改</a>
<jsp:useBean class="anni.ContactDao" id="contactDao" scope="application"/> <%String id = request.getParameter("id");Contact contact = contactDao.get(Long.parseLong(id));pageContext.setAttribute("contact", contact); %>
<input type="text" name="username" value="${contact.username}" />
<input type="hidden" name="id" value="${contact.id}" />
contactDao.update(contact);
5.5. Delete(删除)
<a href="remove.jsp?id=${contact.id}">删除</a>
<jsp:useBean class="anni.ContactDao" id="contactDao" scope="application"/> <%String id = request.getParameter("id");contactDao.remove(Long.parseLong(id));response.sendRedirect("list.jsp"); %>
5.6. 用jdbc操作数据库
- Class.forName("org.hsqldb.jdbcDriver");加载jdbc驱动。Class.forName()是惯用写法,可以强制加载指定的类,org.hsqldb.jdbcDriver是hsqldb驱动的名称,只需要记忆即可。
- 与数据库建立连接。
DriverManager.getConnection("jdbc:hsqldb:res:/hsqldb/contact", "sa", "");
三个参数分别是连接数据库使用的url,登录用户名和密码。url以jdbc:hsqldb:开头,表明它将使用hsqldb的驱动,后面的res:/hsqldb/contact是hsqldb的一种连接方式,它将去classpath下的hsqldb目录中读取名为contact的数据库文件作为初始配置,在这里classpath就是指的WEB-INF/classes/,你可以在WEB-INF/classes/hsqldb/下看到两个数据库文件,contact.properties和contact.script。 - 数据库连接十分消耗系统资源,一定要记得在使用完成后关闭,一旦忘记关闭,资源很快就会耗尽,你会得到一连串无法连接数据库的错误。anni.DbUtils中我们提供了一个close()方法来关闭连接。
create table contact (id bigint,username varchar(100),sex varchar(100),email varchar(100),qq varchar(100),descn varchar(200) );
package anni; public class Contact {private Long id;private String username;private String sex;private String email;private String qq;private String descn;// getter and setter }
- Read(读取)。
/*** 获得所有联系簿.** @return contact列表*/ public List<Contact> getAll() throws Exception {Connection conn = null;Statement state = null;ResultSet rs = null;List<Contact> list = new ArrayList<Contact>();try {conn = DbUtils.getConn();state = conn.createStatement();rs = state.executeQuery("select * from contact");while (rs.next()) {Contact contact = new Contact();contact.setId(rs.getLong("id"));contact.setUsername(rs.getString("username"));contact.setSex(rs.getString("sex"));contact.setEmail(rs.getString("email"));contact.setQq(rs.getString("qq"));contact.setDescn(rs.getString("descn"));list.add(contact);}} finally {DbUtils.close(rs, state, conn);}return list; }
第一步,使用DbUtils.getConn()建立与数据库的连接Connection。第二步,从Connection创建一个Statement。第三步,使用Statement执行sql查询语句,返回查询结果集ResultSet。第四步,将ResultSet中的数据转换成Contact队列。第五步,关闭数据库的连接,并返回Contact队列作为结果。Connection -> Statement -> ResultSet -> close()是一个查询功能的基本结构。这里使用的sql语句会获得数据库中所有的联系信息,所以我们循环读取ResultSet最后得到一个Contact队列。另一个方法public Contact get(Long id)中会根据指定的主键获得一条对应记录,虽然依然返回ResultSet,但这次ResultSet中只包含一条数据,所以最终只会获得一个Contact对象。 - Create(创建)
/*** 向数据库插入一条数据.** @param contact 联系信息*/ public void save(Contact contact) throws Exception {Connection conn = null;PreparedStatement state = null;try {conn = DbUtils.getConn();state = conn.prepareStatement("insert into contact(username,sex,email,qq,descn) values(?,?,?,?,?)");state.setString(1, contact.getUsername());state.setString(2, contact.getSex());state.setString(3, contact.getEmail());state.setString(4, contact.getQq());state.setString(5, contact.getDescn());state.executeUpdate();} finally {DbUtils.close(null, state, conn);} }
第一步,使用DbUtils.getConn()建立与数据库的连接Connection。第二步,从Connection创建一个PreparedStatement。第三步,向PreparedStatement中设置参数。第四步,使用PreparedStatement执行更新。第五步,关闭数据库的连接,并返回Contact队列作为结果。Connection -> PreparedStatement -> 设置数据,执行更新 -> close()是一个更新数据库的基本结构,更新不需要返回数据,所以没有ResultSet。PreparedStatement可以帮助我们免受拼接字符串之苦,如果依旧使用Statement,会产生下面这种代码。state = conn.createStatement("insert into contact(username,sex,email,qq,descn) values('" +contact.getUsername() + "','" +contact.getSex() + "','" +contact.getEmail() + "','" +contact.getQq() + "','" +contact.getDescn() + "')");
代码又臭又长,容易出错外加难以维护,你少写一个单引号不会引起编译错误,但是运行的时候会给你一大堆错误,最后连问题在哪里都找不到,推荐大家在需要设置参数的时候尽量使用PreparedStatement。另外PreparedStatement也能防止系统被“注入***”。 - Update(更新)
update contact set username=?,sex=?,email=?,qq=?,descn=? where id=?
- Delete(删除)
delete from contact where id=?
注意
转载于:https://blog.51cto.com/77857/167120
第 5 章 结合javabean实现CRUD相关推荐
- AVUE crud upload组件示例
在项目中使用avue crud组件,其中用到了upload组件. 官网中关于upload的解释非常简单,需要仔细阅读参数配置含义. 给出示例: 表banner(轮播横幅图表)使用avue进行CRUD操 ...
- Java基础篇:JDBC核心技术
文章目录 第1章:JDBC概述 1.1 数据的持久化 1.2 JDBC介绍 1.3 JDBC程序编写步骤 第2章:获取数据库连接 2.1 要素一:Driver接口实现类 2.1.1 Driver接口介 ...
- 李兴华html css,2014MLDN(李兴华老师视频教程)
资源内容: 2014MLDN(李兴华老师视频教程)|____开发工具 |____ideaIU-15.0.3.exe |____ideaIU-15.0.2.exe ...
- 深入浅出JDBC核心技术
文章目录 JDBC核心技术--课程笔记 第1章:JDBC概述 1.1 数据的持久化 1.2 Java中的数据存储技术 1.3 JDBC介绍 1.4 JDBC体系结构 1.5 JDBC程序编写步骤 第2 ...
- 【Java基础】JDBC
JDBC核心技术 第1章:JDBC概述 1.1 数据的持久化 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数 ...
- JavaWeb--JDBC核心技术
JavaWeb--JDBC核心技术 JDBC核心技术 第1章:JDBC概述 1.1 数据的持久化 1.2 Java中的数据存储技术 1.3 JDBC介绍 1.4 JDBC体系结构 1.5 JDBC程序 ...
- Java Web开发实战经典 李兴华版 读书笔记(一)
有的时候总感觉读书没有效率,或是记不住,或是不能专注.所以,把读的书都做一个笔记.贴上来.方便日后回顾. 本人java后端开发,大概算个中级程序员.所以笔记中的难易程度都是根据我自身水平的判断. 看完 ...
- Java全栈(三)数据库技术:3.数据库之JDBC上
第一章 JDBC概述 之前我们学习了JavaSE,编写了Java程序,数据保存在变量.数组.集合等中,无法持久化,后来学习了IO流可以将数据写入文件,但不方便管理数据以及维护数据的关系: 后来我们学习 ...
- JDBC核心技术学习
JDBC核心技术 作者:kuikui 文章目录 JDBC核心技术 第1章:JDBC概述 1.1 数据的持久化 1.2 Java中的数据存储技术 1.3 JDBC介绍 1.4 JDBC体系结构 1.5 ...
最新文章
- 多传感器融合 | R-LINS概述
- R语言应用uniroot函数求解方程的根(一元解):仿真数据(方程式可视化、并添加y=0的水平横线)、uniroot函数求解方程的根(并添加方程根对应的垂直竖线)
- python pandas DataFrame 查找NaN所在的位置
- 假设写一段代码引导PC开机这段代码是 ? Here is a tiny quot;OSquot; :-D
- Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster
- 科大星云诗社动态20210904
- Hook技术--Activity的启动过程的拦截
- java 索引排序_Java培训MySQL之排序分组优化索引的选择
- 洛谷 - P2761 软件补丁问题(spfa+状压)
- Java网络编程1---基础
- AutoLayout的那些事儿
- “” '' ``区别 初学者自用
- java视频压缩 lz4_一种视频序列帧的压缩方法、解压方法及装置与流程
- 【NOI1998】免费馅饼,膜一膜XYX大爷
- 物理学与计算机相关参考文献,物理学专业论文参考文献
- 微软新开源!不用写 1 行代码的自动化测试工具
- c++数据格式化输出/字符串复制/字符串比较
- Qt-十字消除小游戏
- Tetris(俄罗斯方块)
- OSError: Could not find kaggle.json. Make sure it‘s located in /Users/peco/.kaggle
热门文章
- opencart配置United States Postal Service快递
- 《面向模式的软件体系结构3-资源管理模式》读书笔记(3)--- Eager Acquisition模式...
- 浮躁的世界里 我们要的是生活
- Mysql查看编码方式专题
- 彼尔盖茨的十句话,绝对让你改变一生
- 可以设置选项背景颜色的DropDownList
- Cesium 加载天地图
- 大型云原生项目在数字化企业落地过程解密 1
- [转] C#2010 在TreeView控件下显示路径下所有文件和文件夹
- MinGW GCC 7.1.0 2017年6月份出炉啦