• jdbc详解(三)


    开源数据库连接池

    l 现在很多 WEB 服务器 ( Weblogic , WebSphere , Tomcat) 都提供了 DataSoruce 的实现,即连接池的实现。通常我们把 DataSource 的实现,按其英文含义称之为数据源,数据源中都包含了数据库连接池的实现。
    l 也有一些开源组织提供了数据源的独立实现:
    DBCP 数据库连接池
    C3P0 数据库连接池
    l 实际应用时不需要编写连接数据库代码,直接从数据源获得数据库的连接。 程序员编程时也应尽量使用这些数据源的实现,以提升程序的数据库访问性能。

    DBCP数据源

    l DBCP Apache 软件基金组织下的开源连接池实现,使用 DBCP 数据源,应用程序应在系统中增加如下两个 jar 文件:
    Commons-dbcp.jar :连接池的实现
    Commons-pool.jar :连接池实现的依赖库
    l Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

    DBCP数据源

    static{

      InputStream in =JdbcUtil.class.getClassLoader().

      getResourceAsStream("dbcpconfig.properties");

      Properties prop = newProperties();

      prop.load(in);

      BasicDataSourceFactoryfactory =newBasicDataSourceFactory();

      dataSource =factory.createDataSource(prop);

    }

    C3P0数据源

    JNDI技术简介

    l JNDI(Java Naming and DirectoryInterface) Java 命名和目录接口,它对应于 J2SE 中的 javax.naming 包,
    l 这套 API 的主要作用在于:它可以把 Java 对象放在一个容器中( JNDI 容器),并为容器中的 java 对象取一个名称,以后程序想获得 Java 对象,只需通过名称检索即可。
    l 其核心 API Context ,它代表 JNDI 容器,其 lookup 方法为检索容器中对应名称的对象。

    编写自己的JDBC框架

    元数据-DataBaseMetaData

    l 元数据:数据库、表、列的定义信息。
    l Connection.getDatabaseMetaData ()
    l DataBaseMetaData 对象
    getURL () :返回一个 String 类对象,代表数据库的 URL
    getUserName () :返回连接当前数据库管理系统的用户名。
    getDatabaseProductName () :返回数据库的产品名称。
    getDatabaseProductVersion () :返回数据库的版本号。
    getDriverName () :返回驱动驱动程序的名称。
    getDriverVersion () :返回驱动程序的版本号。
    isReadOnly () :返回一个 boolean 值,指示数据库是否只允许读操作。

    元数据-ParameterMetaData

    l PreparedStatement . getParameterMetaData ()
    获得代表 PreparedStatement 元数据的 ParameterMetaData 对象。
    Select* from user where name=? And password=?
    l ParameterMetaData 对象
    getParameterCount ()
    获得指定参数的个数
    getParameterType ( int   param )
    获得指定参数的 sql 类型

    元数据-ResultSetMetaData

    l ResultSet . getMetaData ()
    获得代表 ResultSet 对象元数据的 ResultSetMetaData 对象。
    l ResultSetMetaData 对象
    getColumnCount ()
    返回 resultset 对象的列数
    getColumnName ( int  column)
    获得指定列的名称
      getColumnTypeName ( int  column)
    获得指定列的类型

    使用元数据简化JDBC代码

    l 业务背景:系统中所有实体对象都涉及到基本的 CRUD 操作:
    所有实体的 CUD 操作代码基本相同,仅仅发送给数据库的 SQL 语句不同而已,因此可以把 CUD 操作的所有相同代码抽取到工具类的一个 update 方法中,并定义参数接收变化的 SQL 语句。
    实体的 R 操作,除 SQL 语句不同之外,根据操作的实体不同,对 ResultSet 的映射也各不相同,因此可义一个 query 方法,除以参数形式接收变化的 SQL 语句外,可以使用策略模式由 qurey 方法的调用者决定如何把 ResultSet 中的数据映射到实体对象中。

    O-RMapping简介

    l 什么是 O-R Mapping
    l 常用 O-R Mapping 映射工具
    Hibernate
    Ibatis
    Commons DbUtils ( 只是对 JDBC 简单封装 )

    ApacheDBUtils框架

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

    DbUtils

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

    QueryRunner

    l 该类简单化了 SQL 查询,它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作,能够大大减少编码量。
    l QueryRunner 类提供了两个构造方法:
    默认的构造方法
    需要一个 javax.sql.DataSource 来作参数的构造方法。

    QueryRunner类的主要方法

    l publicObject query(Connection conn, String sql , Object[] params , ResultSetHandler rsh ) throws SQLException :执行一个查询操作,在这个查询中,对象数组中的每个元素值被用来作为查询语句的置换参数。 该方法会自行处理 PreparedStatement ResultSet 的创建和关闭
    l publicObject query(String sql , Object[] params , ResultSetHandler rsh ) throws SQLException : 几乎与第一种方法一样;唯一的不同在于它不将数据库连接提供给方法,并且它是从提供给构造方法的数据源 ( DataSource ) 或使用的 setDataSource 方法中重新获得 Connection
    l
    l publicObject query(Connection conn, String sql , ResultSetHandler rsh ) throws SQLException : 执行一个不需要置换参数的查询操作。
    l
    l public int update(Connection conn, String sql , Object[] params ) throws SQLException : 用来执行一个更新(插入、更新或删除)操作。
    l
    l public int update(Connection conn, String sql ) throws SQLException :用来执行一个不需要置换参数的更新操作。

    ResultSetHandler接口

    l 该接口用于处理 java.sql.ResultSet ,将数据按要求转换为另一种形式。
    l ResultSetHandler 接口提供了一个单独的方法: Object handle ( java.sql.ResultSet . rs )

    ResultSetHandler接口的实现类

    l ArrayHandler :把结果集中的第一行数据转成对象数组。
    l ArrayListHandler :把结果集中的每一行数据都转成一个数组,再存放到 List 中。
    l BeanHandler :将结果集中的 第一行 数据封装到一个对应的 JavaBean 实例中。
    l BeanListHandler :将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中,存放到 List 里。
     
    l ColumnListHandler :将结果集中某一列的数据存放到 List 中。
    l KeyedHandler (name) :将结果集中的每一行数据都封装到一个 Map< 列名 , 列值 > 里,再把这些 map 再存到一个 map 里,其 key 为指定的 key
    l MapHandler :将结果集中的第一行数据封装到一个 Map 里, key 是列名, value 就是对应的值。
    l MapListHandler :将结果集中的每一行数据都封装到一个 Map 里,然后再存放到 List
    注意事项
    l 不管 java 的对象存在何种关系,反映到关系型数据库中,都是使用外键表示纪录(即对象)的关联关系。
    l 设计 java 对象如涉及到多个对象相互引用,要尽量避免使用一对多,或多对多关系,而应使用多对一描述对象之间的关系 ( 或使用延迟加载的方式 )
  • 相关阅读:
    IoC就是IoC,不是什么技术,与GoF一样,是一种 设计模式。
    控制反转是Spring框架的核心。
    一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) set 注入
    IOC 的理解与解释
    java 单例模式5种写法
    AOP(Aspect Oriented Programming),即面向切面编程
    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题
    ioc和aop的区别?
    JAVA设计模式之单例模式
    详解JNDI的lookup资源引用 java:/comp/env
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3283645.html
Copyright © 2020-2023  润新知