Hibernate原理引见及简单实例入门体验

Hibernate原理介绍及简单实例入门体验

面向对象开发中的问题:模型不匹配(阻抗不匹配)
    Java面向对象语言,对象模型,其主要概念有:继承、关联、多态等,数据库是关系模型,其主要概念有:表、主键、外键等。

 

 

解决办法

  1. 使用JDBC手工转换。
  2. 使用ORM(Object Relation Mapping对象关系映射)框架来解决,主流的ORM框架有Hibernate 、TopLink. OJB 。

JDBC手工转换方法代码示例:

Java代码 Hibernate原理引见及简单实例入门体验
  1. public void saveUser(User user) {   
  2. Connection conn = null;   
  3. PreparedStatement ps = null;   
  4. ResultSet rs = null;   
  5. try {   
  6. conn =JdbcUtils.getConnection();   
  7. String sql = "insert into user(name, age,birth_day, account) values(?,?,?,?)";   
  8. ps = conn.prepareStatement(sql);   
  9. ps.setString( 1, user.getName());   //利用对象进行手工转换。   
  10. ps.setLong(2, user.getAge());    
  11. ps.setTimestamp(3new Timestamp(user.getBirthDay().getTime()));      
  12. ps.setLong( 4, user.getAccount());   
  13. pS.executeUpdate();   
  14. rs = ps.getGeneratedKeys();   
  15. while (rs.next()) {   
  16. user.setId(rs.getInt(l));   
  17. }   
  18. catch (SQLException e) {   
  19. }   
  20. }   
  21.       

安装配置:

    下载地址http://www.hibernate.org,本教程使用3.2.5 。
    将下载目录中/hibernate3.jar和/lib下的hibernate运行时必须的包加入classpath中:
    antlr.jar, cglib.jar, asm.jar, commons-collections.jar, commons-logging.jar, jta.jar, dom4j.jar

连接的是mysql数据库,所以还需要mysql的jdbc驱动,mysql-connector-java-5.0.4-bin.jar。

 

Hibernate目录结构及说明:


Hibernate原理引见及简单实例入门体验
 

hibernate的一个简单的例子:

一、在Eclipse里新建一个工程,导入上文所说的开发hibernate所需要的jar包。

 

二、写一个简单实体

User.java

Java代码 Hibernate原理引见及简单实例入门体验
  1.     package com.hlb.hiberante.domain;   
  2.   
  3. import java.util.Date;   
  4.   
  5. public class User {   
  6.     private int id;   
  7.     private String name;   
  8.     private Date birthday;   
  9.     public int getId() {   
  10.         return id;   
  11.     }   
  12.     public void setId(int id) {   
  13.         this.id = id;   
  14.     }   
  15.     public String getName() {   
  16.         return name;   
  17.     }   
  18.     public void setName(String name) {   
  19.         this.name = name;   
  20.     }   
  21.     public Date getBirthday() {   
  22.         return birthday;   
  23.     }   
  24.     public void setBirthday(Date birthday) {   
  25.         this.birthday = birthday;   
  26.     }   
  27.        
  28. }   
  29.   
  30.       

三、为这个实体写映射文件(映射文件配置这个实体和数据库的映射关系)

    这个映射文件比较复杂,可以在hibernate-3.2\eg\org\hibernate\auction目录下找到模板文件User.hbm.xml修改。映射文件的后缀不是必须为hbm.xml,但是按照hibernate的规范最好把后缀写成这样,别人一看就知道是hibernate的映射文件了。

 

User.hbm.xml映射文件:

Xml代码 Hibernate原理引见及简单实例入门体验
  1.    <?xml version="1.0"?>  
  2.   
  3. <hibernate-mapping package="com.mzhj.hibernate.domain"><!--需要配置映射关系的那个实体所在的包,即User.java所在的包-->  
  4.   
  5. <classname="User"><!-- 配置User类与数据库表的映射关系 -->  
  6.        
  7.     <id name="id">  
  8.         <generator class=native /> <!--主键产生策略,有五种方式  -->    
  9.     </id>  
  10. <property name="name"></property>  
  11. <property name="birthday"></property>  
  12. </class>  
  13. </hibernate-mapping>  
  14.           

三、为Hibernate写配置文件(配置连接的数据库的信息、映射文件位置等信息),配置文件名必须为hibernate.cfg.xml,并且必须放在类的根路径下

    配置文件比较复杂,在目录hibernate-3.2\etc下拷贝模板hibernate.cfg.xml修改,hiberante有两种格式的配置文件:.properties和.xml,xml文件的可读性和可维护性都好于前者,一般使用xml的配置文件。

    hibernate最终是通过操作jdbc来连接数据库的,因此jdbc驱动等信息也需要在hibernate配置文件中配置。

    hibernate.cfg.xml中的配置信息比较多,配置选项在hibernate-3.2\etc文件夹下的hibernate.properties文件中都可以找到,配置连接MySql的配置文件,定位到hibernate.properties的49行## MySQL位置,下面的信息就是连接mysql数据库的配置信息,前半部分是属性名,后半部分是属性值。定位到361行,找到## auto schema export,配置数据库建表属性。

 

hibernate.cfg.xml代码:

Xml代码 Hibernate原理引见及简单实例入门体验
  1.        
  2.   
  3. <hibernate-configuration>  
  4.     <session-factory>  
  5.         <!-- jdbc驱动配置,hibernate底层是通过jdbc来保存数据的,所以jdbc驱动是必须的。 -->  
  6.         <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>  
  7.         
  8.          <!-- 数据库url配置,三个///表示是本地主机的3306端口,也可以不简写jdbc:mysql://localhost:3306/test -->  
  9.         <property name="hibernate.connection.url">jdbc:mysql:///test</property>  
  10.         
  11.         <property name="hibernate.connection.username">root</property>  
  12.         <property name="hibernate.connection.password">root</property>  
  13.        <!-- 设置一下Hibernate的方言,这个设置时告诉hibernate连接的是什么数据库,这个是hibernate跨平台的基础,hibernate根据不同的数据库,把保存对象的语句转化成与具体数据库对应的jdbc语句。 -->  
  14.         <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>  
  15.        
  16.        <!-- 配置建表属性,update为如果不一致,会更新一下表结构 ,没有会建表,或create 则每次运行时,都重新建表. -->  
  17.         <property name="hibernate.hbm2ddl.auto">update</property>  
  18.         <!-- 告诉Hibernate,实体的映射文件在什么地方,hibernate根据映射文件建立起实体与数据库的关系(建表,验证表等),hibernate初始化的时候会自动找类根路径下hibernate.cfg.xml文件,但不会去自动找实体的映射文件,所以要在此配置映射文件位置,否则hibernate将不认识这个实体。 -->  
  19.         <mapping resource="com/mzhj/hibernate/domain/User.hbm.xml" />  
  20.        
  21.            
  22.     </session-factory>  
  23. </hibernate-configuration>  
  24.          

    hibernate.hbm2ddl.auto=value,value有四个选项值:

  1. create-drop     程序启动,hibernate初始化的时候,先删掉表,然后创建表;程序运行结束后把所有表删掉。
  2. create      程序启动,在创建表前会把表删掉。当虚拟机退出的时候(在hibernate退出的时候),它不会删表        (和上一种通常在测试环境下使用)。
  3. update     如果不一致,会更新一下表结构。如果没有表会新建表。
  4. validate     会校验映射文件跟表结构是否对应,如果不对应,不会update,而是报错。(这种方式更安全一些)。

四、写测试代码

Base.java

Java代码 Hibernate原理引见及简单实例入门体验
  1. package com.mzhj.hibernate;   
  2.   
  3. import java.util.Date;   
  4.   
  5. import org.hibernate.Session;   
  6. import org.hibernate.SessionFactory;   
  7. import org.hibernate.cfg.Configuration;   
  8.   
  9. import com.mzhj.hibernate.domain.User;   
  10.   
  11. public class Base {   
  12.     public static void main(String args[]){   
  13.         Configuration cfg=new Configuration();  //找到hibernate.cfg.xml文件并进行初始化。   
  14.         SessionFactory sf=cfg.configure().buildSessionFactory();    //通过初始化对象获得Session工厂。   
  15.         //Configuration对象必须先调用一下confgiure方法,否则会出现Hibernate Dialect must be explicitly set错误。   
  16.         Session session=sf.openSession(); //打开一个Session对象。   
  17.         User user=new User();      
  18.         user.setBirthday(new Date());   
  19.         session.beginTransaction(); //开启事务,否则不能保存成功,除非这个数据库用的引擎是不支持事务的引擎如:MyISAM引擎。   
  20.         session.save(user);   
  21.         session.getTransaction().commit();  //提交事务。   
  22.     }   
  23. }   
  24.