zoukankan      html  css  js  c++  java
  • java学习:Hibernate入门

    相对微软的linq-to-sql或EF框架而言,"Hibernate对于eclipse的集成开发“ 新手并不容易掌握,下面是新手上路的步骤:

    一、准备工作:

    1、先下载eclipse (官网 http://eclipse.org/) 注:如本机已经安装了eclipse,可跳过

    2、下载Hibernate 最新版本(目前已经到了4.X版本) (官网 http://hibernate.org/ )

    3、根据你的db使用情况,下载对应的jdbc驱动包(本文使用的是oracle,本机安装完oracle client后就能找到)

    4、下载commons-logging.jar包(Hibernate内部记录日志用的是它)  (官网 http://commons.apache.org/logging/

    5、在数据库里先创建一个测试表TMP_EMP (虽然Hibernate推荐 先设计DomainModel->再持久化到db,但是实际开发中,往往是先有表结构,再开始写代码的,所以还是以大多数人习惯的方式为准)

    --先创建表
    
    -- Create table
    create table TMP_EMP
    (
      ID       NUMBER(10) not null,
      NAME     VARCHAR2(50),
      BIRTHDAY DATE,
      SEX      CHAR(1),
      SALARY   NUMBER(8,2)
    );
    -- Add comments to the columns 
    comment on column TMP_EMP.ID
      is '主键ID';
    comment on column TMP_EMP.NAME
      is '姓名';
    comment on column TMP_EMP.BIRTHDAY
      is '日期';
    comment on column TMP_EMP.SEX
      is '性别(F女,M男)';
    comment on column TMP_EMP.SALARY
      is ' 工资';
    -- Create/Recreate primary, unique and foreign key constraints 
    alter table TMP_EMP
      add constraint PK_TMP_EMP_ID primary key (ID);
    
    
    -- 创建Sequence序列
    create sequence SQ_TMP_EMP
    minvalue 1
    maxvalue 9999999999999999999999999
    start with 201
    increment by 1
    cache 200;
    

    6、安装Hibernate Tools 插件(理论上讲,这一步可以不用,但是没这个插件,就只能纯手动编写各种hibernate配置xml了)

    启用eclipse后,如果File->New 能找到Hibernate的相关选项,说明你的机器已经安装好了Hibernate Tools,可跳过本步骤

    否则,Help->Eclipse Marketplace

    Find栏输入Hibernate,就能联网找到相关的下载地址:

    二、创建一个常规的java project,命名为HelloHibernate

    创建过程中,注意导入所需的jar包,这些jar包可分为三大类:Hibernate解压目录中lib\required下的jar包、jdbc数据库驱动包、common-logging.jar日志工具包

    三、创建Hibernate配置文件(hibernate.cfg.xml)

    如果之前没有配置过其它db连接,可以点击Get Values from Connection,创建一个连接

    设置相关的参数,如果没问题的话,可以点击Test Connection测试下参数是否正常

    把这个连接,命名myConn后保存,这时再点击"Get Values from Connection",在弹出的对话框里,就能看到刚才创建的连接myConn

    其实这一系列操作,无非就是为了让ide帮我们生成下面这份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.connection.driver_class">oracle.jdbc.OracleDriver</property>
            <property name="hibernate.connection.password">密码</property>
            <property name="hibernate.connection.url">jdbc:oracle:thin:@//服务器IP:1521/orcltest</property>
            <property name="hibernate.connection.username">用户名</property>
            <property name="hibernate.default_schema">默认Schema</property>
            <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        </session-factory>
    </hibernate-configuration>
    

    里面记录了数据库连接的一些关键信息,所以hibernate运行时,就能根据这些信息,知道如何去连接db,以及如何生成sql.

    弄好这一步后,还可以在Hibernate Configurations面板里验证一下db连接是否正常,参考下图:Window->Show View->Other  

     

    输入hiber,应该就能自动过滤出想要的记录,选中Hibernate Configurations

    然后在eclipse里,就能找到这个面板,展开Database,如果一切顺利,应该能自动列出相应的表名

    四、创建反向工程配置文件(hibernate.reveng.xml),自动根据表结构,生成实体类

    ORM中:通常一个表对应的就是一个类,如果所有类都要手动编写代码,要累死人的,幸好hibernate tools提供了"根据db表结构反向生成实体类"的功能

    参考下图,创建一个 Hibernate Reverse Engineering File

    参考下图,点击Refresh,先把所有表列出来,这里出于演示,我们只把测试表TMP_EMP包含进来(即只处理这一张表)

    完成之后,可以看到还有其它很多选择,点击"Tables & Columns"

    把TMP_EMP给Add进来

    类似的,这些图形化的操作,其实就是要生成一段xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >
    
    <hibernate-reverse-engineering>
    	<table-filter match-name="TMP_EMP" />
    	<table name="TMP_EMP">
    		<column name="ID"></column>
    		<column name="NAME"></column>
    		<column name="BIRTHDAY"></column>
    		<column name="SEX"></column>
    		<column name="SALARY"></column>
    	</table>
    </hibernate-reverse-engineering>
    

    该xml的内容,相当于db表结构的元数据,有了它,hibernate就能知道:每张表(及表里的每个字段)如何生成java中的类(及类的成员)

    下面就让这些配置run起来,参考下图:(这个很坑,貌似在菜单里找不到,只能在工具栏里点击,而且还隐藏一个下拉菜单里)

    注:如果工具栏里没有显示这个按钮,可以 window -> Customize Perspective,切换到Command Groups Availablity标签页,把Hibernate Code Generation给勾选上

    这时,会弹出Hibernate的代码生成配置界面,比较重要的是:代码生成的输出目录(output directory),以及选择刚才创建的 reveng.xml(不选这个,hibernate就不知道要生成哪些表,以及生成的规则)

    在Exporters面板里,通常我们只需要生成Domain Code(即:实体类),勾中

    有时,生成java类后,eclipse不会自动刷新文件结构,建议下面这个也勾上

    最后点击Run,顺利的话,就能看到新生成的java类

    五、生成hibernate映射配置文件

    刚才创建的反向工程配置文件,在运行时其实没多大作用,它只是用来告诉hiernate如何根据表结构生成java实体类,对于已经存在的java类(比如纯手写的),运行时,hibernate如何知道它对应于db中哪张表呢?答案还是配置文件,参考下图,创建Hibernate XML Mapping file(即hbm文件)

    选择实体类所对应的包(或某个具体的类)

    一路Next,直到完成,这样我们就得到了文件:TmpEmp.hbm.xml

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated Dec 26, 2012 1:44:52 PM by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping>
        <class name="domain.TmpEmp" table="TMP_EMP">
            <id name="id" type="long">
                <column name="ID" />
                <generator class="assigned" />
            </id>
            <property name="name" type="java.lang.String">
                <column name="NAME" />
            </property>
            <property name="birthday" type="java.util.Date">
                <column name="BIRTHDAY" />
            </property>
            <property name="sex" type="java.lang.Character">
                <column name="SEX" />
            </property>
            <property name="salary" type="java.math.BigDecimal">
                <column name="SALARY" />
            </property>
        </class>
    </hibernate-mapping>
    

    这面就记录了每个java类与表之间的映射关系,最后一步配置相关的操作:

    生成hbm文件后,hibernate如何知道去读这个文件呢?我们总得给hibernate一些提示吧,双击hibernate.cfg.xml文件,找到Mappings节点,如下图:

    点击add,把刚才创建的TmpEmp.hbm.xml给添加进来

    保存之后,你会发现,其实无非就是在hibernate.cfg.xml里,自动加了一行:

      <mapping resource="domain/TmpEmp.hbm.xml"/>
    

    最后来玩一把:创建一个带main方法的类

    package app;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    import domain.TmpEmp;
    import java.util.List;
    
    public class Hello {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		Session ss = getSession();
    		List result = ss.createQuery("from TmpEmp").list();
    		for (TmpEmp t : (List<TmpEmp>) result) {
    			System.out.println("Id:" + t.getId() + ",Name:" + t.getName());
    		}
    		ss.close();
    	}
    
    	static SessionFactory sessionFactory;
    
    	static Session getSession() {
    		if (sessionFactory == null) {
    			sessionFactory = new Configuration().configure().buildSessionFactory();
    		}
    
    		return sessionFactory.openSession();
    	}
    
    }
    

    这里只演示了最简单的查询,顺利的话,Console面板里,就应该有结果了(如下图)

    注:Hibernate升级到4以后,原来的buildSessionFactory()方法在eclipse里会提示“过时”,最新4.3版hibernate下的正确写法为:

     1     private static SessionFactory factory;
     2 
     3     public static SessionFactory getFactory() {
     4         Configuration configuration = new Configuration().configure();
     5         StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
     6                 .applySettings(configuration.getProperties());
     7         StandardServiceRegistryImpl registry = (StandardServiceRegistryImpl) builder
     8                 .build();
     9         factory = configuration.buildSessionFactory(registry);
    10 
    11         return factory;
    12 
    13     }
    14 
    15     public static Session getSession() {
    16         return factory.openSession();
    17     }

    使用上述代码前,先import下面这几个package

    1 import org.hibernate.Session;
    2 import org.hibernate.SessionFactory;
    3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    4 import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
    5 import org.hibernate.cfg.Configuration;
  • 相关阅读:
    结对第一次—原型设计(文献摘要热词统计)
    第一次作业-准备篇
    软件工程实践总结
    团队作业第二次—项目选题报告
    软工实践|结对第二次—文献摘要热词统计
    软工实践|结对第一次—原型设计(文献摘要热词统计)
    第一次作业-准备篇
    个人作业——软件工程实践总结作业
    团队作业第二次——项目选题报告
    结对第二次—文献摘要热词统计
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/2834037.html
Copyright © 2011-2022 走看看