• 10.4 JDBC的典型用法


    一、JDBC 4.2常用接口和类的简介

    Java支持JDBC 4.2标准,JDBC 4.2在原有JDBC标准上增加了一些新特性。

    1.1 DriverMananger:用于管理JDBC驱动的服务类。

    程序中使用该类的主要功能是获取Connection对象,该类包含如下方法:public static synchronized Connection getConnection(String url,String user,String pass) throws SQLWxception:该方法获取对应数据库的连接。

    1.2 Connection:代表数据库连接对象

    每个Connection代表一个物理会话。想要访问数据库,必须先获得数据库连接。该接口的常用方法:
    (1)Statement createStatement() throws SQLException:返回一个Statement对象。
    (2)PreparedStatement prepareStatement(String sql) throws SQLException:该方法返回预编译的Statement对象,即将SQL语句提交到数据库进行预编译。
    (3)CallableStatement prepareCall(String sql) throws SQLException:该方法返回 CallableStatement对象
    上面三个方法返回执行SQL语句的Statement对象,PrepareStatement、CallableStatement都是Statement的子类,只有获取了Statement之后才可以执行SQL语句。
    Connection用于控制事务的方法:
    (1)Savepoint setSavepoint():创建一个保存点。
    (2)Savepoint setSavepoint(String name):以指定名字创建一个保存点。
    (3)void setTransactionIsolation(int level):设置事务的隔离级别。
    (4)void rollback():回滚事务。
    (5)void rollback(Savepoint savepoint):将事务回滚到指定保存点。
    (6)void setAutoCommit(boolean autoCommit):关闭自动提交,打开事务。
    (7)void commit():提交事务。
    Java 7为Connection新增了setSchema(String schema)、getSchema()两个方法,这两个方法用于控制该Connection访问的数据库Schema。
    新增SetNetworkTimeout(Executor executor,int milliseconds)、getNetworkTimeout()用于控制数据库连接超时行为。

    1.3 Statement:用于执行SQL语句的工具接口

    该对象即可以执行DDL、DCL语句,也可以用于执行DML语句,还可以执行SQL查询。当执行SQL查询时,返回查询到的数据集。
    常用方法
    (1)ResultSet executeQuery(String sql) throws SQLException:该方法用于执行查询语句,并返回查询结果到对应的ResultSet对象中。只能执行查询语句。
    (2)int executeUpdate(String sql ) throws SQLException:用于执行DML语句,并返回受影响的行数;该方法也可以用于执行DDL语句,执行DDL语句将返回0.
    (3)boolean excute(String sql) throws SQLExceptin:该方法可执行任何SQL语句。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false。
    Java 7为Statement新增了closeOnCompletion()方法,如果Statement执行了该方法,则所有依赖于该Statement的ResultSet关闭时,该Statement会自动关闭。
    新增isCloseOnCompletion()方法,用于判断该Statement是否打开了"closeOnCompletion".
    java 8新增多个重载的executeLargeUpdate()方法,该方法相当于增强版的excuteUpdate()方法,返回值为long。当DML语句影响的记录条数超过了Integer.MAX_VALUE时,就应该使用executeLargeUpdate()。

    1.4 PrepareStatement:预编译的Statement对象

    PrepareStatement是Statement子接口,它允许数据库预编译SQL语句(这些SQL语句通常带有参数),以后每次只改变SQL命令参数,避免每次数据库每次都需要编译SQL语句,因此性能更好。相对于Statement而言,使用PrepareStatement执行SQL语句时,无须再传入SQL语句,只要为预编译的SQL语句传入参数即可。它比Statement多了如下方法:
    (1)void setXxx(int parameterIndex,Xxx value):根据传入参数值类型不同,需要使用不同的方法。传入的值根据索引传给SQL语句指定位置的参数。

    1.5 ResultSet:j结果集对象

    该对象包含访问查询结果的方法,ResultSet可以通过索引或列名获取列数据。它包含如下常用方法来移动记录直至:
    (1)void close():释放ResultSet对象。
    (2)boolean absolute(int row):将结果集的记录指针移动到第row行,如果为负,则倒着移动。如果移动后的记录指针指向一条有效记录,则方法返回true。
    (3)void beforeFirst():将ResultSet的记录指针定位到首行之前,这是ResultSet结果集记录指针的初始状态——记录指针的起始位置位于第一行之前。
    (4)boolean first():将ResultSet的记录指针定位到首行,如果移动后的记录指针指向一条有效记录,则方法返回true。
    (5) boolean previous():将ResultSet的记录指针定位到上一行,如果移动后的记录指针指向一条有效记录,则方法返回true。
    (6) boolean next():将ResultSet的记录指针定位到下一行,如果移动后的记录指针指向一条有效记录,则方法返回true。
    (7) boolean last():将ResultSet的记录指针定位到最后一行,如果移动后的记录指针指向一条有效记录,则方法返回true。
    (8) void afterLast():将ResultSet的记录指针定位到最后一行之后。
    当比记录移动到指定行之后,ResultSet可通过getXxx(int columnIndex)或getXxx(String columnLable)方法来获得当前行、指定列的值,前者更据列索引值获取值,后者根据列名获取值。
    Java 7新增了 T getObject(int columnIndex,Class type)和 T getObject(String columnLabel,Class type)两个泛型方法,它们可以获取任意类型的值。

    二、JDBC编程步骤

    2.1 加载数据库驱动。

    通常使用Class类的forName()静态方法来加载驱动。例如下面代码:

    Class.forName(dirverClass);
    

    注意:最新的JDBC驱动以及可以通过SPI自动注册驱动类了,在JDBC驱动JAR包的META-INFservice路径下会包含一个java.sql.Driver文件,该文件制定了JDBC驱动类。因此,如果使用最新的驱动JAR包,第一步可以省略。
    上面代码中driverClass就是数据库驱动类所对应的字符串。例如:加载MySQL的驱动采用如下代码:

    Class.forName("com.mysql.cj.jdbc.Driver");
    

    加载Oracle的驱动:

    Class.forName("oracle.jdbc.driver.OracleDriver");
    

    每个数据库厂商在提供数据库驱动(通常是一个JAR文件)时,总会提供相应的文档,其中有关驱动了ide介绍。文档类还会提及数据库URL写法,以及连接数据库的范例代码。

    2.2 通过DriverManager获取数据库连接。

    DriverManager提供如下方法:

    DriverManager.getConnection(String url,String user,String pass);
    

    三个参数分别为数据库URL、登录数据库的用户名和密码。其中用户名和密码通常由DBA(数据库管理员)分配,而且该用户还具有相应权限,才可以执行相应的SQL语句。
    s数据库URL通常遵循如下写法:

    jdbc:subprotool:other stuff
    

    上面写法中jdbc是固定的,subprotool指定连接到特定数据库的驱动,other stuff不固定。
    例如MySQL的URL写法:

    jdbc:mysql://hostname:port/databasename
    

    Oracle的URL的写法:

    jdbc:oracle:thin:@hostname:port:databasename
    

    2.3 通过Connection对象创建Statement对象

    创建Statement对象有三个方法:
    (1)createStatement():返回一个基本的Statement对象。
    (2)prepareStatement(String sql):根据传入的SQL语句创建预编译的Statement对象。
    (3)prepareCall(String aql):根据传入的SQL语句创建prepareCall对象。

    2.4 使用statement执行SQL语句

    所有Statement都有如下三个方法执行SQL语句:
    (1)excute(String sql):该方法可执行任何SQL语句,但比较麻烦。如果执行后第一个结果为ResultSet对象,则返回true;如果执行后第一个结果为受影响的行数或没有任何结果,则返回false。
    (2)int executeUpdate(String sql ):主要用于执行DML和DDL语句。用于执行DML语句,并返回受影响的行数;该方法也可以用于执行DDL语句,执行DDL语句将返回0
    (3)ResultSet executeQuery(String sql):该方法用于执行查询语句,并返回查询结果到对应的ResultSet对象中。只能执行查询语句。

    2.5 操作结果集

    如果执行SQL语句是查询语句,则将返回一个ResultSet对象,该对象里保存了SQL语句的查询结果。程序可以通过操作该对象来取出查询结果。
    ResultSet对象主要提供量类方法:
    (1)next()、previous()、first()、last()、beforeFirst()、afterLast()、absolute()等移动记录指针的方法。
    (2)getXxx()方法来获取记录指针指向行、列的值。该方法既可以通过列索引作为参数,也可以使用列参数名作为参数。使用列索引作为参数性能更好,使用列名作为参数性能更好。
    ResultSet实质是一个查询结果集,在逻辑结构上非常类似于一个表。下图显示了ResultSet的逻辑结构,以及操作ResultSet结果集并获取值的方法示意图:

    2.6 回收数据库资源

    包括关闭ResultSet、Statement、Connection等资源。
    下面程序示范了JDBC编程,并通过ResultSet获取结果集的过程:

    import java.sql.*;
    
    public class ConnMySql
    {
        public static void main(String[] args) throws Exception
        {
            // 1.加载驱动,使用反射的知识,现在记住这么写。
            Class.forName("com.mysql.cj.jdbc.Driver");
            try (
                    // 2.使用DriverManager获取数据库连接,
                    // 其中返回的Connection就代表了Java程序和数据库的连接
                    // 不同数据库的URL写法需要查驱动文档知道,用户名、密码由DBA分配
                    Connection conn = DriverManager.getConnection(
                            "jdbc:mysql://127.0.0.1:3306/select_test?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true",
                            "root", "ZX19950222");
                    // 3.使用Connection来创建一个Statment对象
                    Statement stmt = conn.createStatement();
                    // 4.执行SQL语句
    			/*
    			Statement有三种执行sql语句的方法:
    			1 execute 可执行任何SQL语句。- 返回一个boolean值,
    			  如果执行后第一个结果是ResultSet,则返回true,否则返回false
    			2 executeQuery 执行Select语句 - 返回查询到的结果集
    			3 executeUpdate 用于执行DML语句。- 返回一个整数,
    			  代表被SQL语句影响的记录条数
    			*/
                    ResultSet rs = stmt.executeQuery("select s.*, teacher_name"
                            + " from student_table s, teacher_table t"
                            + " where t.teacher_id = s.java_teacher"))
            {
                // ResultSet有系列的getXxx(列索引 | 列名),用于获取记录指针
                // 指向行、特定列的值,不断地使用next()将记录指针下移一行,
                // 如果移动之后记录指针依然指向有效行,则next()方法返回true。
                while (rs.next())
                {
                    System.out.println(rs.getInt(1) + "	"
                            + rs.getString(2) + "	"
                            + rs.getString(3) + "	"
                            + rs.getString(4));
                }
            }
        }
    }
    

    运行结果:

  • 相关阅读:
    基于matlab的退化图像复原(一)------图像退化处理
    风洞稳定小球系统(二)----- 基于Arduino实现的PID距离PWM控制
    风洞稳定小球系统(一)----- 基于MATLAB实现的Kalman filter滤波距离检测
    matlab基本粒子群算法实现(四)
    使用SC命令时注意事项
    abiword Namespace List
    Improving the AbiWord's Piece Table
    Font Rending 的 Hint 机制对排版的影响
    abiword Related Pages
    跟我一起写 Makefile
  • 原文地址:https://www.cnblogs.com/weststar/p/12684983.html
Copyright © 2020-2023  润新知