首页 > 编程笔记 > Java笔记 阅读:3

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 继承。

查询数据库的具体步骤

对一个数据库中的表进行查询操作的具体步骤如下:

1) 创建Statement对象

Statement 对象是 Java 执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的 SQL 语句。

Statement 对象用 Connection 的 createStatement() 方法创建,代码如下:
Statement createStatement()throws SQLException
Statement createStatement(int resultSetType, int resultSetConcurrency)
throws SQLException
其中,resultSetType 参数有以下两个取值:
resultSetConcurrency 用来指定是否可以使用结果集更新数据库,它也有以下两个取值:
Statement 对象的常用方法如下表所示:

表: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 类型的值:
使用 getString() 可以返回所有列的值,不过返回的都是字符串类型的。XXX 可以代表的类型有:
注意,当使用 ResultSet 对象的 getXXX() 方法查看一行记录时,不可以颠倒字段的顺序。

使用 ResultSet 对象除了可以进行顺序查询外,还可返回滚动的结果集,代码如下:
Statement stmt=conn.createStatement(int type ,int concurrency);
根据参数 type、concurrency 的取值情况,stmt 返回相应类型的结果集。

type 的取值决定滚动方式,取值可以是如下几种:
concurrency的取值决定是否可以用结果集更新数据库,取值为如下几种:
滚动查询经常用到 ResultSet 的下述方法:

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+"'";
就能查询出在该系部的学生信息和指定学号的学生信息。

相关文章