与指定的数据库建立连接后,就可以使用JDBC提供的API对数据库进行操作,包括查询、新增、更新、删除等。
和数据库建立连接后,对数据库表进行查询操作的步骤如下:
由已创建的Connection对象con调用createStatement()方法创建Statement对象,代码如下:
Statement smt = con.createStatement();
创建Statement对象后,可以使用Statement对象调用executeQuery(String sql)方法执行SQL查询语句。该方法返回ResultSet对象,代表查询结果。
ResultSet对象是executeQuery(String sql)方法的返回值,被称为结果集,它代表符合SQL查询语句的所有行。
ResultSet对象自动维护指向其当前数据行的游标。每调用一次next()方法,游标向下移动一行。最初它位于结果集的第一行之前,因此第一次调用next(),将把游标置于第一行上,使它成为当前行。随着每次调用next(),游标向下移动一行,按照从上至下的次序获取ResultSet行,实现顺序查询。
ResultSet对象包含SQL查询语句的执行结果。它通过一套get()方法对这些行中的数据进行访问,即使用getXxx()方法获得数据。getXxx()方法很多,究竟使用哪一个,由列的数据类型来决定。使用getXxx()方法时,需要注意以下两点:
rs.getString(2);
rs.getString(1);
和数据库建立连接后,对数据库表进行新增、更新与删除操作的具体步骤如下:
Statement对象的创建与查询操作一样,由已创建的Connection对象con调用createStatement()方法创建。
创建Statement对象后,可以使用Statement对象调用executeUpdate(String sql)方法执行SQL语句,完成新增、更新与删除操作。
executeUpdate(String sql)方法主要用于执行INSERT、UPDATE或DELETE语句以及SQL DDL语句,例如CREATE TABLE和DROP TABLE。该方法返回一个整数(代表被更新的行数)对于CREATE TABLE和DROP TABLE等不操作行的指令,返回零。
页面addGoods.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="goodServlet" method="post">
<table border="1">
<tr>
<td>商品名称:</td>
<td><input type="text" name="gname"></td>
</tr>
<tr>
<td>商品价格:</td>
<td><input type="text" name="gprice"></td>
</tr>
<tr>
<td><input type="submit" value="添加"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
实体类Goods.java
package entity;
public class Goods {
private int id;
private String gname;
private Double gprice;
//此处省略了setter和getter方法
}
GoodServlet.java
package servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HTTPServlet;
import javax.servlet.http.HTTPServletRequest;
import javax.servlet.http.HTTPServletResponse;
import entity.Goods;
@WebServlet("/goodsServlet")
public class GoodsServlet extends HttpServlet {
private static fianl long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request,HttpServlet response) throws ServletException,IOException {
Connection con = null;
Statement st = null;
ResultSet rs = null;
//将查询结果装到集合ArrayList<Goods>中,并返回页面显示
ArrayList<Goods> allGoods = null;
//加载驱动
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e){
e.printStackTrace();
}
//建立连接
try{
con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?characterEncoding=utf-8","root","root");
st = con.creatStatement();
//发送添加SQL语句,实现添加的功能
request.setCharacterEncoding("utf-8");
st.executeUpdate("insert into goods values(null,'"+request.getParameter("gname")+"',"+request.getParameter("gprice")+")");
//发送查询SQL语句,返回结果集
rs = st.executeQuery("select * from goods");
//将查询结果装到集合ArrayList<Goods>中
allGoods = new Goods();
while(rs.next()){
Goods g = new Goods();
g.setId(rs.getInt(1));
g.setGName(rs.getString(2));
g.setGPrice(rs.getDouble(3));
allGoods.add(g);
}
rs.close();
st.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
//存到request对象,以便页面showAllGoods.jsp中显示
request.setAttribute("allGoods",allGoods);
//跳转到showAllGoods.jsp显示商品
RequestDispather dis = request.getRequestDispatcher("showAllGoods.jsp");
dis.forward(request,response);
}
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
doGet(request,response);
}
}
页面showAllGoods.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<! DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr>
<th>商品编号</th>
<th>商品名称</th>
<th>商品价格</th>
</tr>
<c:forEach items="${allGoods}" var="goods">
<tr>
<td>${goods.id}</td>
<td>${goods.gname}</td>
<td>${goods.gprice}</td>
</tr>
<c:forEach>
</table>
</body>
</html>
有时候需要结果集的游标前后移动,这时可使用滚动结果集。为了获得滚动结果集,必须首先用下面的方法得到一个Statement对象:
Statement st = con.createStatement(int type,int concurrency);
根据tyoe和concurrency的取值,当执行ResultSet = st.executeQuery(String sql)时,会返回不同类型的结果集。
type的取值决定滚动方式,它的取值如下:
concurrency的取值表示是否可以用结果集更新数据库,它的取值如下:
游动查询经常用到ResultSet的方法如下:
与数据库建立连接是一个耗资源的活动,每次都要花费一定的时间。这个时间对于一次或几次数据库连接,系统的开销或许不明显。可是对于大型电子商务网站,同时有成千上万人频繁地进行数据库连接操作,势必占用很多系统资源,网站的响应速度必定下降,严重时甚至会造成服务器的崩溃。因此,合理地建立数据库连接是非常重要的。
数据库连接池的基本思想是:为数据库建立一个“缓冲池”。预先在“缓冲池”中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。可以通过设定连接池最大连接数来防止系统无限度地与数据库连接。更为重要的是,通过连接池的管理机制见识数据库连接的数量及使用情况,为系统开发、测试和性能调整提供依据。
第一次访问连接池时,需要耗费一定的时间,这是因为在第一次访问时连接池中没有可用连接,但是第二次访问时连接池中就有了一些可用的连接,可以直接从连接池中获得连接来访问数据库。
加载驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
建立连接
Connection con=DriverManager.getConnection("jdbc:oracle:thin:@主机:端口号:数据库名","用户名","密码");
Connection con= DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;DatabaseName=mydatabase","用户名","密码");
加载驱动程序
Class.forName("oracle.jdbc.OracleDriver");
建立连接
Connection con= DriverManager.getConnection( "jdbc:oracle:thin:@主机:端口:数据库名","用户名","密码");
与Statement语句一样,PrepareStatement语句同样可以完成向数据库发送SQL语句、获取数据库操作结果的功能。PreparedStatement语句习惯地称为预处理语句。
分页查询一般有两种实现方式:一次查询出所有数据,在页面中进行分页显示;每页查询一次,每次只查询本页显示的数据。本节采用后者。
首先获得查询数据总条数totalCount,然后根据totalCount计算总页数totalPage,最后计算起始位置startIndex。
文章浏览阅读809次。实验 1-4 OSPF Stub区域与NSSA区域_你是公司的网络管理员。现在公司的网络中有五台arg3路由器,其中rta与rtb、rtb与rt
文章浏览阅读3.2w次,点赞3次,收藏2次。https://www.bilibili.com/video/BV1rP4y1X7HR/?spm_id_from=333.999.0.0&vd_source=0d70ce6ab7081e676bd093b0841e1607https://www.bilibili.com/video/BV1we4y137Wy/?spm_id_from=333.999.0.0&vd_source=0d70ce6ab7081e676bd093b0841e1607https://www.bilibili.com/vide
文章浏览阅读147次,点赞2次,收藏2次。根据微软的信息,用CreateStatusWindow函数生成状态栏是古老的方法,现在建议使用CreateWindow函数。生成标签控件时,在窗口样式中添加TCS_HOTTRACK的话,当鼠标出现在标签上时,文字的颜色会发生变化。下图中,鼠标没有硬拷贝,但鼠标是CHF标签上方的状态,文字变成了天蓝色。同样,在窗口样式中添加TCS_BUTTONS的话,标签的形状会变成按钮的形状。只显示标签、控件的程序tabctrl.c和根据按下的标签进行显示的程序tabcontr0l.c和各自的执行结果如下所示。_win32 sdk控件大全
文章浏览阅读237次。取证的信息可能隐藏在正常的、已删除的或受损的文件中,您可能需要运用编码转换技术、加解密技术、隐写技术、数据恢复技术,还需要熟悉常用的文件格式(如办公文档、压缩文档、图片等)。A集团的Linux服务器被黑客入侵,该服务器的Web应用系统被上传恶意软件,系统文件被恶意软件破坏,您的团队需要帮助该公司追踪此网络攻击的来源,在服务器上进行全面的检查,包括日志信息、进程信息、系统文件、恶意文件等,从而分析黑客的攻击行为,发现系统中的漏洞,并对发现的漏洞进行修复。_信息安全管理与评估赛项 单机取证镜像下载
文章浏览阅读285次。python 练习题_蓝桥杯 最短路 如下图所示,gg 是一个无向图,其中蓝色边的长度是 11、橘色边的长度
文章浏览阅读6.7w次,点赞40次,收藏267次。CSS 中的justify-content属性用于描述弹性盒子容器的对齐方式。它包含沿着分布在浏览器中的 flex 容器的主轴的内容项之间和周围的空间。注意:此属性不能用于沿垂直轴描述项目或容器。为了垂直对齐项目,我们可以使用align-items 属性在应用了 lengths 和 auto margins 属性后,对齐是可能的,即,如果在Flexbox 布局中至少有一个具有flex-grow 属性而不是 0 的灵活元素,那么它不会影响并且有任何影响不会有任何可用空间。句法:justi_justify-content属性值
文章浏览阅读6.6k次,点赞6次,收藏69次。本文主要介绍Linux和Windows下使用C语言获取各种硬件信息,包括CPU序列号、硬盘序列号、网卡信息(包括网卡名字、IP地址、MAC地址、网卡是否插入网线等)。_c获取cpu序列号
文章浏览阅读1.3k次。由于在Lucene中段具有不变性,所以删除一个文档后不会立即从硬盘中删除该文档,而是产生一个.del文件专门记录被删除的文档。而在检索的过程中,被删除的文件还会参与检索,只不过最后会被过滤,如果被删除的文件太多,则也会影响查询的效率。【Elasticsearch】Elasticsearch如何物理删除给定期限的历史数据?我们知道删除数据会在段合并的时候,进行物理删除,参考【Elasticsearch】elasticsearch 段 segment 段合并。
文章浏览阅读866次。了解UART1.serial communication Serial communication is a communication method that uses one or two transmission lines to send and receive data, and that data is continuously sent and received one b..._rs232为啥是负逻辑
文章浏览阅读1.9w次,点赞8次,收藏30次。date gmv 2019-01-01 115.7 2019-01-02 180.1 2019-01-03 296.8 2019-01-04 706.0 2019-01-05 703.5 2019-01-06 527.3 2019-01-07 462.9 2019-01-08 270.1 2019-01-09..._日环比周同比
文章浏览阅读2.9w次,点赞69次,收藏73次。高版本JDK没有javax.annotation.jar包解决方案,高版本JDK无法使用@Resource解决方案_javax.annotation
文章浏览阅读471次。看到 一篇文档, 讲 对象存储, 好奇,搜索文章,摘抄,学习记录 !背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化、成本过高、并非PB级的扩展、不支持永远在线、专有的一体机设备等等,非结构化数据以每年60%~80%的速率增长,从而可扩展性变成了最迫切的需求。传统存储在面对海量非结构化数据时,..._对象存储连接协议相比文件存储使用复杂。