关于JDCB连接oracle数据库

1:什么是JDBC(百度可详细解释)

              JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用 Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
             他是一套用于执行SQL语句的javaAPI,应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库数据的CRUD(数据库的查询,更新,修改以及删除)的操作,这节详细讲解关于jdbc连接Oracle数据库。
     
          2:关于jdbc连接数据库的常用api,这些api主要位于java.sql包下,该包定义了一系列的接口和类。
 
 DriverManager:用于管理JDBC驱动的服务类。程序中使用该类的的主要功能是获取Connection对象,该类包含如下方法:
public static Connection getConnection(String url, String user, String password) throws SQLException
该方法获得url对应数据库的连接;
 
Connection:代表数据库连接对象,每个Connection代表一个物理连接会话。要想访问数据库,必须先得到数据库连接。该接口的常用方法如下:
              Statement createStatement() throws SQLException; 该方法返回一个Statement对象;
               PreparedStatement prepareStatement(String sql)throws SQLException;该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译;
              CallableStatement prepareCall(String sql) throws SQLException;
              该方法返回CallableStatement对象,该对象用于调用存储过程。
              上面上个方法都返回用于执行sql语句的Statement对象,PreparedStatement和CallableStatement是Statement的子类,只有获得了Statement之后才可以执行sql语句;
除此之外,Connection还有如下几个用于控制事务的方法
              Savepoint setSavepoint() throws SQLException;创建一个保存点;
      Savepoint setSavepoint(String name) throws SQLException;以指定名字来创建一个保存点;
    void setTransactionIsolation(int level) throws SQLException;设置事务的隔离级别;
    void rollback() throws SQLException;回滚事务;
    void rollback(Savepoint savepoint) throws SQLException;将事务回滚到指定的保存点;
    void setAutoCommit(boolean autoCommit) throws SQLException;关闭自动提交,打开事务;
    void commit() throws SQLException;提交事务;
 
Statement:用于执行sql语句的工具接口。该对象既可以执行DDL,DCL语句,也可以用于执行DML语句,还可以用于执行sql查询。当执行sql查询时,返回查询到的结果集。它的常用方法如下:
ResultSet executeQuery(String sql) throws SQLException;该方法用于执行查询语句,并返回查询结果对应ResultSet对象。该方法只能用于执行查询语句。
int executeUpdate(String sql) throws SQLException;该方法用于执行DML语句,并返回受影响的行数;该方法也可用于执行DDL语句,执行DDL语句将返回0;
boolean execute(String sql) throws SQLException;改方法可以执行任何sql语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false;
 
PreparedStatement:预编译的Statement对象,PreparedStatement是Statement的子接口,它允许数据库预编译sql语句(这些sql语句通常带有参数),以后每次只改变sql命令的参数,避免数据库每次都需要编译sql语句,无需再传入sql语句,
只要为预编译的sql语句传入参数值即可。所以它比Statement多了如下方法:
void setXxx(int parameterIndex, Xxx value):该方法根据传入参数值的类型不同,需要使用不同的方法。传入的值根据索引传给sql语句中指定位置的参数。
 
ResultSet:结果集对象。该对象包含访问查询结果的方法,ResultSet可以通过列索引或列名获得列数据。它包含了如下常用方法来移动记录指针。
void close() throws SQLException;释放ResultSet对象;
boolean absolute( int row ) throws SQLException;将结果集的记录指针移动到第row行,如果row是负数,则移动到倒数第row行,如果移动后的记录指针指向一条有效记录,则该方法返回true;
boolean next() throws SQLException;将结果集的记录指针定位到下一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
boolean last() throws SQLException;将结果集的记录指针定位到最后一行,如果移动后的记录指针指向一条有效的记录,则该方法返回true;
 
      3:简单介绍了JDBC常用的几个接口和类,下面是具体的代码实现。
      3-1:首先我们写连接的获取。我们把它写成一个类。
        public class oracleJdbc {
// 获得conn连接
private static Connection getConn() {
String driver = "oracle.jdbc.OracleDriver";
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String username = "scott";
String password = "tiger";
Connection conn = null;
try {
Class.forName(driver);
try {
conn = (Connection) DriverManager.getConnection(url, username, password);
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return conn;
}
写了这个连接类,我们接下来的操作就简单多了,我们接下来的对数据库的操作就简单了很多,不管是增删改查,我们就可以直接调用这个连接类就行了。
// 插入数据
private static int insert(Student student) {
Connection conn = getConn();
int i = 0;
String sql = "insert into students (Name,Sex,Age) values(?,?,?)";
PreparedStatement pstmt = null;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
pstmt.setString(1, student.getName());
pstmt.setString(2, student.getSex());
pstmt.setString(3, student.getAge());
i = pstmt.executeUpdate();
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
     //修改数据
private static int update(Student student) {
Connection conn = getConn();
int i = 0;
String sql = "update students set Age='" + student.getAge() + "' where Name='" + student.getName() + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
     // 查询全部数据
private static Integer getAll() {
Connection conn = getConn();
String sql = "select * from scott.students";
// String sql = "select * from scott.emp";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement)conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
int col = rs.getMetaData().getColumnCount();
System.out.println("============================");
while (rs.next()) {
for (int i = 1; i <= col; i++) {
System.out.print(rs.getString(i) + "\t");
if ((i == 2) && (rs.getString(i).length() < 8)) {
System.out.print("\t");
}
}
System.out.println("");
}
System.out.println("============================");
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
     //删除数据
private static int delete(String name) {
Connection conn = getConn();
int i = 0;
String sql = "delete from students where Name='" + name + "'";
PreparedStatement pstmt;
try {
pstmt = (PreparedStatement) conn.prepareStatement(sql);
i = pstmt.executeUpdate();
System.out.println("resutl: " + i);
pstmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return i;
}
       //测试类
public static void main(String args[]) {
oracleJdbc.getAll();
//oracleJdbc.insert(new Student("Achilles", "Male", "14"));
// oracleJdbc.getAll();
// oracleJdbc.update(new Student("Bean", "", "7"));
// oracleJdbc.delete("Achilles");
// oracleJdbc.getAll();
}
}
这个学生类是提前写好的。测试类可以直接操作上面的四个方法对数据库进行CRUD操作。
这样jdbc对数据库的操作就完成了。

Connection接口Connection接口代表与特定的数据库连接,在连接上下文中执行SQL语句并返回结果。
方法功能描述createStatement()创建一个Statement对象createStatement(int resultSetType, int resultSetConcurrency)创建一个Statement对象,该对象生成具有给定类型、并发性、和可保存的ResultSet对象PrearedStatement()创建预处理对象PreparedStatementisReadOnly()查看当前Connection对象的读写模式是否为只读模式setReadOnly()设置当前Connection对象的读写模式,默认是非只读模式commit()使上一次提交/回滚之后进行的更改成为持久更改,并释放此Connection对象当前所持有的的所有数据库锁setAutoCommit()设置对数据库的更改是否为自动提交,默认是自动提交(true)rollback()回滚当前事务中的所有改动并释放当前连接持有的数据库的锁close()立即释放连接对象的数据库和JDBC资源DriverManager类DriverManager类用来管理数据库中的所有驱动程序。它是JDBC的管理层,作用于用户和驱动程序之间,跟踪可用的驱动程序,并在数据库的驱动程序之间建立连接。如果通过getConnection()方法可以建立连接,则经连接返回,否则抛出SQLException异常。DriverManager类的常用方法如下:
方法功能描述getConnection(String sql, String user, String password)指定三个入口参数(依次是连接数据库的URL、用户名和密码)来获取与数据库的连接setLLoginTimeout获取驱动程序试图登录到某一数据库时可以等待的最长时间,以秒为单位println(String message)将一条消息打印到当前的JDBC日志流中Statment接口Statement接口用于在已经建立连接的基础上向数据库发送SQL语句。在JDBC中有3中Statement对象,分别是Statement、PreparedStatement和CallableStatement。Statement对象用于执行不带参数的简单的SQL语句;PreparedStatement继承了Statement,用来执行动态的SQL语句;CallableStatement继承了PreparedStatement,用来执行数据库的存储过程的调用。Statement接口的常用的方法如下:
方法功能描述execute(String sql)执行静态的select语句,该语句可能返回多个结果集executeQuery(String sql)执行给定的SQL语句,该语句返回单个ResultSet对象clearBatch()清空此Statement的当前SQL命令列表executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功则返回更新计数组成的数组。数组元素的排序与SQL语句的添加顺序对应addBatch()将给定的SQL命令添加到此Statement对象的当前命令列表中。如果驱动程序不支持批量处理,将抛出异常close()释放Statement实例占用的数据库和JDBC资源PreparedStatment接口PreparedStatment接口用来动态地执行SQL语句。通过PreparedStatment实例执行的动态SQL语句,将被预编译并保存到PreparedStatment实例中,从而可以重复地执行该SQL语句。PreparedStatment接口的常用方法如下:
方法功能描述SetInt(int index, int k)将指定位置的参数设置为int值SetFloat(int index, float f)将指定位置的参数设置为float值SetLong(int index, long l)将指定位置的参数设置为long值SetDouble(int index, double d)将指定位置的参数设置为double值SetBoolean(int index, boolean b)将指定位置的参数设置为boolean值SetDate(int index, Date date)将指定位置的参数设置为date值executeQuery()在此PreparedStatment对象中执行SQL查询,并返回该查询生成的ResultSet对象setString(int index, String s)将指定位置的参数设置为String值SetNull(int index, int sqlType)将指定位置的参数设置为SQL NULLexecuteUpdate()执行前面包含的参数的动态insert、update或delete语句clearParemeters()清除当前所有的参数值ResultSet接口ResultSet接口类似于一个临时表(实际上也是一个缓存区),用来暂时存放数据库查询操作所获得的结果集。ResultSet实例具有指向当前数据行的指针,指针开始的位置在第一条记录的前面,通过next()方法可将指针向下移,进而获取到数据。
Statement对象执行executeQuery实际上并不是一下子将所有查询到的数据全部放入到ResultSet中(想象一下如果是几十万条是不是要蹦了),而是分批次放入进去ResultSet缓存,一次取完了再放入下一批次,直至取完所有查询到的数据。然而ResultSet里的这个缓存区究竟有多大呢?我们可以通过ResultSet里的getFetchSize()方法来获取(一般大小为10个),同时我们也可以通过setFetchSize()方法来设置这个缓存区的大小。
在JDBC 2.0(JDK 1.2)之后,该接口添加了一组更新方法updateXXX(),该方法有两个重载方法,可根据列的索引号和列的名称来更新指定列。但该方法并没有将对数据进行的操作同步到数据库中,需要执行updateRow()或insertRow()方法更新数据库。ResultSet接口的常用方法如下:
方法功能描述getInt()以int形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是0getFloat()以float形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是0getDate()以date形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是nullgetBoolean()以boolean形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是nullgetString()以String形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是nullgetObject()以Object形式获取此ResultSet对象的当前行的指定列值(可以使用栏位名称或者栏位索引值)。如果列值为NULL,则返回值是nullfirst()将指针移到当前记录的第一行last()将指针移到当前记录的最后一行next()将指针向下移一行beforeFirst()将指针移到集合的开头(第一行位置)afterLast()将指针移到集合的尾部(最后一行位置)absolute(int index)将指针移到ResultSet给定编号的行isFirst()判断指针是否位于当前ResultSet集合的第一行。如果是返回true,否则返回falseisLast()判断指针是否位于当前ResultSet集合的最后一行。如果是返回true,否则返回falseupdateInt()用int值更新指定列updateFloat()用float值更新指定列updateLong()用long值更新指定列updateString()用String值更新指定列updateObject()用Object值更新指定列updateNull()将指定的列值修改为NULLupdateDate()用指定的date值更新指定列updateDouble()用double值更新指定列getRow()查看当前行的索引号insertRow()将插入行的内容插入到数据库updateRow()将当前行的内容同步到数据库deleteRow()删除当前行,但是不同步到数据库中,而是在执行close()方法之后同步到数据库中--------------------- 作者:Season In The Sun 来源:CSDN 原文:https://blog.csdn.net/sinat_37976731/article/details/79486440 版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自www.cnblogs.com/smile908/p/10571190.html
今日推荐