您的位置:首页 > 编程语言 > Java开发

JavaEE学习笔记之SSH—Hibernate(1)

2016-07-03 21:28 465 查看
Hibernate介绍

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

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

  

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

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

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

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

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

需要使用Hibernate框架,就需要先把环境配好。

步骤:

1)先把Hibernate 的 jar 包下载下来:

在百度上输入 hibernate download  搜索——>点击Hibernate ORM Downloads - Hibernate ORM——>选择相应版本点击stable即可下载


这里就是我用的 Hibernate 版本下载地址:http://download.csdn.net

2)导入相应 jar 包,到底该导入哪些 jar 包呢,将下载好的Hibernate压缩包解压,导入下面这些到工程中:

导入解压完文件夹中 lib->required 中的jar包。(6个)
antlr-2.7.6.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
slf4j-api-1.6.1.jar

导入解压完文件夹中 lib->jpa 中的jar包(1个)
hibernate-jpa-2.0-api-1.0.1.Final.jar

导入解压完文件夹中 hibernateX.jar(X是你的版本)(1个)
hibernate3.jar


当然你要知道每个 jar 包的作用,以后你就知道要导入哪个 jar 包。最后是每个 jar 的作用介绍。

3)导入 jdbc 的驱动,这里使用 mysql数据库

mysql-connector-java-5.0.8-bin.jar


4)编写 Hibernate 的配置文件(hibernate.cfg.xml)

从解压完的文件夹中 project -> etc 中复制 hibernate.cfg.xml 文件到 src 源文件下。并添加一下配置。


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/ssh</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- SQL 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 执行SQL语句时会显示SQL语句在控制台 -->
<property name="show_sql">true</property>

<!-- 映射文件到ddl的生成策略 -->
<property name="hbm2ddl.auto">update</property>

</session-factory>

</hibernate-configuration>


现在环境已经配好了,来试下吧。

a.新建一个class :User.java

public class User implements Serializable{
private Long id;
private String name;
private Double account;
private Date birthday;

public User() {
super();
}

public User(Long id, String name, Double account, Date birthday) {
super();
this.id = id;
this.name = name;
this.account = account;
this.birthday = birthday;
}

public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getAccount() {
return account;
}
public void setAccount(Double account) {
this.account = account;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}

@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", account=" + account
+ ", birthday=" + birthday + "]";
}

}


b.配置 bean 类的映射文件

在src中新建一个xml文件:user.hbm.xml (名字可以随便取,但后缀一定要为 .hbm.xml ) ,并添加以下配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- package表示以下 class 属于哪个包 -->
<hibernate-mapping package="com.briup.day04.basic">
<!--  name表示需要映射成表的类的类名,table 表示映射到数据库中的表名-->
<class name="User" table="tbl_user">
<!--   name 表示在类中的属性名, column 表示映射到数据库中的字段名,下面 property 中的也是一样。默认映射的字段名和属性名相同-->
<id name="id" column="id">
<generator class="increment"/>
</id>
<property name="name"/>
<property name="account"/>
<property name="birthday"/>
</class>

</hibernate-mapping>


注意这个头文件是要看你自己的 Hibernate 的版本,具体参照相应版本的 dtd 文件。

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">


c.在配置文件中添加配置(hibernate.cfg.xml)

<!-- resource 表示映射文件路径。注意是用 / 分隔开-->
<mapping resource="com/briup/day04/basic/user.hbm.xml" />

这个如果没配置或者配置错误将会出现以下错误:


org.hibernate.MappingException: Unknown entity: com.briup.day04.basic.User


d.测试

//1.创建配置对象
Configuration config = new Configuration();
//2.读取配置文件
config.configure();
//3.根据配置文件信息创建一级缓存,SessionFactory
/**
* Connection
* 映射文件     映射对象
* HttpSession    用户与服务器之间的会话
* Session          代码与数据库之间的会话
*/
//4.创建会话工厂对象,打开会话
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
//5.开启事务
Transaction tran = session.beginTransaction();
session.save(new User(null, "张三", 1200D, new Date(2016, 3, 5)));
//6.提交事务
tran.commit();
//7.session关闭
session.close();


结果:



这就算对Hibernate的初体验吧。

Hibernate一共包括了23个jar包,令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用,便于你在应用中根据自己的需要进行取舍。

  下载Hibernate,例如2.0.3稳定版本,解压缩,可以看到一个hibernate2.jar和lib目录下有22个jar包:

  hibernate2.jar:

  Hibernate的库,没有什么可说的,必须使用的jar包

  cglib-asm.jar:

  CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库,必须使用的jar包

  dom4j.jar:

  dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j,直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包,Hibernate用它来读写配置文件。

  odmg.jar:

  ODMG是一个ORM的规范,Hibernate实现了ODMG规范,这是一个核心的库,必须使用的jar包。

  commons-collections.jar:

  Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包。

  commons-beanutils.jar:

  Apache Commons包中的一个,包含了一些Bean工具类类。必须使用的jar包。

  commons-lang.jar:

  Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。

  commons-logging.jar:

  Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本身包含了一个Simple Logger,但是功能很弱。在运行的时候它会先在CLASSPATH找log4j,如果有,就使用log4j,如果没有,就找JDK1.4带的java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾,当初Apache极力游说Sun把log4j加入JDK1.4,然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了,因此拒绝了Apache的要求,使用自己的java.util.logging,这个包的功能比log4j差的很远,性能也一般。后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序,底层的Logger是可以切换的,你可以选择log4j,java.util.logging或者它自带的Simple Logger。不过我仍然强烈建议使用log4j,因为log4j性能很高,log输出信息时间几乎等于System.out,而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件,你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。

  使用Hibernate必须的jar包就是以上的这几个,剩下的都是可选的。

  ant.jar:

  Ant编译工具的jar包,用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码,那么就没有什么用,可选的jar包

  optional.jar:

  Ant的一个辅助包。

  c3p0.jar:

  C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池,就需要这个jar包。

  proxool.jar:

  也是一个连接池,同上。

  commons-pool.jar, commons-dbcp.jar:

  DBCP数据库连接池,Apache的Jakarta组织开发的,Tomcat4的连接池也是DBCP。

  实际上Hibernate自己也实现了一个非常非常简单的数据库连接池,加上上面3个,你实际上可以在Hibernate上选择4种不同的数据库连接池,选择哪一个看个人的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中使用Hibernate,一定要用App Server的连接池,不要用以上4种连接池,否则容器管理事务不起作用。

  connector.jar:

  JCA 规范,如果你在App Server上把Hibernate配置为Connector的话,就需要这个jar。不过实际上一般App Server肯定会带上这个包,所以实际上是多余的包。

  jaas.jar:

  JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。所以实际上是多余的包。

  jcs.jar:

  如果你准备在Hibernate中使用JCS的话,那么必须包括它,否则就不用。

  JDBC2_0-stdext.jar:

  JDBC2.0的扩展包,一般来说数据库连接池会用上它。不过App Server都会带上,所以也是多余的。

  jta.jar:

  JTA规范,当Hibernate使用JTA的时候需要,不过App Server都会带上,所以也是多余的。

  junit.jar:

  Junit包,当你运行Hibernate自带的测试代码的时候需要,否则就不用。

  xalan.jar, xerces.jar, xml-apis.jar:

  Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上,JDK1.4也包含了解析器,不过不是Xerces,是Crimson,效率比较差,不过Hibernate用XML只不过是读取配置文件,性能没什么紧要的,所以也是多余的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: