JDBC 使用
JDBC 简介
JDBC(Java DataBase Connectivity)是Java与数据库的接口规范,由Java 语言编写的类和接口组成,大致分为两类:针对Java程序员的JDBC API和针对数据库开发商的低层的JDBC driver API。而JDBC驱动程序由实施了这些接口的类组成
java数据库连接,即使用java代码发送sql语句的技术,为多种关系型数据库提供统一访问
JDBC 架构
分为双层架构和三层架构
双层 :
作用 :此架构中,java Applet 或应用直接访问数据源
条件 :要求 Driver 能与访问的数据库交互
机制 :用户命令传给数据库或其他数据源,随之结果被返回
部署 :数据源可以在另一台机器上,用户通过网络连接,称为 C/S 配置
三层 :
侧架构特殊之处在于,引入中间层服务
流程:命令和结构都会经过该层
吸引:可以增加企业数据的访问控制,以及多种类型的更新;另外,也可简化应用的部署,并在多数情况下有性能优势
历史趋势: 以往,因性能问题,中间层都用 C 或 C++ 编写,随着优化编译器(将 Java 字节码 转为 高效的 特定机器码)和技术的发展,如EJB,Java 开始用于中间层的开发这也让 Java 的优势突显出现出来,使用 Java 作为服务器代码语言,JDBC随之被重视
JDBC 常用接口
Driven 接口(驱动)
Driver: 此接口处理与数据库服务器通信;很少直接直接使用驱动程序(Driver)对象,一般使用DriverManager中的对象,它用于管理此类型的对象;它也抽象与驱动程序对象工作相关的详细信息
装载驱动 :
Mysql驱动装载 : Class.forName(“com.mysql.jdbc.Driver”);
Oracle驱动装载:Class.forName(“oracle.jdbc.friver.OracleDriver”);
DriverManager 接口
DriverManager 是 JDBC 的管理层,作用于用户和驱动程序之间
DriverManager 跟踪可用的驱动程序,并在数据库和相应的驱动程序之间建立连接
Connection 接口
Connection与特定数据库的连接(会话),在连接上下文中执行SQL语句并返回结果
DriverManager的getConnection()方法建立在JDBC URL中定义的数据库Connection连接上
连接MYSQL数据库
- Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:/port/database”,“user”,“password”);
连接ORACLE 数据库
- Connection con = DriverManager.getConnection(“jdbc:oracle:this:@localhost:port:database”,“user”,“password”);
Statement 接口
- 用于执行静态SQL语句 并返回它所生成结果的对象
三种Statement类
Statement :
- 由createStatement 创建 ,用于发送简单的SQL语句
PreparedStatement
- 继承自Statement接口,有PreparedStatement创建,用于发送含有一个或多个输入参数的SQL语句
- PreparedStatement 对象比 Statement 对象的_效率更高 _,并且可以防止 _SQL注入 _
CallableStatement
- 继承自PreparedStatement;由方法prePareCall创建,用于调用存储过程
常用的Statement方法
- execute() : 运行语句,返回是否有结果集
- executeQuery :运行select语句,返回ResultSet结果集
- executeUpdate() : 运行insert / update / delete操作,返回更新的行数
ResultSet 接口
Statement 执行 SQL 语句时返回 ResultSet 结果集
ResultSet 提供的检索不同类型字段的方法,常用的有 :
- getString() : 获得在数据库里的varchar/char 等数据类型的对象
- getFloat() : 获得杂数据库里是Float类型的对象
- getDate() : 获得在数据库里面是Date类型的数据
- getBoolean() : 获得在数据库里面是 Boolean 类型的数据
JDBC 编程步骤 :
1.加载数据库驱动
加载MySql驱动
Class.forName(“com.mysql.jdbc.Driver”);
加载Oracle驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”)
2.通过DriverManager获得连接
Connection conn = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/h”,“root”,"")
Connection conn = DriverManager.getConnection(url, user, password);
参数说明 :url——连接数据库url
user——连接数据的用户名
password——连接数据库密码
3.通过Connection创建Statement对象
Statement stmt = conn.createStatement();
4.使用Statement执行SQL语句
ResultSet rs = stmt.executeQuery(“select * from student”);
5.操作结果集
循环输出数据库信息 :
while(rs.next()){
int id = rs.getInt(“id”);
String name = rs.getString(“name”);
String gender = rs.getString(“gender”);
System.out.println(id+","+name+","+gender);
}
6.关闭资源
rs.close();
stmt.close();
conn.close();
常见方法
DriverManager 类的常用方法
方法 | 功能描述 |
---|---|
getConnection(String url , String user , String password) | 指定3个入口参数,依次是连接数据库的URL、用户名、密码,来获取与数据库的连接 |
setLoginTimeout() | 获取驱动程序试图登录到某一数据库时可以等待的最长时间,以秒为单位 |
println(String message) | 将一条消息打印到当前JDBC日志流中 |
Connection接口提供的常用方法
方 法 名 称 | 功 能 描 述 |
---|---|
createStatement() | 创建并返回一个Statement实例,通常在执行无参的SQL语句时创建该实例 |
prepareStatement() | 创建并返回一个PreparedStatement实例,通常在执行包含参数的SQL语句时创建该实例,并对SQL语句进行了预编译处理 |
prepareCall() | 创建并返回一个CallableStatement实例,通常在调用数据库存储过程时创建该实例 |
setAutoCommit() | 设置当前Connection实例的自动提交模式。默认为true,即自动将更改同步到数据库中;如果设为false,需要通过执行commit()或rollback()方法手动将更改同步到数据库中 |
getAutoCommit() | 查看当前的Connection实例是否处于自动提交模式,如果是则返回true,否则返回false |
setSavepoint() | 在当前事务中创建并返回一个Savepoint实例,前提条件是当前的Connection实例不能处于自动提交模式,否则将抛出异常 |
releaseSavepoint() | 从当前事务中移除指定的Savepoint实例 |
setReadOnly() | 设置当前Connection实例的读取模式,默认为非只读模式。不能在事务当中执行该操作,否则将抛出异常。有一个boolean型的入口参数,设为true则表示开启只读模式,设为false则表示关闭只读模式 |
isReadOnly() | 查看当前的Connection实例是否为只读模式,如果是则返回true,否则返回false |
isClosed() | 查看当前的Connection实例是否被关闭,如果被关闭则返回true,否则返回false |
commit() | 将从上一次提交或回滚以来进行的所有更改同步到数据库,并释放Connection实例当前拥有的所有数据库锁定 |
rollback() | 取当前事务中的所有更改,并释放当前Connection实例拥有的所有数据库锁定。该方法只能在非自动提交模式下使用,如果在自动提交模式下执行该方法,将抛出异常。有一个入口参数为Savepoint实例的重载方法,用来取消Savepoint实例之后的所有更改,并释放对应的数据库琐定 |
close() | 立即释放Connection实例占用的数据库和JDBC资源,即关闭数据库连接 |
Statement接口常用的方法
方 法 名 称 | 功 能 描 述 |
---|---|
executeQuery(String sql) | 执行指定的静态SELECT语句,并返回一个永远不能为null的ResultSet实例 |
executeUpdate(String sql) | 执行指定的静态INSERT、UPDATE或DELETE语句,并返回一个int型数值,为同步更新记录的条数 |
clearBatch() | 清除位于Batch中的所有SQL语句。如果驱动程序不支持批量处理将抛出异常 |
addBatch(String sql) | 将指定的SQL命令添加到Batch中。String型入口参数通常为静态的INSERT或UPDATE语句。如果驱动程序不支持批量处理将抛出异常 |
executeBatch() | 执行Batch中的所有SQL语句,如果全部执行成功,则返回由更新计数组成的数组,数组元素的排序与SQL语句的添加顺序对应。数组元素有以下几种情况:①大于或等于零的数:说明SQL语句执行成功,为影响数据库中行数的更新计数;②-2:说明SQL语句执行成功,但未得到受影响的行数③-3:说明SQL语句执行失败,仅当执行失败后继续执行后面的SQL语句时出现。如果驱动程序不支持批量、或者未能成功执行Batch中的SQL语句之一,将抛出异常 |
close() | 立即释放Statement实例占用的数据库和JDBC资源 |
PreparedStatement接口的常用方法
方 法 名 称 | 功 能 描 述 |
---|---|
executeQuery() | 执行前面包含参数的动态SELECT语句,并返回一个永远不能为null的ResultSet实例 |
executeUpdate() | 执行前面包含参数的动态INSERT、UPDATE或DELETE语句,并返回一个int型数值,为同步更新记录的条数 |
setInt(int i, int x) | 为指定参数设置int型值,对应参数的SQL类型为INTEGER |
setLong(int i, long x) | 为指定参数设置long型值,对应参数的SQL类型为BIGINT |
setFloat(int i, float x) | 为指定参数设置float型值,对应参数的SQL类型为FLOAT |
setDouble(int i, double x) | 为指定参数设置double型值,对应参数的SQL类型为DOUBLE |
setString(int i, String x) | 为指定参数设置String型值,对应参数的SQL类型为VARCHAR或LONGVARCHAR |
setBoolean(int i, boolean x) | 为指定参数设置boolean型值,对应参数的SQL类型为BIT |
setDate(int i, Date x) | 为指定参数设置java.sql.Date型值,对应参数的SQL类型为DATE |
setObject(int i, Object x) | 用来设置各种类型的参数,JDBC规范定义了从Object类型到SQL类型的标准映射关系,在向数据库发送时将被转换为相应的SQL类型 |
setNull(int i, int sqlType) | 将指定参数设置为SQL中的NULL。该方法的第二个入口参数用来设置参数的SQL类型,并且必须设置,具体值从java.sql.Types类中定义的静态常量中选择 |
clearParameters() | 清除当前所有参数的值 |
ResultSet 接口提供的常用方法
方法 | 功能描述 |
---|---|
getInt() | 以int形式获取此ResultSet对象的当前行中指定列值。如果列值为NULL,则返回值是0 |
getFloat() | 以float形式获取此ResultSet对象的当前行的指定列值。如列值是NULL,则返回值是0 |
getDate() | 以Data形式获取ResultSet对象的当前行的指定列值。如列值是NULL,则返回值是null |
getBoolean() | 以boolean形式获取ResultSet对象的当前行的指定列值。如列值是NULL,则返回null |
getString() | 以String形式获取ResultSet对象的当前行的指定列值。如列值是NULL,则返回null |
getObject() | 以Object形式获取ResultSet对象的当前行的指定列值。如列值是NULL,则返回null |
first() | 将指针移到当前记录的第一行 |
last() | 将指针移到当前记录的最后一行 |
next() | 将指针向下移一行 |
beforeFirst() | 将指针移到集合的开头(第一行位置) |
afterLast() | 将指针移到集合的尾部(最后一行位置) |
absolute(int index) | 将指针移到ResultSet给定编号的行 |
isFrist() | 判断指针是否位于当前ResultSet集合的第一行。如果是返回true,否则返回false |
isLast() | 判断指针是否位于当前ResultSet集合的最后一行。如果是返回true,否则返回false |
updateInt() | 用int值更新指定列 |
updateFloat() | 用float值更新指定列 |
updateLong() | 用指定的long值更新指定列 |
updateString() | 用指定的String值更新指定列 |
updateObject() | 用Object值更新指定列 |
updateNull() | 将指定的列值修改为NULL |