一、什么是JDBC?
1. 什么是JDBC?
JDBC(Java DataBase Connectivity)就是Java数据库连接,简要而言便是通过Java语言来实现连接数据库的功能。JDBC主要是通过Java语言向数据库来发送SQL语句。
2. JDBC核心类(接口)
JDBC中的核心类主要有:Driver接口、DriverManager类、Connection接口、Statement接口、
PreparedStatement接口、ResultSet接口
JDBC中的主要类有:DriverManager、Connection、Statement,和ResultSet!
1. Driver接口
Driver接口是所有JDBC驱动程序必须实现的接口!
DriverManager类(驱动管理器):
DriverManager主要用于加载JDBC驱动并且创建与数据库的连接。
- DriverManger(驱动管理器)的作用有两个:
- 注册驱动:这可以让JDBC知道要使用的是哪个驱动;
- 获取Connection:如果可以获取到Connection,那么说明已经与数据库连接上了。
- DriverManager类中定义了两个重要的静态方法:
方法声明 | 功能描述 |
---|---|
static synchronized void registerDriver(Driver driver) | 用于向DriverManager中注册给定的JDBC程序。 |
static Connection getConnection(String url,String user, String pwd) | 用于建立和数据库的连接,并返回表示连接的Connection对象。 |
注:实际的开发过程中基本不使用registerDriver方法来注册驱动!
2. Connection接口
Connection接口代表Java程序和数据库的连接对象,通过获取该连接的对象后才能访问数据库,并操作数据库!
- Connection接口中方法:
方法声明 | 功能描述 |
---|---|
Statement createStatement() | 方法用于返回一个向数据库发送语句的Statement对象 |
PreparedStatement prepareStatement(String sql) | 方法用于返回一个PreparedStatement对象,该对象用于向数据库发送参数化的SQL语句 |
CallableStatement perpareCall(String sql) | 方法用于返回一个CallableStatement对象,该对象用于调用数据库中的存储过程 |
3. Statement接口
Statement是Java执行JDBC操作中的一个重要接口,用于执行静态的SQL语句,并返回一个结果对象。 Statement接口通过Connection的createStatement()方法获得
- Connection接口中方法:
方法声明 | 功能描述 |
---|---|
boolean execute(String sql) | 用于执行各种SQL语句返回一个布尔类型的值,true为查询有结果,可通过Statement的getResultSet()方法获取结果 |
int(void) executeUpdate(String sql) | 用于执行SQL中的插入(insert)、更新(update)和删除(delete)语句,int则返回一个表示数据库中受该语句影响的记录条数,void不返回值 |
ResultSet executeQuery(String sql) | 用于执行SQL中的查询(select)语句,返回一个表示查询结果的ResultSet对象 |
4. PerparedStatement接口
Statement接口封装了JDBC执行SQL语句的方法,PerparedStatement接口是Statement的子接口, 用于执行预编译的SQL语句。
在操作SQL语句时可以使用“?”来代替参数,通过下列的方法来实现SQL语句的参数赋值
方法声明 | 功能描述 |
---|---|
int executeUpdate() | 在PreparedStatement对象中执行SQL语句,语句必须是DML(增删改表记录)或是DDL(增删改表结构)语句 |
ResultSet executeQuery() | 在PreparedStatement对象中执行SQL查询,返回的对象为ResultSet对象 |
void setInt(int parameterIndex,int x) | 将指定参数值设置为指定的int值 |
void setFloat(int parameterIndex,float x) | 将指定参数值设置为指定的float值 |
void setString(int parameterIndex,String x) | 将指定参数值设置为指定的String值 |
void setDate(int parameterindex,Date x) | 将指定参数值设置为指定的Date值 |
void addBatch() | 将一组参数添加到此PreparedStatement对象的批处理命令中 |
void setCharacterStream(int parameterIndex,java.io.Reader reader,int length) | 将指定的输入流写入数据库的文本字段 |
void setBinaryStream(int parameterIndex,java.io.InputStream x,int length) | 将二进制输入流数据写入到二进制字段中 |
具体的操作为:
//假设users表中的字段id、name、email分别为int、varchar、varchar
String q1 = "INSERT INTO users(id,name,email) VALUES(?,?,?)";
PreparedStatement preStmt = conn.preparedStatement(sql);
preStmt.setInt(1,1);
preStmt.setString(2,"zhangsan");
preStmt.setString(3,"zs@qq.com");
preStmt.executeUpdate();
5. ResultSet接口
ResultSet接口用于保存JDBC执行查询时返回的结果集,该结果集封装在一个逻辑表格中,调用方法next()可切换向下切换到下一行
- ResultSet接口中方法
方法声明 | 功能描述 |
---|---|
String getString(int columnIndex) | 返回指定字段的String类型的值,参数columnIndex代表字段的索引 |
String getString(String columnName) | 返回指定字段的String类型的值,参数columnName表示字段的名称 |
int getInt(int columnIndex) | 返回指定字段的int型的值,columnIndex同上 |
int getInt(String columnName) | 返回指定字段的int型的值,columnName同上 |
Date getDate(int columnIndex) | 返回指定字段的Date型的值,columnIndex同上 |
Date getDate(String columnName) | 返回指定字段的Date型的值,columnName同上 |
boolean next() | 将游标从当前位置向下移动一行 |
boolean absolute(int row) | 将游标对象移动到ResultSet对象的指定行 |
void afterLast() | 将游标对象移动到ResultSet的末尾,即最后一行之后 |
void beforeFirst() | 将游标对象移动到ResultSet的开头,即第一行之前 |
boolean previous() | 将游标对象移动到ResultSet的上一行 |
boolean last() | 将游标对象移动到ResultSet的最后一行 |
3. JDBC的四大配置参数:
(1) driveClassName:com.mysql.jdbc.Drive OR oracle.jdbc.driver.OracleDriver
(2) url:jdbc:mysql://localhost:3306/数据库名称;
(3) username:root
(4) password:123
4. JDBC的编程步骤:
1. 加载数据库驱动
Class.forName("DriverName");
其中:
==注册MySQL数据库驱动为==:
Class.forName("com.mysql.jdbc.Driver");
==注册SQLServer数据库驱动为==:
Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver");
==注册Oracle数据库驱动为==:
Class.forName("oracle.jdbc.driver.OracleDriver");
2. 通过DriverManager获取数据库连接
DriverManager中提供了getConnection()方法来获取数据库的连接,返回一个Connection对象
Connection conn = DriverManager.getConnection(String url,String user,String pwd);
// url:jdbc:mysql://hostname:port/datebasename
// url: jdbc:sqlserver://localhost:1433;DatabaseName=student
// jdbc:mysql: ---> 为固定写法
// hostname ---> 主机名称,本机上为localhost或127.0.0.1,其他则为对应的IP地址
// port ---> 对应的端口号
// datebasename ---> 对应的数据库名称
//本机上url写法: jdbc:mysql://localhost:3306/数据库名称
注:
还可以在url中提供参数:
jdbc:mysql://localhost:3306/mydb1?useUnicode=true&characterEncoding=UTF8
useUnicode参数指定这个连接数据库的过程中,使用的字节集是Unicode字节集;
characherEncoding参数指定穿上连接数据库的过程中,使用的字节集编码为UTF-8编码。
请注意,mysql中指定UTF-8编码是给出的是UTF8,而不是UTF-8。
3. 通过Connection对象获得Statement对象
得到Connection对象后,连接数据库的操作已经完成,通过创建Statement的对象来对数据库进行具体的操作,Statement是用来向SQL发送要执行的SQL语句的!
- 创建Statement对象的三种方式:
- createStatement() :创建基本的Statement对象
- prepareStatement(String sql) :根据传入的SQL语句创建PrepareStatement对象
- prepareCall(String sql) :根据传入的SQL语句创建CallableStatement对象
常用的为:
Statement stmt = conn.createStatement();
4. 使用Statement执行SQL语句
得到Statement对象后便可以操作数据库中的数据了!
- 使用Statement执行SQL语句的三种方式:
- execute(String sql) :用于执行任何的SQL语句
- executeQuery(String sql) :用于执行查询语句,返回ResultSet结果集对象
- executeUpdate(String sql) :用于执行DDL(数据定义语言)和DML(数据操作语言),执行DDL时语句返回值为0,执行DML时返回受SQL语句印象的行数。
操作例:
//①DML
String sql = "INSERT INTO user VALUES('zhangsan','123')";
int m = stmt.executeUpdate(sql);
//②DQL
String sql = "SELECT * FROM user";
ResultSet rs = stmt.executeQuery(sql); //返回ResultSet结果集
5. 执行ResultSet结果集
通过SQL执行后的DQL结果返回的结果集,通过ResultSet对象方法来进行访问。
ResultSet rs = stmt.executeQuery(sql);
6. 关闭连接,释放资源
资源的关闭顺序与打开顺序相反,关闭的顺序为:ResultSet、Statement(或PrepareStatement)、Connection。
即:
rs.close();
stmt.close();
conn.close();
5.JDBC实战
1.导入JDBC的jar包
1. Idea
File -> Project Structure (OR Ctrl + Shift + Alt + S) -> modules -> Dependencies -> 右边选择+号 -> JARS导入 -> 选择JDBC的jar包 -> 导入并勾选!
2. eclipse OR myeclipse
直接复制Jar包导入到项目的文件中即可!
2.JDBC编程步骤
①加载数据库驱动 Class.forName("com.mysql.jdbc.Driver");
②通过GetManager获得数据库连接 url = "jdbc:mysql://localhost:3306/数据库名";
③通过Connection对象获得Statement的对象
④使用Statement执行SQL语句
⑤执行ResultSet结果集
⑥关闭连接,释放资源
3.JDBC编程
①方法一:
package cn.study.www;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestJDBC {
public static void main(String[] args) throws Exception
{
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.通过GetManager获得数据库连接
String url = "jdbc:mysql://localhost:3306/exam";
String user = "root";
String pass = "123";
Connection conn = DriverManager.getConnection(url,user,pass);
//3.通过Connection来获得Statement的对象
Statement st = conn.createStatement();
//4.执行数据库的查询操作
String select = "SELECT * FROM emp";
ResultSet rs = st.executeQuery(select); //执行数据库的查询操作
//5.执行ResultSet结果集
while(rs.next()){
String empno = rs.getString(1);
String ename = rs.getString(2);
System.out.println(empno + ", " + ename);
}
//关闭流
rs.close();
st.close();
conn.close();
}
}
② 方法二(规范化):
package cn.study.www;
import java.sql.*;
public class TestJDBC {
public static void main(String[] args)
{
//声明变量
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
//1.加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//2.得到数据库连接
String url = "jdbc:mysql://localhost:3306/exam";
String user = "root";
String pass = "123";
conn = DriverManager.getConnection(url,user,pass);
//3.得到Statement对象对数据库进行操作
stmt = conn.createStatement();
//4.对数据库进行查找操作,返回结果集ResultSet
String ss = "SELECT * FROM emp";
rs = stmt.executeQuery(ss);
//5.操作返回的结果集
while(rs.next()) {
String empno = rs.getString(1);
String ename = rs.getString(2);
System.out.println(empno + ", " + ename);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null)
rs.close();
if (stmt != null)
stmt.close();
if(conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
网友评论