Java JDBC查询MySQL数据库(附带实例)
和数据库建立连接后,就可以使用 JDBC 提供的 API 和数据库交互信息,比如查询和更新数据库中的表等。JDBC 提供的 API 可以将标准的 SQL 语句发送给数据库,实现和数据库的交互。
在查询数据库中的记录时,都是通过标准的 SQL 语句来实现的。SQL 查询语句即 SELECT 语句,是 SQL 语句的核心。
JDBC 能实现以下3个方面的功能:同一个数据库建立连接、向数据库发送SQL语句和处理数据库返回的结果,如下图所示:

图 1 JDBC驱动
JDBC 提供了 3 种接口来实现 SQL 语句的发送执行,它们分别是 Statement、PreparedStatement 和 CallableStatement:
PreparedStatement 继承了 Statement,而 CallableStatement 又从 PreparedStatement 继承。
Statement 对象用 Connection 的 createStatement() 方法创建,代码如下:
resultSetConcurrency 用来指定是否可以使用结果集更新数据库,它也有以下两个取值:
Statement 对象的常用方法如下表所示:
ResultSet 对象以统一形式的数据行组成,如下图所示:

图 2 ResultSet对象
ResultSet 对象使用一次只能看到一个数据行,使用 next() 方法到下一数据行,获得一行数据后,ResultSet 对象可以使用 getXXX() 方法获得字段值,将位置索引(第一列使用 1,第二列使用 2 等)或字段名传递给 getXXX() 方法的参数即可。
其中,getXXX() 方法的参数可以使用整型表示第几列(索引号从 1 开始),还可以是列名,返回的是对应的 XXX 类型的值:
使用 getString() 可以返回所有列的值,不过返回的都是字符串类型的。XXX 可以代表的类型有:
注意,当使用 ResultSet 对象的 getXXX() 方法查看一行记录时,不可以颠倒字段的顺序。
使用 ResultSet 对象除了可以进行顺序查询外,还可返回滚动的结果集,代码如下:
type 的取值决定滚动方式,取值可以是如下几种:
concurrency的取值决定是否可以用结果集更新数据库,取值为如下几种:
滚动查询经常用到 ResultSet 的下述方法:
【实例】编写 Web 应用程序,在计算机屏幕上用表格的形式显示出所有学生的信息:

图 3 整表查询数据
在 SQL 中,WHERE 子句用于规定选择的标准,如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句,语法如下:
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
【实例】编写 Web 应用程序,客户通过 JSP 页面输入查询条件,计算机屏幕上用表格的形式显示出学生的信息。
index.jsp 页面代码如下:

图 4 条件查询
要是想满足多个条件呢?可以更进一步检索满足多个条件下的序列,使用 AND 和 OR 运算符基于一个以上的条件对记录进行过滤。
在上面的例题中,只需要把对应的 SQL 语句修改成:
就能查询出在该系部下的指定学号的学生信息。把对应的 SQL 语句修改成:
在查询数据库中的记录时,都是通过标准的 SQL 语句来实现的。SQL 查询语句即 SELECT 语句,是 SQL 语句的核心。
JDBC 能实现以下3个方面的功能:同一个数据库建立连接、向数据库发送SQL语句和处理数据库返回的结果,如下图所示:

图 1 JDBC驱动
JDBC 提供了 3 种接口来实现 SQL 语句的发送执行,它们分别是 Statement、PreparedStatement 和 CallableStatement:
- Statement 接口的对象用于执行简单的不带参数的 SQL 语句;
- PreparedStatement 接口的对象用于执行带有 IN 参数的预编译过的 SQL 语句;
- CallableStatement 接口的对象用于执行一个数据库的存储过程。
PreparedStatement 继承了 Statement,而 CallableStatement 又从 PreparedStatement 继承。
查询数据库的具体步骤
对一个数据库中的表进行查询操作的具体步骤如下:1) 创建Statement对象
Statement 对象是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。Statement 对象用 Connection 的 createStatement() 方法创建,代码如下:
Statement createStatement()throws SQLException Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException其中,resultSetType 参数有以下两个取值:
- ResultSet.TYPE_SCROLL_INSENSITIVE:游标上下滚动,数据库变化时,当前结果集不变;
- ResultSet.TYPE_SCROLL_SENSITIVE:游标上下滚动,数据库变化时,结果集随之变动。
resultSetConcurrency 用来指定是否可以使用结果集更新数据库,它也有以下两个取值:
- ResultSet.CONCUR_READ_ONLY:结果集不能被更新。
- ResultSet.CONCUR_UPDATABLE:结果集可以更新。
Statement 对象的常用方法如下表所示:
方法 | 功能描述 |
---|---|
ResultSet executeQuery(String sql) | 执行给定的 SQL 语句,该语句返回单个 ResultSet 对象 |
boolean execute(String sql) | 执行静态 SQL 语句,该语句可能返回多个结果集 |
void clearBatch() | 清空这个 Statement 对象的 SQL 命令列表 |
int addBatch(String sql) | 将指定的 SQL 命令添加到 Batch 中,参数 sql 通常为 INSERT 或者 UPDATE 语句,如果驱动程序不支持批处理,将抛出异常 |
void close() | 释放 Statement 占用的数据库和 JDBC 资源 |
2) 向数据库发送SQL查询语句
执行 Statement 对象,被发送到数据库的 SQL 语句将被作为参数提供给 Statement 的方法,代码如下:ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2");
3) 处理查询结果
Statement 对象可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个 ResultSet 声明的对象中。也就是说 SQL 查询语句对数据库的查询操作将返回一个 ResultSet 对象。ResultSet 对象以统一形式的数据行组成,如下图所示:

图 2 ResultSet对象
ResultSet 对象使用一次只能看到一个数据行,使用 next() 方法到下一数据行,获得一行数据后,ResultSet 对象可以使用 getXXX() 方法获得字段值,将位置索引(第一列使用 1,第二列使用 2 等)或字段名传递给 getXXX() 方法的参数即可。
其中,getXXX() 方法的参数可以使用整型表示第几列(索引号从 1 开始),还可以是列名,返回的是对应的 XXX 类型的值:
- 如果对应列是空值,XXX 是对象,则返回 XXX 类型的空值;
- 如果 XXX 是数字类型,如 Float 等,则返回 0,为 Boolean 则返回 false。
使用 getString() 可以返回所有列的值,不过返回的都是字符串类型的。XXX 可以代表的类型有:
- 基本的数据类型,如整型(Int)、布尔型(Boolean)、浮点型(Float、Double)、比特型(Byte);
- 一些特殊的类型,如日期类型(java.sql.Date)、时间类型(java.sql.Time)、时间戳类型(java.sql.Timestamp)、大数型(BigDecimal和 BigInteger 等)等。
注意,当使用 ResultSet 对象的 getXXX() 方法查看一行记录时,不可以颠倒字段的顺序。
使用 ResultSet 对象除了可以进行顺序查询外,还可返回滚动的结果集,代码如下:
Statement stmt=conn.createStatement(int type ,int concurrency);根据参数 type、concurrency 的取值情况,stmt 返回相应类型的结果集。
type 的取值决定滚动方式,取值可以是如下几种:
- ResultSet.TYPE_FORWARD_ONLY:结果集的游标只能向下滚动。
- ResultSet.TYPE_SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
- ResultSet.TYPE_SCROLL_SENSITIVE:返回可滚动的结果集,当数据库变化时,当前结果集同步改变。
concurrency的取值决定是否可以用结果集更新数据库,取值为如下几种:
- ResultSet.CONCUR_READ_ONLY:不能用结果集更新数据库中的表。
- ResultSet.CONCUR_UPDATABLE:能用结果集更新数据库中的表。
滚动查询经常用到 ResultSet 的下述方法:
- public boolean previous():将游标向上移动,该方法返回 Boolean 型数据,当移到结果集第一行之前时返回 false。
- public void beforeFirst():将游标移到结果集的初始位置,即在第一行之前。
- public void afterLast():将游标移到结果集最后一行之后。
- public void first():将游标移到结果集的第一行。
- public void last():将游标移到结果集的最后一行。
- public boolean isAfterLast():判断游标是否在最后一行之后。
- public boolean isBeforeFirst():判断游标是否在第一行之前。
- public boolean ifFirst():判断游标是否指向结果集的第一行。
- public boolean isLast():判断游标是否指向结果集的最后一行。
4) 关闭Statement对象
Statement 对象将由 Java 垃圾收集程序自动关闭。为培养一种好的编程习惯,应在不需要 Statement 对象时显式地关闭它们,这将立即释放 DBMS 资源,有助于避免潜在的内存问题。【实例】编写 Web 应用程序,在计算机屏幕上用表格的形式显示出所有学生的信息:
<%@page contentType="text/html;charset=UTF-8" language="java" %> <%@page import="java.sql.*" %> <html> <head> <title>整表查询数据</title> <%! ResultSet rs;%> <% String dbName = "STUDB"; String userName = "root"; String userPasswd = "123456"; String url = "jdbc:mysql://localhost/" + dbName + "?user=" + userName + "&password=" + userPasswd+"&useUnicode=true&characterEncoding=utf-8"; Connection conn = DriverManager.getConnection(url); Statement statement = conn.createStatement(); String sql = "select * from student"; rs = statement.executeQuery(sql); %> </head> <body> <table border="1"> <th colspan="7" style=" font-size: x-large; alignment: center">学生信息表</th> <tr style=" text-align: center"> <td>学号</td> <td>姓名</td> <td>性别</td> <td>政治身份</td> <td>出生日期</td> <td>身份证号</td> <td>所在系部</td> </tr> <% while (rs.next()) { %> <tr style=" text-align: center"> <td><%= rs.getString(1) %></td> <td><%= rs.getString(2) %></td> <td><%= rs.getString(3) %></td> <td><%= rs.getString("stu_politicalstatus") %></td> <td><%= rs.getString("stu_birthday")%></td> <td><%= rs.getString("stu_identitycard")%></td> <td><%= rs.getString("stu_speciality")%></td> </tr> <% } %> </table> </body></html>效果如下图所示:

图 3 整表查询数据
在 SQL 中,WHERE 子句用于规定选择的标准,如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句,语法如下:
SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
【实例】编写 Web 应用程序,客户通过 JSP 页面输入查询条件,计算机屏幕上用表格的形式显示出学生的信息。
index.jsp 页面代码如下:
<html> <head></head> <body> <form action="first.jsp" method="post" > <table> <th colspan="2">查询条件</th> <tr> <td>学号:</td> <td><input type="text" name="stuid" id="stuid"/></td> </tr> <tr aria-rowspan="2"> <td><input type="submit" value=" 提交"></td> </tr> </table> </form> </body></html> first.jsp 页面代码如下: <%@page import="java.sql.*" %> <% String id=request.getParameter("stuid");%> <html> <head> <title>条件查询</title> <%! ResultSet rs;%> <% String dbName = "STUDB"; String userName = "root"; String userPasswd = "123456"; String url = "jdbc:mysql://localhost/" + dbName + "?user=" + userName + "&password=" + userPasswd+"&useUnicode=true&characterEncoding=utf-8"; Connection conn = DriverManager.getConnection(url); Statement statement = conn.createStatement(); String sql = "select * from student where stu_no='"+id+"'"; rs = statement.executeQuery(sql); %> </head> <body> <table border="1"> <th colspan="7" style=" font-size: x-large; alignment: center"> 学生信息表 </th> <tr style=" text-align: center"> <td>学号</td> <td>姓名</td> <td>性别</td> <td>政治身份</td> <td>出生日期</td> <td>身份证号</td> <td>所在系部</td> </tr> <% while (rs.next()) { %> <tr style=" text-align: center"> <td><%= rs.getString(1) %></td> <td><%= rs.getString(2) %></td> <td><%= rs.getString(3) %></td> <td><%= rs.getString("stu_politicalstatus") %></td> <td><%= rs.getString("stu_birthday")%></td> <td><%= rs.getString("stu_identitycard")%></td> <td><%= rs.getString("stu_speciality")%></td> </tr> <% } %> <% rs.close(); statement.close(); conn.close(); %> </table> </body> </html>条件查询效果如下图所示:

图 4 条件查询
要是想满足多个条件呢?可以更进一步检索满足多个条件下的序列,使用 AND 和 OR 运算符基于一个以上的条件对记录进行过滤。
在上面的例题中,只需要把对应的 SQL 语句修改成:
String sql = "select * from student where stu_speciality='软件技术' and stu_no='"+id+"'";
就能查询出在该系部下的指定学号的学生信息。把对应的 SQL 语句修改成:
String sql = "select * from student where stu_speciality='数字艺术' or stu_no='"+id+"'";就能查询出在该系部的学生信息和指定学号的学生信息。