JDBC
概述
JDBC(Java Datebase Connectivity,Java数据库连接)是一种可以执行SQL语句的Java API连接到关系数据库,并使用结构化查询语言(SQL)来完成对数据的查询更新。
通过使用JDBC就可以使用同一种API访问不同的数据库。开发人员使用标准的API编写的程序,根据不同的数据库,加入不同的数据库驱动即可。
-
JDBC可以完成的三个基本工作
-
- 与数据库建立连接
-
- 执行SQL语句
-
- 获得SQL执行结果
JDBC类型
ODBC(Open Database Connectivity)开放数据库连接。ODBC和JDBC很像,严格说,JDBC模仿ODBC的设计。ODBC也可以通过一组通用的API访问不要的数据库管理系统,同样,ODBC也需要数据库厂商提供相应的驱动,ODBC负责管理。
-
四种类型
- 1. 第一种JDBC驱动:称为JDBC-ODBC桥,这是最早实现JDBC驱动程序的,主要是为了快速推广JDBC。这种驱动将JDBC API映射到ODBC API。JDBC-ODBC也需要驱动(由Sun公司提供)。
-
- 第二种JDBC驱动:直接将JDBC API映射成数据库特定的客户端API。这种驱动程序包含特定数据库代码的本地代码,用于访问特定的数据库客户端。
-
- 第三种JDBC驱动:支持三层结构的JDBC访问方式。主要用于Applet阶段,通过Applet访问数据库。
-
- 第四种JDBC驱动:纯Java的,直接与数据库实例交互。这种驱动是智能的,它知道数据库四使用的底层协议。目前最流行的JDBC驱动。
用法
JDBC提供了独立于数据库的统一API,用于执行SQL命令。
JDBC编程步骤
导入需要连接数据库的jar
- 加载数据库驱动
语法
//加载驱动
Class.forName(驱动类);
//加载mysql驱动
Class.forName("com.mysql.jdbc.Driver");
//加载Oracle驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
- 通过DriverManager获取数据库连接
语法
//通过DriverManager获取数据库连接
Connection connection=DriverManager.getConnection(url,user,password);
mysql
String url="jdbc:mysql://你的ip:端口号/数据库名";
String user="root";//连接数据库的用户名
String password="密码";
数据库URL写法遵循
//other和stuff不固定。
jdbc:subprorocol(特顶数据库的驱动程序):other stuff
- 获取Statement对象来操作数据库
语法
Statement statement=connection.createStatement();
- 执行SQL语句
语法
ResultSet resultSet=statement.executeQuery("select * from user_pm");
我的数据库是8.0版本的,jar也用的8.0
8.0以上注意点
- 驱动不一样
- url需要serverTimezone=GMT%2B8&useSSL=false参数
//加载mysql驱动 8.0以上
Class.forName("com.mysql.cj.jdbc.Driver");
连接数据库执行查询操作
public static void main(String[] args) throws ClassNotFoundException, SQLException {
String url="jdbc:mysql://localhost:3306/mydb?serverTimezone=GMT%2B8&useSSL=false";
String user="root";
String password="981129";
//加载mysql驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//通过DriverManager获取数据库连接
Connection connection=DriverManager.getConnection(url,user,password);
//获取Statement对象来操作数据库
Statement statement=connection.createStatement();
ResultSet resultSet=statement.executeQuery("select * from user_pm");
while (resultSet.next()){
System.out.println("id:"+resultSet.getString("id")+" username:"+resultSet.getString("username"));
}
//关闭资源
resultSet.close();
statement.close();
connection.close();
}
-
运行结果
-
常用接口和类
DriverManager
DriverManager:用于管理JDBC驱动的服务类。程序中使用该类的主要功能是获取Connection对象。
-
常用方法
-
连接数据库的几个方法
获取驱动
Connection接口
Contection代表数据库连接对象,每个Connection代表一个物理连接会话。想要访问数据库,就必须先活动数据库连接。
只有获取Statement对象才能执行SQL,获取Statement对象的几个方法。
- Statement createStatement() throws SQLException:返回一个Statement对象。
- PrepareStatement prepareStatement(String sql) throws SQLException:返回预编译的Statement对象,即将SQL语句提交到数据库进行编译。
- CallableStatement prepareCall(String sql)throws SQLException:返回CallableStatement对象,该对象用于调用存取过程。
事务控制的几个方法
- 创建保存点
- 回滚事物
- 设置事物的隔离级别
- 是否自动提交事物
- 提交事物
Statement
用于执行SQL语句的工具接口。
执行并返回结果的几个方法
PreparedStatement
预编译的Statement对象。PreparedStatement是Statement的子接口,它预习数据预编译SQL(这些SQL语句通常带有参数),以后每次改变SQL命令的参数,避免数据库每次都要编译SQL语句,因此性能更好。
使用PreparedStatement执行SQL语句时,无需传入SQL语句,因为它已经预编译SQL语句,但是需要为预编译的SQL语句传入参数。
使用PrepareStatement执行SQL语句比Statement好处
- PrepareStatement预编译SQL语句,性能更好。
- PrepareStatement无需“拼接”SQL语句,编程更简单。
- PrepareStatement可以防止SQL注入,安全更好。
ResultSet
对象结果集。
问:如果希望使用其他数据库,怎么找到其他数据库的驱动呢?
不同数据库的驱动确实没有什么规律,但无需记住这些驱动类。因为,每个数据库厂商在提供数据库驱动(通常是一个JAR文件)时,会有对应的文档,其中有关于这个驱动类的简介,也有数据库的URL写法。