当前所有的B/S系统无一不和数据库之间有交互
JDBC(Java Database Connectivity)是一种可用于执行SQL语句的 Java API
JDBC的应用模型如下图所示:
JDBC 驱动的4种类型
TYPE 1: JDBC-ODBC桥驱动程序
适用于快速的原型系统,没有提供JDBC驱动的数据库如Access
TYPE 2: Native-API驱动程序
利用开发商提供的本地库来直接与数据库通信。比Type1性能略好
TYPE 3: JDBC通过网络的纯Java驱动程序
具有最大的灵活性,通常由那些非数据库厂商提供,是四种类型中最小的
TYPE 4: 原生协议以及纯Java驱动程序
最高的性能,通过自己的本地协议直接与数据库引擎通信,具备在Internet装配的能力
通过使用SQL语句,程序员可以利用java语言开发访问数据库的应用。
数据库供应商和数据库工具开发商可以提供底层的驱动程序。因此他们有能力优化各自的数据库产品的驱动程序。
JDBC API 供程序员调用的类和接口被包装在java.sql包中如:
DriverManager类
Connection接口
Statement接口
ResultSet接口
DriverManager
作用:管理不同的JDBC驱动
JDBC驱动
作用:负责连接各种不同的数据库
JDBC API类和接口均在Java.sql和javax.sql程序包中提供。
JDBC API中常使用的类和接口是:
DriverManager 类:为数据库加载驱动程序。
驱动程序接口:提供一个数据库驱动程序。所有的JDBC驱动程序类必须执行驱动程序接口。
连接接口: 使你可以建立Java应用程序与数据库之间的连接。
语句接口:使你可以执行SQL语句。
ResultSet 接口:提供从数据库检索的信息。
SQLException 类:提供与数据库互动时发生的异常的有关信息。
DriverManager类
Class.forName() 显式加载并注册驱动程序类
驱动程序被加载后就出现在DriverManager的驱动程序列表中,并可用于创建连接
Connection对象
建立连接
DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
JDBC URL
jdbc:< 子协议 >:< 子名称 >
如:jdbc:mysql://localhost:3306/test
发送SQL语句
Statement
PreparedStatement
Statement对象
创建Statement对象
Statement stmt = conn.createStatement();
使用Statement对象执行语句
ResultSet executeQuery()参数是查询语句(select)
Int executeUpdate()参数是DML或DDL语句(insert, update, delete or DDL)
boolean execute()执行可能返回多种结果的语句(任何sql)
ResultSet getResultSet() 获取当前的结果集
int getUpdateCount() 以更新计数的形式获取当前结果;如果结果为 ResultSet 对象或没有更多结果,则返回 -1。
关闭Statement对象
作为一种良好的编程风格,应在不需要的时候显式关闭他们,stmt.close()
ResultSet对象
ResultSet对象又称结果集
行和光标
初始光标停在第一行之前,rs.next() 会使光标向下移一行列
resultSet中的getXxx()方法提供了对当前行某列值的访问
getXxx(String 列名) 列名不区分大小写
getXxx(int 列编号) 编号从 1 开始
①注册JDBC驱动程序;
注册驱动程序有三种方式:
JAVA规范中明确规定:所有的驱动程序必须在静态初始化代码块中将驱动注册到驱动程序管理器中。
方式一:Class.forName(“oracle.jdbc.driver.OracleDriver”);
方式二:Driver drv = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver(drv);
方式三:编译时在虚拟机中加载驱动
javac –Djdbc.drivers = oracle.jdbc.driver.OracleDriver xxx.java
java –D jdbc.drivers=驱动全名 类名
使用系统属性名,加载驱动 -D表示为系统属性赋值
附?: mysql的Driver的全名com.mysql.jdbc.Driver
SQLServer的Driver的全名com.microsoft.jdbc.sqlserver.SQLServerDriver
②建立到DB连接;
conn=DriverManager.getConnection(“jdbc:oracle:thin:@192.168.0.1:1521:test”, ” User”,” Pasword”);
IP地址及端口号和数据库实例名
用户名密码码
Connection连接是通过DriverManager的静态方法getConnection(.....)来得到的,这个方法的实质是把参数传到实际的Driver中的connect()方法中来获得数据库连接的。
Oracle URL的格式:
jdbc:oracle:thin:(协议)@XXX.XXX.X.XXX:XXXX(IP地址及端口号):XXXXXXX(所使用的库名)
MySql URL的写法 例: jdbc:mysql://192.168.0.1:3306/test
③获得Statement对象;
stat = conn.createStatement();
④通过Statement执行Sql语句;
sta.executeQuery(String sql);返回一个查询结果集。
sta.executeUpdate(String sql);返回值为int型,表示影响记录的条数。
将sql语句通过连接发送到数据库中执行,以实现对数据库的操作。
⑤处理结果(有的话);
使用Connection对象获得一个Statement,Statement中的executeQuery(String sql) 方法可以使用select语句查询,并且返回一个结果集 ResultSet通过遍历这个结果集,可以获得select语句的查寻结果,ResultSet的next()方法会操作一个游标从第一条记录的前面开始读取,直到最后一条记录。executeUpdate(String sql) 方法用于执行DDL和DML语句,比如可以update,delete操作。
只有执行select语句才有结果集返回。
⑥与数据库断开连接。
关闭数据库连接(释放资源) 调用.close()
rs.close(); sta.close(); con.close();
ResultSet Statement Connection是依次依赖的。
注意:要按先ResultSet结果集,后Statement,最后Connection的顺序关闭资源,因为Statement和ResultSet是需要连接时才可以使用的,所以在使用结束之后有可能其它的Statement还需要连接,所以不能现关闭Connection。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class JDBCTest { public static final String DB_DRIVER = "com.mysql.jdbc.Driver"; public static final String DB_URL = "jdbc:mysql://localhost:3306/test"; public static final String DB_USERNAME = "root"; public static final String DB_PASSWORD = "root"; public static void main(String[] args){ Connection conn = null; Statement stmt = null; ResultSet rs = null; try{ //1、装载JDBC驱动 Class.forName(DB_DRIVER); //2、获取数据库连接 conn = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD); //3、创建数据库语句 String sql = "seletc * from users"; stmt = conn.createStatement(); //执行数据库操作 rs = stmt.executeQuery(sql); //从结果集中获取数据 while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println("id = " + id +" name = " + name +" age="+age); } }catch(Exception e){ e.printStackTrace(); }finally{ //6、释放资源 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(); } } } } }