-
JDBC简介
JDBC全称为:Java DataBase Connectivity(java数据库连接)。SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。
-
编写JDBC程序的步骤
-
导包(导入厂商提供的数据库驱动)
-
注册驱动
-
连接数据库
-
操作数据库(执行sql)
-
关闭资源
-
JDBC中的类
1.DriverManager : 用于注册驱动,获得连接。
DriverManager.registDriver(new Driver()),这种注册驱动方式实际开发中不用。在驱动类的代码中,有一个静态代码块已经做了注册驱动的事情。 所以我们只需要加载驱动类,就相当于调用了 registDriver 方法。如果调用registDriver 方法, 那么相当于创建了两个Driver对象,浪费资源.
所以开发中使用Class.forName("com.mysql.jdbc.Driver")方法注册驱动。驱动类的名称是以字符串的形式填写,那么我们把该名称放到配置文件中,每次从配置文件中读取. 那么切换驱动类就非常方便. 也就意味着切换数据库方便.
2.Connection : 代表连接 , 获得Statement对象
DriverManager.getConnection("url","用户名","密码");
void setAutoCommit(boolean autoCommit) 设置是否自动提交
void commit() 提交
void rollback() 回滚
Savepoint setSavepoint(String name) 设置保存点
Statement createStatement() 创建statement对象
CallableStatement prepareCall(String sql) 调用数据库的存储过程
PreparedStatement prepareStatement(String sql) 创建 PreparedStatement 对象
3.Statement : 运送sql语句
该对象可以理解为一个 向数据库运送sql语句的 "小车";
方法:
void addBatch(String sql) 向车上添加语句. (用于批量执行sql语句); insert update delete
int[] executeBatch() 将车上的语句 运送给数据库执行. 返回值存放每个语句执行后影响的行数. 因为是多个语句,所以用数组装.
void clearBatch() 清除车上的语句.
----以上3个方法是批量执行sql相关的----------------------
boolean execute(String sql) 执行一个sql语句. 如果该语句返回结果集 返回值为true(select). 如果该语句不返回结果集 返回false(insert update delete);
ResultSet executeQuery(String sql) 执行一个有结果集的查询. 会将结果集包装到resultset对象中.(select)
int executeUpdate(String sql) 执行一个没有结果集的语句. 会将语句影响的行数返回.(insert update delete)
开发时一般用PrepareStatement方法,使用PrepareStatement对象 在执行sql语句时,会分为两步. 第一步将sql语句 "运送" 到mysql上编译. 再回到 java端 拿到参数 运送到mysql端. 用户填写的 sql语句,就不会参与编译. 只会当做参数来看. 避免了sql注入问题;
4.ResultSet : 运行的结果
当执行的语句是查询语句时, resultSet对象用于封装查询结果.
方法:
boolean next() 该方法让结果集中的指针(游标)往下移动一行.并且判断改行是否有数据。 有返回true,没有返回false
String getString(int cloumnCount) 从当前指向的行中获得String 类型的数据. 根据列所在的索引位置取.
String getString(String columnName) 从当前指向的行中获得String 类型的数据. 根据列名取.
getXXX系列方法 有很多种, 没个针对的都是数据库中的不同类型.
char/varchar---getString int---getInt bigint---getLong float/double---getFloat/getDouble
datetime/timestamp---getDate(只表达年月日)/getTimeStamp(表达年月日时分秒)
-
JDBC查询案例
数据库位Oracle11g,需要的jar包为ojdbc6.jar
点击【下载地址】
下载地址 提取码: sfwh
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.junit.Test;
public class OracleJdbc {
@Test
public void testOracle() {
Connection conn = null;// 创建一个数据库连接
PreparedStatement ps = null;// 创建预编译语句对象,用这个不用Statement
ResultSet resultSet = null;// 创建一个结果集对象
try {
Class.forName("oracle.jdbc.driver.OracleDriver");// 加载Oracle驱动程序,不用DriverManager
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";// Oracle地址
String user = "scott";// 数据库用户名
String password = "tiger";// 数据库密码
conn = DriverManager.getConnection(url, user, password);// 获取连接
String sql = "select * from student where name=?";// 预编译语句,“?”代表参数
ps = conn.prepareStatement(sql);// 实例化预编译语句
ps.setString(1, "小李");// 设置参数,前面的1表示第一个问号(第二个问号就用2)
resultSet = ps.executeQuery();// 执行查询
while (resultSet.next()) {// 当结果集不为空时
System.out.println(resultSet.getString("age"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 从小到大释放. resultSet < Statement < Connection
// 释放时调用close方法即可. 如果其中一个对象的关闭 出现了异常. 也要保证其他的对象关闭方法被调用.
try {
if (resultSet != null) {
resultSet.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}