JDBC核心API
一.JDBC简介
- Java Database Connectivity Java 数据库连接
- 是指Java和许多数据库间连接的工业标准。这种连接独立于数据库。
- JDBC提供了基于SQL数据库访问的调用级API
二.JDBC核心API关键接口描述
- java.sql.DriverManager 处理驱动的调入并且对产生新的数据库连 接提供支持。
- java.sql.Connection 代表对特定数据库的连接。
- java.sql.Statement 代表一个特定的容器,来对一个特定的数据库执行SQL语句。
- java.sql.ResultSet 控制对一个特定语句的行数据的存取
- java.sql.Statement两个子类型:
java.sql.PreparedStatement 用于执行预编译的SQL语句
CallableStatement :用于执行 SQL 存储过程的接口
三.JDBC示例
1.JDBC示例:
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con = DriverManager.getConnection ("jdbc:oracle:thin:@127.0.0.1:1521:orcl","login", "password");
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT count(*) FROM Table1");
if (rs.next()){
System.out.println(rs.getInt(1) );
}
2.ODBC示例:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:dbdemo";
Connection con = DriverManager.getConnection(url);
Statement st = con.createStatement();
ResultSet rs = st.executeQuery("select * from userinfo");
四.注册驱动
必须先向java程序注册Oracle JDBC驱动程序,然后才能打开数据库连接。 两种注册Oracle JDBC驱动程序的办法:
1.使用java.lang.Class的forName()方法,将显式地加载驱动程序类
Class.forName("oracle.jdbc.OracleDriver");
2.使用JDBC DriverManager类的registerDriver()方法。
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
五.打开数据库连接
- 必须先打开数据库连接,然后才能在Java程序中执行SQL语句。打开数据库连的办法:DriverManager类的getConnection()
- DriverManager.getConnection(URL,USERNAME,PASSWROD);
URL:程序要连接的数据库,以及要使用的JDBC驱动程序 - 如
String url = "jdbc:oracle:thin:@127.0.0.1:1521:DBA"
DriverManager.getConnection(url,"scott","tiger");
六.执行sql语句
Statement 对象用于将SQL语句发送到数据库中, Statement接口提供了执行语句和获取结果的基本方法,如:
Statement sm = cn.createStatement();
// 执行数据查询语句(select)
sm.executeQuery(sql);
// 执行数据更新语句(delete、update、insert)
sm.executeUpdate(sql);
statement.close();
七.使用proparedStatement执行sql语句
//用PreparedStatement来执行sql语句
String sql = "insert into user (id,name) values (?,?)";
PreparedStatement ps = cn.prepareStatement(sql);
ps.setInt(1,xxx);
ps.setString(2,xxx);
...
ResultSet rs = ps.executeQuery(); // 查询
int c = ps.executeUpdate(); // 更新
八.处理执行结果
- ResultSet 包含符合 SQL 语句中条件的所有行,并且它通过一套get 方法(这些 get 方法可以访问当前行中的不同列)提供了对这些 行中数据的访问。ResultSet.next方法用于移动到 ResultSet 中的下一行,使下一行成为当前行。
- 查询语句,返回记录集ResultSet。
- 更新语句,返回数字,表示该更新影响的记录数。
- ResultSet的方法:
next(),将游标往后移动一行,如果成功返回true;否则返回 false。
getInt(“id”)或getSting(“name”),返回当前游标下某个字段的值。 - 释放连接时,一般先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
九.批量更新
Statement
Statement sm = cn.createStatement();
sm.addBatch(sql1);
sm.addBatch(sql2);
...
sm.executeBatch()
• 一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
十.批量更新PreparedStatement
PreparedStatement ps = cn.preparedStatement(sql);
{
ps.setXXX(1,xxx);
...
ps.addBatch();
}
ps.executeBatch();
• 一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新
十一.事务的处理
1、关闭Connection的自动提交
con.setAutoCommit(false);
2、执行一系列sql语句
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close。
Statement sm ;
sm = con.createStatement(insert into user...);
sm.executeUpdate();
sm.close();
sm = con.createStatement("insert into corp...);
sm.executeUpdate();
sm.close();
3、提交
con.commit(); //提交
con.rollback();//如果发生异常,那么回滚
十二.大数据类型的保存
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
Connection con = DriverManager.getConnection(url, "scott", "tiger");
PreparedStatement ps = con.prepareStatement("INSERT INTO AA(AID,PIC) VALUES(?,?)");
ps.setInt(1, 1234);
File file = new File("E:\\PLSQL.doc");
ps.setBinaryStream(2, new FileInputStream(file), (int)file.length());
ps.executeUpdate();
ps.close();
十三.大数据类型的提取
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
Connection con = DriverManager.getConnection(url, "scott", "tiger");
PreparedStatement ps = con.prepareStatement("SELECT * FROM AA");
InputStream is = rs.getBinaryStream(2);
BufferedInputStream bis = new BufferedInputStream(is);
FileOutputStream fos = new FileOutputStream("c:/demo.jpg");
while(true){
int n = bis.read();
if(n==-1){
break;
}
fos.write(n);
}
十四.可滚动.更新的记录集
- 创建可滚动、更新的Statement
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
该Statement取得的ResultSet就是可滚动的
- 创建PreparedStatement时指定参数
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSI TIVE,ResultSet.CONCUR_READ_ONLY);
- 结果集定位
ResultSet.absolute(5);
十五.游标及结果集类型
- resultSetType可选值是:
1、ResultSet.TYPE_FORWARD_ONLY 在ResultSet中只能先前(向下)移动游标
2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所欲的先前向后(上下移动)移动游标,当数据库变化时,当前结果集不变
3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所欲的先前向后(上下移动)移动游标,同时ResultSet的值有所改变的时候,可以得到改变后的最新的值 - resultSetConcurrency可选值是:
1、ResultSet.CONCUR_READ_ONLY 在ResultSet中的数据记录是只读的,不能用结果集更新数据库
2、ResultSet.CONCUR_UPDATABLE 在ResultSet中的数据记录可以任意修改,能用结果集更新数据库
十六.结果集处理
Statement stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
//在执行下面的代码时,查询语句中不能使用*来代替所有的字段
rs.absolute(5);
rs.updateString("NAME", "AINSWORTH");
rs.updateRow();
rs.moveToInsertRow();
rs.updateString(1, "AINSWORTH");
rs.updateInt(2,35);
rs.insertRow();
rs.moveToCurrentRow();
十七.执行存储过程
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";
Connection con = DriverManager.getConnection(url, "scott", "tiger");
CallableStatement cs = con.prepareCall("{call pro_demo(?,?)}");
//设置输入参数
cs.setInt(1, 7902);
//定义输出类型
cs.registerOutParameter(2, OracleTypes.VARCHAR);
//执行存储过程
cs.executeUpdate();
//提取存储过程输出
System.out.println(cs.getString(2));//根据下标提取
十八.执行函数
String sql = "{?=call FUNC_DEMO (?,?)}";
CallableStatement cs = con.prepareCall(sql);
cs.registerOutParameter(1, OracleTypes.VARCHAR);
cs.setInt(2, 7369);
cs.registerOutParameter(3, OracleTypes.VARCHAR);
cs.execute();
String strJob = cs.getString(1);
String strName = cs.getString(3);
十九.元数据
ResultSetMetaData可用于获取关于 ResultSet 对象中列的类型和属性信息的对象。
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();