zoukankan      html  css  js  c++  java
  • 第41周星期二数据库连接小结

    先记录下今天几个教训:1.串口工作在通明通道模式时也只能打开一次,其它程序再打开就会失败,注意串口独占通信;2.word中除了用表格定位外也可以用文本框定位,类似于Htm中可以用table和div定位一样的道理。3.被领导说我的用户需求写的太多太复杂了,我很是惭愧,之前也想写简单,但没有真正执行,花了长时间写的这么复杂,我该认真反思一下,工作这么长时间了还没有学会把事情变简单,而是把事情复杂化,要记住多思考,尽量把事情简单化。

    今天按计划要学习总结Hibernate相关知识,发现自己对JDBC相关概念也不很熟悉,就从头学习了数据库连接相关知识。摘录自维基百科和百度百科,只选择自己已看懂且感觉比较好的内容。

    1.ODBC

    ODBC(Open Database Connectivity,开放数据库互连)提供了一种标准的API应用程序编程接口)方法来访问DBMS(Database Management System)。这些API利用SQL来完成其大部分任务。ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。ODBC的设计者们努力使它具有最大的独立性和开放性:与具体的编程语言无关,与具体的数据库系统无关,与具体的操作系统无关。在ODBC诞生之前,如果要开发数据库应用程序,则必须要使用数据库厂商随数据库产品一同发布的一些工具集来访问数据库,或者在程序中使用嵌入式SQL来访问数据库。当时,对于访问数据库的方法,缺乏一个基于C语言的统一编程接口。在这种背景下,微软于1992年发表了ODBC。之后,X/Open组织以及ISO标准化组织基于ODBC 3.0的规范,进一步进行了标准化,于1995年发表了SQL/CLI标准。该标准已经成为了SQL标准的一部分。

    ODBC的运用形态通常是由应用程序经过一个称之为ODBC管理器的工具,间接调用ODBC驱动程序,从而访问对应的数据库。对于用户的应用程序而言,ODBC驱动程序是相对不可见的。用户只需要在ODBC管理器中配置相应的数据库的数据源信息,并登录相应的ODBC驱动程序即可。各个数据库厂商通常都为自己的数据库实现了ODBC驱动程序。从Oracle,DB2,SQL Server到微软的Access数据库,都实现了面向各自数据库产品的数据驱动程序。而对于ODBC管理器,目前主要存在以下几种实现:

    • Microsoft ODBC:微软提供的一个实现,目前在大部分Windows系统上可以找到它。
    • unixODBC:unixODBC项目为非Windows操作系统(如各版本的Linux, Unix以及Mac OS)提供的一个实现。unixODBC的实现涵盖了ODBC 3.0中的所有API规范,并且提供了一个类似于Microsoft ODBC那样的GUI形式的配置界面供用户进行数据源的配置。unixODBC的代码在GPL协议下公开,目前该项目是由Easysoft的Nick Gorham进行管理。unixODBC现在已经是很多Linux发行版的标准安装模式下的一个必要组件。
    • iODBC:iODBC项目(Independent Open DataBase Connectivity)的目标是提供一个平台无关的实现,该项目目前由Openlink Software进行管理。其代码是在LGPL协议以及BSD协议下发布。苹果公司从Mac OS X v10.2时代开始,便将iODBC绑定至Mac OS操作系统中。

    2.ADO

    ADOActiveX Data Objects) 是一个用于访问数据源的COM组件。它提供了编程语言和统一数据访问方式OLE DB的一个中间层。允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。访问数据库的时候,关于SQL的知识不是必要的,但是特定数据库支持的SQL命令仍可以通过ADO中的命令对象来执行。ADO被设计来继承微软早期的数据访问对象层,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被发布。

    ADO包含一些顶层的对象:

    • 连接(Connection),代表到数据库的连接
    • 记录集(Recordset),代表数据库记录的一个集合
    • 命令(Command),代表一个SQL命令
    • 记录(Record),代表数据的一个集合
    • 流(Stream),代表数据的顺序集合
    • 错误(Error),代表数据库访问中产生的意外
    • 字段(Field),代表一个数据库字段
    • 参数(Parameter),代表一个SQL参数
    • 属性(Property),保存对象的信息

    ADO组件的使用需要利用支持COM的高级语言,例如Delphi也支持使用ADO来访问数据库。使用 ADO 访问数据的一些基本步骤:

    1. 创建连接对象去链接数据库(Create a connection object to connect to the database.)
    2. 创建记录集对象来取得数据(Create a recordset object in order to receive data in.)
    3. 打开连接(Open the connection)
    4. 在记录集中完成SQL语法的描述(Populate the recordset by opening it and passing the desired table name or SQL statement as a parameter to open function.)
    5. 对获取的数据进行搜索/处理操作。
    6. 确定改变数据(Commit the changes you made to the data (if any) by using Update or UpdateBatch methods.)
    7. 关闭记录集(Close the recordset)
    8. 关闭连接(Close the connection)

    3.JDBC

    Java 数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标,它JDBC是面向关系型数据库的。目前,Microsoft 的 ODBC API 可能是使用最广的、用于访问关系数据库编程接口。它能在几乎所有平台上连接几乎所有的数据库。Java 可以使用 ODBC,但最好是在 JDBC 的帮助下以 JDBC-ODBC 桥的形式使用,但 ODBC 不适合直接在 Java 中使用,因为它使用 C 语言接口。从Java 调用本地 C 代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。从 ODBC C API 到 Java API 的字面翻译是不可取的。例如,Java 没有指针,而 ODBC 却对指针用得很广泛(包括很容易出错的指针"void *")。您可以将 JDBC 想象成被转换为面向对象接口的 ODBC,而面向对象的接口对 Java 程序员来说较易于接受。

      ODBC 很难学。它把简单和高级功能混在一起,而且即使对于简单的查询,其选项也极为复杂。相反,JDBC 尽量保证简单功能的简便性,而同时在必要时允许使用高级功能。启用"纯 Java "机制需要象 JDBC 这样的 Java API。如果使用ODBC,就必须手动地将 ODBC 驱动程序管理器和驱动程序安装在每台客户机上。如果完全用 Java 编写 JDBC 驱动程序则 JDBC 代码在所有 Java 平台上(从网络计算机到大型机)都可以自 动安装、移植并保证安全性。

      总之,JDBC API 对于基本的 SQL 抽象和概念是一种自然的 Java 接口。它建立在 ODBC 上而不是从零开始。因此,熟悉 ODBC 的程序员将发现 JDBC 很容易使用。JDBC 保留了 ODBC 的基本设计特征;事实上,两种接口都基于 X/Open SQL CLI(调用级接口)。它们之间最大的区别在于:JDBC 以 Java 风格与优点为基础并进行优化,因此更加易于使用。

      目前,Microsoft 又引进了 ODBC 之外的新 API: RDO、 ADO 和OLE DB。这些设计在许多方面与 JDBC 是相同的,即它们都是面向对象的数据库接口且基于可在 ODBC 上实现的类。但在这些接口中,我们未看见有特别的功能使我们要转而选择它们来替代 ODBC,尤其是在 ODBC 驱动程序已建立起较为完善的市场的情况下。它们最多也就是在 ODBC 上加了一种装饰而已。

    JDBC驱动程序共分四种类型:

    1:JDBC-ODBC桥:这种类型的驱动把所有JDBC的调用传递给ODBC,再让后者调用数据库本地驱动代码(也就是数据库厂商提供的数据库操作二进制代码库,例如Oracle中的oci.dll)。

    优点: 只要有对应的ODBC驱动(大部分数据库厂商都会提供),几乎可以访问所有的数据库。

    缺点: 执行效率比较低,不适合大数据量访问的应用; 由于需要客户端预装对应的ODBC驱动,不适合Internet/Intranet应用。

    2:本地API驱动 :这种类型的驱动通过客户端加载数据库厂商提供的本地代码库(C/C++等)来访问数据库,而在驱动程序中则包含了Java代码。

    优点: 速度快于第一类驱动(但仍比不上第3、第4类驱动)。

    缺点 :由于需要客户端预装对应的数据库厂商代码库,仍不适合Internet/Intranet应用。

    3:网络协议驱动 :这种类型的驱动给客户端提供了一个网络API,客户端上的JDBC驱动程序使用套接字(Socket)来调用服务器上的中间件程序,后者在将其请求转化为所需的具体API调用。

    优点: 不需要在客户端加载数据库厂商提供的代码库,单个驱动程序可以对多个数据库进行访问,可扩展性较好。

    缺点: 在中间件层仍需对最终数据进行配置; 由于多出一个中间件层,速度不如第四类驱动程序。

    4:本地协议驱动 :这种类型的驱动使用Socket,直接在客户端和数据库间通信。

    优点: 访问速度最快; 这是最直接、最纯粹的Java实现。

    缺点: 因为缺乏足够的文档和技术支持,几乎只有数据库厂商自己才能提供这种类型的JDBC驱动; 需要针对不同的数据库使用不同的驱动程序。

    尽管JDBC在JAVA语言层面实现了统一,但不同数据库仍旧有许多差异。为了更好地实现跨数据库操作,于是诞生了Hibernate项目,Hibernate是对JDBC的再封装,实现了对数据库操作更宽泛的统一和更好的可移植性

    4.Hibernate

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。

    Hibernate的核心接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。这6个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。

    Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。   

    SessionFactory接口:SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

    Configuration类:Configuration类负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。Transaction接口

    Transaction接口:负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码

    Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语句或SQL语句两种表达方式。

    Hibernate 中提供了两级Cache(高速缓冲存储器),第一级别的缓存是Session级别的缓存,它是属于事务范围的缓存。这一级别的缓存由hibernate管理的,一般情况下无需进行干预;第二级别的缓存是SessionFactory级别的缓存,它是属于进程范围或群集范围的缓存。这一级别的缓存可以进行配置和更改,并且可以动态加载和卸载。 Hibernate还为查询结果提供了一个查询缓存,它依赖于第二级缓存。

    hibernate工作原理:

      1、通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件

      2、由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>读取解析映射信息。

      3、通过config.buildSessionFactory();//得到sessionFactory。

      4、sessionFactory.openSession();//得到session。

      5、session.beginTransaction();//开启事务。

      6、persistent operate;

      7、session.getTransaction().commit();//提交事务

      8、关闭session;

      9、关闭sessionFactory;

    hibernate优点:

      1、封装了jdbc,简化了很多重复性代码。

      2、简化了DAO层编码工作,使开发更对象化了。

      3、移植性好,支持各种数据库,如果换个数据库只要在配置文件中变换配置就可以了,不用改变hibernate代码。

      4、支持透明持久化,因为hibernate操作的是纯粹的(pojo)java类,没有实现任何接口,没有侵入性。所以说它是一个轻量级框架。

    hibernate延迟加载

      get不支持延迟加载,load支持延迟加载。

      1、hibernate2对 实体对象和集合 实现了延迟加载

      2、hibernate3对 提供了属性的延迟加载功能

  • 相关阅读:
    Java的值传递机制
    面向对象
    java中static关键字的作用
    方法的重载和重写
    this和super的用法
    Java中关于return的理解
    java经典的内存图 (数据结构)
    java IO最让初学者误解的取名方式
    UDP 与 TCP简单入门理解示例
    Shiro简单入门
  • 原文地址:https://www.cnblogs.com/doit8791/p/2717328.html
Copyright © 2011-2022 走看看