JDBC
1.简介
JDBC : Java DateBase Connectivity
(1) Java程序用于连接数据库的一组接口规范
(2) 接口的具体实现由各个数据库厂商提供,简化了程序员在连接
不同数据库时所需要的编码。
(3) jdbc驱动:各个数据库厂商提供的具体实现类,用于取得与数据库的连接(mysql:connector.jar)
2.JDBC核心类
(1) DriverManager:用于获取连接数据库的Connection对象
(2) Connection:数据库连接对象,如果能成功获取,说明连接数据库成功
(3) Statement:用于执行sql语句,操作数据库,可以从Connection对象获取
(4) ResultSet:用于存储查询的结果集,提供了一系列获取查询结果的方法,通过Statement获取该对象
注意:只有执行查询语句才有结果集
增删改操作返回int状态值
3.核心步骤(mysql)
(1).导入jar包 : mysql-connector-java-5.1.13-bin.jar(connectorJ)(可以从mysql官网下载)
(2).获取Connection对象
四大参数:
[1] String driverClassName = "com.mysql.jdbc.Driver" --> 数据库连接驱动
[2] String url = "jdbc:mysql://localhost:3306/databaseName" --> 数据库所在的位置
注: jdbc:mysql是协议, localhost代表本地IP,3306代表端口号
(在url中可以追加数据库用户名和密码:?username:root&password:xxx)
[3] String username="xxxx"; 连接数据库的用户名
[4] String password="xxxx"; 用户密码
Class.forName(driverClassName) : 反射方式加载驱动类
Connection conn = DriverManager.getConnection(url,username,password) : 获取连接对象
(3).得到Statement对象
> Statement stmt = con.createStatement();
(4).执行sql语句
[1] 发送更新sql语句:int row = stmt.executeUpdate(String sql); --> 若执行增删改则到此结束
[2] 发送查询sql语句:ResultSet rs = stmt.executeQuery(String sql); --> 执行查询请参照(5)
(5).操作ResultSet获取数据:
注:
ResultSet内部原理简介:ResultSet在内部持有一个行指针(游标),默认指向第一行之前
因此在取出数据时要注意调用next()方法移动该指针使其指向下一行
while(rs.next()){
rs.getXxx(int colIndex); // 根据列标取得数据
rs.getXxx(String colName); // 根据列名取得数据(较为方便)
}
以下四种获取列元素的方法可供选择,根据实际需求灵活使用:
[1] int getInt(int i):获取第i列的数据,转换成int类型返回
[2] int getInt(String colName):rs.getString("ename"),获取当前行,名为ename的列数据
[3] String getString(int i):获取第i列的数据,转换成String类型返回
[4] Object getObject(int i):获取第i列的数据,转换成Object类型返回
(6).关闭资源
rs.close(); // 关闭结果集资源
stmt.close(); // 关闭Statement资源
conn.close(); // 断开连接
4.代码示例
/* JDBCUtils: 获取连接,关闭资源的工具类 */
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtils {
// 定义四个获取连接的必要参数,可以从配置文件获取,也可以自己给出
private static String driverClassName = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://localhost:3306/dbtest1";
private static String username = "root";
private static String password = "zhoubowen";
// 静态代码块用于加载连接驱动
static{
try {
Class.forName(driverClassName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
// 获取数据库连接
public static Connection getConnection() throws SQLException{
Connection conn = DriverManager.getConnection(url, username, password);
return conn;
}
// 关闭资源
public static void closeAll(Connection conn, Statement stmt, ResultSet rs){
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
/* 测试Demo */
package com.itheima.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
public static void main(String[] args) throws SQLException {
// 获取连接: 关键
Connection conn = JDBCUtils.getConnection();
// 获取执行语句的Statement对象
Statement stmt = conn.createStatement();
// 获取查询结果集对象
ResultSet rs = stmt.executeQuery("select * from test");
// 获取数据
while(rs.next()){
String t_name = rs.getString("t_name");
String t_sex = rs.getString("t_sex");
System.out.println(t_name + ":" + t_sex);
}
// 关闭资源
JDBCUtils.closeAll(conn, stmt, rs);
}
}