起步
- 下载jdbc驱动程序
- 导包:找到自己Tomcat文件夹下的lib目录,将jdbc驱动程序压缩包放入
利用JDBC查询数据库的步骤:
- 载入JDBC驱动程序:在Class.forName方法中指定数据库驱动程序的类名,这样就自动创建了驱动程序的实例,并注册到JDBC驱动管理器
- 建立连接
- 创建并使用Statement对象,向数据库发送查询和命令
- 执行查询或更新
- 结果处理
- 关闭连接
载入JDBC驱动程序
常用数据库驱动程序类名
- Oracle驱动程序类:
oracle.jdbc.driver.OracleDriver
- SQLServer驱动程序类:
com.microsoft.jdbc.sqlserver.SQLServerDriver
- MySQL驱动程序类:
com.mysql.jdbc.Driver
加载过程是使用Class.forName()
方法将驱动程序加载到运行环境中。加载的时候,驱动程序会自动在驱动程序管理器中完成注册。加载过程中如果未找到驱动程序或驱动程序版本不相应,会产生ClassNotFoundExection
异常
String driverName = "com.mysql.jdbc.Driver";
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
建立连接
定义URL
MySql的URL:jdbc:mysql://地址:端口/数据库
建立连接
建立实际的网络连接时,需要将URL、数据库用户名和数据库密码传递给DriverManager类的getConnection方法。如果连接不能建立,会产出SQLExection异常
String url = "jdbc:mysql://localhost:3306/test_jdbc";
String username = "root";
String password = "123456";
try {
Connection conn = DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
创建并使用Statement对象
Sataement对象用来向数据库发送查询和命令。它由Connect的createStatement方法创建
Connection conn = DriverManager.getConnection(url, username, password);
Statement statement = conn.createStatement();
执行查询或更新
通常使用Statement对象的3个基本方法来执行SQL命令
executeQuery
该方法用来执行查询命令,返回一个ResultSet(结果集)对象,ResultSet可能为空,但不会是null
ResultSet rs = statement.executeQuery(sql);
executeUpdate
该方法主要是用来执行插入、删除及修改记录操作,返回一个int整型值,该值是被更新的行数,可以为0。该方法也支持create table
等命令
int n = statement.executeUpate(sql);
execute
该方法主要用来执行一般的SQL命令,包括增删改查以及数据定义,返回一个布尔值,显示了是否返回一个查询结果集Request对象。如果返回一个结果集可以再通过statement.getResulrSet
方法获取一个ResultSet对象
Boolean b = statement.execute(sql);
if (b){
ResultSet rs=statement.getResultSet();
}
结果处理
ResultSet对象的每条记录结果代表了一个数据表行。处理结果最简单的方式是使用ResultSet的next方法在表中移动,每次一行
在一行内,ResultSet提供了各种getXxx方法,它们都以列名或者索引为参数,以各种不同的Java类型返回结果
while(rs.next){
String name=rs.getString("name");
......
}
关闭连接
conn.close();
关闭连接还会关闭对应的Statement和ResultSet对象
实例:从数据库获取内容,并将内容以表格的形式显示到页面中
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.ResultSet"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
try {
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//连接数据库
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test_jdbc", "root", "123456");
//创建Statement对象
Statement statement = con.createStatement();
//执行sql语句
String sql = "select * from user";
//处理结果
ResultSet rs = statement.executeQuery(sql);
out.print(" <table cellspacing=\"1\" border=\"1\">");
out.print(" <tr><td>编号</td><td>书名</td><td>作者</td><td>名言</td></tr>");
while (rs.next()) {
out.print("<tr><td>" + rs.getString(1) + "</td>" + "<td>" + rs.getString(2) + "</td>" + "<td>"
+ rs.getString(3) + "</td>" + "<td>" + rs.getString(4) + "</td></tr>");
}
out.print("</table>");
con.close();
} catch (ClassNotFoundException e) {
System.out.print("加载失败");
e.printStackTrace();
}
%>
</body>
</html>
效果比较普通
使用预编译语句(PrepareStatement)
可以多次执行类似的语句,使用参数化(预编译)语句要比每次都执行原始的查询更有效率
提高安全性,预防SQL注入攻击
实例
Connect con = DriverManager.getConnect();
String sql = "insert into users (username,age) values(?,?)";
PrepareStatement ps=con.CreateStatement(sql);
ps.setString(1,"张三");
ps.setInt(2,25);
ps.setString(1,"张五");
ps.setInt(2,25);
ps.executeUpdate();
注:
? 占位符,表示该位置是一个参数
setXxx(index,value) 根据参数的类型,选择对应的set方法,设置参数的值
index 索引,从1开始表示是第几个?号
value 要设置的值
PrepareStatement对象同样可以使用Statement对象的各种方法
补充
ResultSetMetaData
ResultSetMetaData用于获取关于ResultSet对象中列的类型和属性信息
//从ResultSet中获取ResultSetMetaData对象
ResultSetMetaData rsmd=resultSet.getMetaData();
//ResultSetMetaData对象的常用方法
getColumnCount() 返回ResultSet中的列数
getColumnName(int n) 返回序号为n的列数
getColumnType(int n) 返回此列的SQL数据类型,返回值为整数