内容简介:Hibernate (开放源代码的对象关系映射框架): Hibernate是一个开放源代码的<!-- more -->
一、什么是Hibernate?
Hibernate (开放源代码的对象关系映射框架): Hibernate是一个开放源代码的 对象关系映射框架 ,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 全自动的ORM框架 ,hibernate可以 自动生成 SQL 语句,自动执行 ,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
<!-- more -->
二、为什么使用Hibernate?
2.1 Hibernate相对于传统JDBC的优点
- 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。
- hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
- hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
2.2 Hibernate相对于MyBatis的区别与联系
两者区别:
两者联系:
缓存方面
相同点:
Hibernate和Mybatis的二级缓存除了采用系统默认的缓存机制外,都可以通过实现你自己的缓存或为其他第三方缓 存方案,创建适配器来完全覆盖缓存行为。
不同点:
Hibernate的二级缓存配置在SessionFactory生成的配置文件中进行详细配置,然后再在具体的表-对象映射中配置是那种缓存。
MyBatis的二级缓存配置都是在每个具体的表-对象映射中进行详细配置,这样针对不同的表可以自定义不同的缓存机制。并且Mybatis可以在命名空间中共享相同的缓存配置和实例,通过Cache-ref来实现。
三、Hibernate的使用
准备好User实体类和数据库记录
User.java
public class User {
private Integer id;
private String userName;
private String passWord;
//Get、Set方法,此处省略。
}
mysql数据库:
3.1 添加pom依赖
Hibernate基础Maven依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- 添加hibernate的依赖 开始-->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.hibernate/hibernate -->
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.2.Final</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- <dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.1</version>
</dependency>
<!– Hibernate library dependecy end –>
<dependency>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
<version>1.1</version>
</dependency>-->
<!-- 添加hibernate的依赖 结束-->
<!-- mysql数据库的驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
</dependencies>
3.2 hibernate.cfg.xml配置文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--<property name="hibernate.bytecode.use_reflection_optimizer">false</property>-->
<!--指定数据库的驱动程序-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!--指定连接数据库的口令-->
<property name="hibernate.connection.password">admin</property>
<!--指定连接数据库的URL-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Hibernatetraning</property>
<!--指定连接数据库的用户名-->
<property name="hibernate.connection.username">root</property>
<!--数据库方言,用于指定使用的sql从属于哪个数据库-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!--如果为true,表示在程序运行时会在控制台输出SQL语句,有利于跟踪Hibernate的运行状态,默认为false。应用开发阶段设置为true,发布阶段应设置为false提高运行性能-->
<property name="show_sql">true</property>
<!-- <property name="hibernate.hbm2ddl.auto">update</property>-->
<mapping resource="mapper/User.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
3.2 User.hbm.xml映射文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 4.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.entity.User" table="tbl_user">
<!-- 在User里面 id 的set 和 get 方法里 也要设置为Integer类型的,不然会报错 -->
<id name="id" column="id" type="java.lang.Integer">
<generator class="assigned"/>
</id>
<property name="userName" column="username" type="java.lang.String" length="20" />
<property name="passWord" column="password" type="java.lang.String" length="20"/>
</class>
</hibernate-mapping>
测试
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
//测试session是否创建,以及是否可以从user映射的表里获取记录
Session session = sessionFactory.openSession();
//System.out.println("session=="+session);
User user = (User)session.get(User.class,1);
System.out.println(user);
//关闭会话工厂,项目自动停止。生产环境中千万不要写这句。
//sessionFactory.close();
控制台输出:User{id=1, userName='Jack', passWord='123'}
四、Hibernate基本概念
Hibernate是自动化程度更高ORM(Object-Relational Mapping)框架,不是面向SQL的持久层框架,以更加OO方式来编写数据读写代码。
4.1 对象与关系型数据库
注意:一定要清楚当前操作的东西,是属于对象层面的还是关系型数据库层面的,解决异常也是如此。
Hibernate中的对象有3中状态,瞬时对象(Transient Objects)、持久化对象(Persistent Objects)和离线对象(Detached Objects也叫做脱管对象)。
4.2 HibernateUtils.java 工具类
public class HibernateUtils {
private static SessionFactory sessionFactory = null;
static {
try {
Configuration configuration = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(configuration.getProperties())
.build();
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
}catch (HibernateException e){
System.out.println("SessionFactory初始化失败");
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory() throws Exception{
if (sessionFactory != null){
return sessionFactory;
}else {
throw new Exception("sessionFactory为空,请检查配置文件");
}
}
public static Session getSession(){
Session session = null;
try {
if (sessionFactory != null){
session = sessionFactory.openSession();
}
}catch (HibernateException e){
e.printStackTrace();
}
return session;
}
public static void closeSession(Session session){
try {
if (session != null && session.isOpen()){
session.close();
}
}catch (HibernateException e){
e.printStackTrace();
}
}
}
4.3 瞬时对象与持久化对象
测试代码:
Session session = HibernateUtils.getSession();
Transaction tx = session.beginTransaction();
User user1 = new User();
user1.setId(2);
user1.setUserName("Frank");
user1.setPassWord("111");
// 当前user1在数据库中没有记录进行关联,所有此时user1是瞬时对象。
// 将user1持久化
session.save(user1);
tx.commit();
User user2 = (User)session.get(User.class, 2);
System.out.println(user2);
// 当前user2在数据库有唯一一条记录对应,所有此时user2是持久化对象。
4.4 hibernate.hbm2ddl.auto
hibernate.hbm2ddl.auto属性值(从类自动生成数据库DDL操作)
<property name="hibernate.hbm2ddl.auto">update</property>
- create:如果设置为该值,则每次加载hibernate时(准确说应是创建SessionFactory时)都会删除以前创建的表而根据model重新生成表,即使前后的表没有任何变化,通常会造成数据库数据丢失,需谨慎使用这个取值。
- create-drop:与create差不多,所不同的是每次sessionFactory关闭时,就会删除所有表。
- update(最常用):这个取值比较常用,需要先建立数据库, 在第一次加载hibernate时会自动创建表,以后创建hibernate会自动根据model更新表结构,即使表结构改变了,以前的行不会被删除。
- validate:每次加载hibernate时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Transcending CSS
Andy Clarke、Molly E. Holzschlag / New Riders / November 15, 2006 / $49.99
As the Web evolves to incorporate new standards and the latest browsers offer new possibilities for creative design, the art of creating Web sites is also changing. Few Web designers are experienced p......一起来看看 《Transcending CSS》 这本书的介绍吧!