Java JDBC学习

    要连接数据库,可以向java.sql.DriverManager要求并获得java.sql.Connection对象,Connection是数据库连接的具体代表对象,一个Connection对象就代表一个数据库连接,可以使用DriverManager的getConnection方法,制定JDBC URL作为自变量并获得Connection对象:

    String url ="jdbc:mysql://localhost:3306/demo?" +

                "user=root&password=123";

    Connection  conn = DriverManager.getConnection(url);

 

    可以将JDBC URL、用户名称与密码等设置信息编写在一个属性文件中,由程序读取这个属性文件中的信息,如果需要变更信息,则只需要修改属性文件,无需修改程序、重新编译。在 Java SE中,属性文件的读取可以交给java.util.Properties类。

 

    在数据库应用程序中,数据库连接的获得是一个耗费时间与资源的操作,包括了建立 Socket connection 、交换数据(用户密码验证、相关参数)、会话(Session)、日志(Loggin)、分配进程(Process)等资源。

    如果数据库的操作是很频繁的动作,则要考虑到重复使用连接的需求,以节省在获得连接时的时间与资源,通常会实现一个连接池,有需要连接时可以从池中获得,不需要连接时就将连接放回池中,而不是直接关闭连接。

 

使用JDBC进行数据操作

    表数据操作的基本技术如下:

    1. Statement类用于执行静态SQL语句并反悔它所生成结果的对象。一个Statement对象只能打开一个ResultSet对象。

    2. Statement类的execute(String sql)方法执行给定的SQL语句,它的返回值类型为boolean。标志如果第一个结果为ResultSet对象,返回true,如果其为更新计数或不存在任何结果,返回false。

    3. Statement类的executeQuery(String sql)方法用于执行查询SQL语句,返回查询的结果集,一个ResultSet对象。

    4. ResultSet的next()方法的作用是将指针从当前位置向下移动一行。它的返回值类型为boolean,表示如果新的当前行不为Null,则返回true,负责返回false,此方法通常用于while语句并作为判断是否存在数据的依据。

    5. ResultSet的getString(String columnName)方法的作用是以字符串的形式返回ResultSet对象的当前行中指定列名的值。

    6. Statement类的executeUpdate(String sql)方法用于执行更新SQL语句,包括插入、修改和删除语句,返回一个int值,表示更新的行的计数。

    7. ResultSetMetaData接口的作用是获取ResultSet对象中列的类型和属性信息。由于ResultSetMetaData是接口,所以没有构造函数,所以不能使用new创建ResultSetMetaData对象,但是可以通过ResultSet的getMetaData()创建,如 

        String sql = "select ...";

        Statement sm = null;

        sm = con.getStatement();    

        ResultSet= sm.executeQuery(sql);

        ResultSetMetaData md = rs.getMetaData();

    8.ResultSetMetaData的getColumnName(int column)可以获取指定列的名称,其中column指的是列数。

    9. ResultSetMetaData的getColumnTypeName(int column)返回检索指定列的数据库特定的类型名称,其中column指的是列数。

    10. ResultSetMetaData的isNullable(int column)的作用是说明指定列中的值是否可以为null,其中column指的是列数。

 

批处理:

    1. DatabaseMetaData接口是描述有关数据库的整体综合信息,由于DatabaseMetaData是接口,所以没有构造方法,故不能用new来创建DatabaseMetaData对象,但是可以通过Connection 的getMetaData()方法来创建。例如:

        DatabaseMetaData = con.getMetaData();

    2. DataBaseMetaData类的supportsBatchUpdates方法用于判断此数据库是否支持批量更新。其返回值为boolean。

    3. Statement的addBatch(String sql)方法将给定的SQL命令添加至此Statement对象的当前命令列表中,此方法可多次调用。

    4. Statement的executeBatch()方法的作用是将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

    

        public static int[] startBatch(Connection con ,String[] sqls) throws Exception

        {

            if(sqls == null)    return null;

            Statement sm = con.createStatement();

            for(int i = 0 ; i<sqls.length; i++)

            {

                sm.addBatch(sqls[i]);

            }

            return sm.executeBatch();

        }

        函数调用结果:

        int[] results = startBatch(con,sqls);

        for(int i = 0;i<sqls.length ;i++)

        {

            if(results[i] >0 ) System.out.println("语句" + sqls[i] + "执行成功,影响了" +results[i] + "行数据");

            else if(results[i] == Statement.SUCCESS_NO_INFO) System...影响的函数未知;

            else if( results[i] == Statement.EXCUTE_FAILED)    执行失败;

        }

 

事务处理:

    1. DatabaseMetaData的supportsTransactions()方法可以判断数据库是否支持事物。它的返回值类型为boolean。

    2. 数据库连接Connection对象默认是自动提交的。为了控制事务提交,则需在事务提交之前,调用Connection的setAutoCommit(boolean autoCommit)方法关闭数据库连接的自动提交模式,其中参数autoCommit为true,表示启用自动提交模式;为false,表示禁用该模式。以后只有调用Connection的commit方法,才会将所有的操作提交到数据库。

    3. Connection的rollback方法,执行回滚操作,其作用是如果一同进行操作的语句,有一条出现了错误,那么其他的语句也会操作无效。使用此方法时,需要注意的是只能在setAutoCommit(false)的模式下使用。

 

     try

     {

        System.out.println("事物开始");

        con.setAutoCommit(false);

        sm = con.createStatement();

        for(int i = 0;i<sqls.length;i++)

        {

            sm.execute(sqls[i]);        //执行sql语句,但没更新到数据库

        }

        System.out.println("事物提交");

        con.commit();

        System.out.println("事物结束");

    }

    catch(SQLException e)

    {    

        con.rollback();        //出现异常时,进行回滚操作,取消前面执行的操作。

    }

posted @ 2012-07-15 13:22  非著名程序师  阅读(354)  评论(0编辑  收藏  举报