欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Java进阶学习第十九天dbutils与案例

程序员文章站 2024-02-04 12:01:52
...

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.05.15 lutianfei none 元数据 元数据(metaData) 指数据库中 库 、 表 、 列 的定义信息 DataBaseMetaData 数据库元数据 获取一个DataBaseMetaData Connection接口中定义了一个方法 getMetaDat

文档版本 开发工具 测试平台 工程名字 日期 作者 备注
V1.0 2016.05.15 lutianfei none

元数据

  • 元数据(metaData) 指数据库中 的定义信息

DataBaseMetaData 数据库元数据

  • 获取一个DataBaseMetaData

    • Connection接口中定义了一个方法 getMetaData();
    • Connection.getMetaData()
  • 通过DataBaseMetaData获得 数据库连接基本参数

    • getURL():返回一个String类对象,代表数据库的URL。
    • getUserName():返回连接当前数据库管理系统的用户名。
    • getDriverName():返回驱动驱动程序的名称。
    • getPrimaryKeys(String catalog, String schema, String table):返回指定表主键列的结果集
  • 获得数据库、主键外键 定义信息

    • getTables
    • getColumns
    • getPrimaryKeys
  • 常用API

    • String driverName = dmd.getDriverName(); //获取驱动名称
    • String userName = dmd.getUserName();//获取用户名
    • String url = dmd.getURL();//获取url
    • String databaseProductName = dmd.getDatabaseProductName(); //获取数据库名称
    • String databaseProductVersion = dmd.getDatabaseProductVersion();//获取数据库版本.
    • ResultSet getPrimaryKeys(String catalog,String schema,String table)
      • 获取表中主键相关描述,每个主键列描述都有以下列:
        • TABLE_CAT String => 表类别(可为 null)
        • TABLE_SCHEM String => 表模式(可为 null)
        • TABLE_NAME String => 表名称
        • COLUMN_NAME String => 列名称
        • KEY_SEQ short => 主键中的序列号(值 1 表示主键中的第一列,值 2 表示主键中的第二列)。
        • PK_NAME String => 主键的名称(可为 null)


ParameterMetaData 参数元数据

  • 参数元数据主要用于获取:sql语句中占位符的相关信息.

  • PreparedStatement . getParameterMetaData()

    • 获得代表PreparedStatement元数据的ParameterMetaData对象。
  • 常用API

    • getParameterCount():获得指定参数的个数
    • getParameterTypeName(int param) :获得指定参数的sql类型
  • 注意:在获取参数类型时会产生异常

    • java.sql.SQLException: Parameter metadata not available for the given statement
  • 解决方案:
    • 在url后添加参数:jdbc : mysql:///day18?generateSimpleParameterMetadata=true
    • 原因:是mysql驱动的支持问题。


ResultSetMetaData 结果集元数据(重点)

  • ResultSet. getMetaData()

    • 获得代表ResultSet对象元数据的ResultSetMetaData对象。
  • 常用API

    • getColumnCount() 返回resultset对象的列数
    • getColumnName(int column) 获得指定列的名称
    • getColumnTypeName(int column) 获得指定列的类型
    public static void main(String[] args) throws SQLException {

        Connection con = JdbcUtils.getConnection();
        ResultSet rs = con.createStatement().executeQuery(
                "select * from account");

        // 得到结果集元数据
        ResultSetMetaData rsmd = rs.getMetaData();

        // System.out.println(rsmd.getColumnCount());//获取结果集中列数量
        //
        // System.out.println(rsmd.getColumnName(2));//获取结果集中指定列的名称.
        //
        // System.out.println(rsmd.getColumnTypeName(3));//获取结果集中指定列的类型。

        int count = rsmd.getColumnCount();

        for (int i = 1; i 

            System.out.print(rsmd.getColumnName(i)+"("+rsmd.getColumnTypeName(i)+")" + "\t");
        }
        System.out.println();

        while (rs.next()) {
            for (int i = 1; i 
                System.out.print(rs.getObject(i) + "\t\t");
            }
            System.out.println();
        }
    }


dbutils工具

  • commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序的性能。因此dbutils成为很多不喜欢hibernate的公司的首选。

  • 简单说,它就是一个简单的jdbc封装工具,使用dbutils可以简化操作,要使用dbutils需要导入jar包。

  • JAR包: commons.dbutils-1.4.jar

  • API介绍:

    • org.apache.commons.dbutils.QueryRunner — 核心
    • org.apache.commons.dbutils.ResultSetHandler
  • 工具类
    • org.apache.commons.dbutils.DbUtils。


DBUtils学习

  • 1、QueryRunner 框架核心类 ,所有数据库操作都是必须通过 QueryRunner 进行的,用于执行sql语句的类。

    • 1.query 用于执行select
    • 2.update 用于执行update delete insert
    • 3.batch 批处理
  • 2、ResultSetHandler 结果集封装接口,完成将ResultSet 结果集 封装为一个Java对象

    • 用于定义结果集的封装
    • 它提供九个实现类,可以进行不同的封装。
  • 3、DbUtils 工具类 提供驱动管理、事务管理、释放资源等一系列公共方法

    • 它提供关于关闭资源以及事务rollback,commit操作。
    • DbUtils里面的所有方法都是静态的。主要方法如下:
      • public static void close(…) throws java.sql.SQLException
        • DbUtils类提供了三个重载的关闭方法。这些方法检查所提供的参数是不是NULL,如果不是的话,它们就关闭Connection、Statement和ResultSet。
      • public static void closeQuietly(…)
        • 这一类方法不仅能在Connection、Statement和ResultSet为NULL情况下避免关闭,还能隐藏一些在程序中抛出的SQLException。
      • public static void commitAndCloseQuietly(Connection conn)
        • 用来提交连接,然后关闭连接,并且在关闭连接时不抛出SQL异常。
      • public static boolean loadDriver(java.lang.String driverClassName):这一方装载并注册*JDBC驱动程序*,如果成功就返回true。使用该方法,你不需要捕捉这个异常ClassNotFoundException。


Dbutlis详解

  • 1.QueryRunner怎样获取

    • 1.new QueryRunner()
      • 如果是使用这种构造创建的QueryRunner,它的事务是手动控制
    • 2.new QueryRunner(DataSource ds);
      • 如果是使用这种构造,它的事务是自动事务,简单说,一条sql一个事务
  • 2.QueryRunner中的三个核心方法

    • query
    • update
    • batch
    • 对于上述三个方法,它们提供很多重载。
      • 如果QueryRunner在创建时,没有传递DataSource参数,那么在使用query,update,batch方法时,要传递Connection参数
      • 如果QueryRunner在创建时,传递了Dataource参数,那么在使用query,update,batch方法时,不需要传递Connection参数。
  • 总结:

  • 怎样配套使用:

    • QueryRunner runner=new QueryRunner();
      • runner.query(Connection,sql,ResultSetHandler,Object… param);
      • runner.update(Connection,sql,Object…param);
      • runner.batch(Connection con,sql,Object[][] objs);
    • QueryRunner runner=new QueryRunner(DataSource ds);
      • runner.query(sql,ResultSetHandler,Object… param);
      • runner.update(sql,Object…param);
      • runner.batch(sql,Object [][] objs);
  • 模仿QueryRunner

  • 1.query方法模仿
public  T query(Connection con, String sql, MyResultSetHandler mrs,Object... params) throws SQLException {

        PreparedStatement pst = con.prepareStatement(sql); // 得到一个预处理的Statement.
        // 问题:sql语句中可能存在参数,需要对参数赋值。

        ParameterMetaData pmd = pst.getParameterMetaData();
        // 可以得到有几个参数
        int count = pmd.getParameterCount();
        for (int i = 1; i params