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,但是实际开发中,往往是先有表结构,再开始写代码的,所以还是以大多数人习惯的方式为准)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
--先创建表 -- 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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<? 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
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<? 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<? 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方法的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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;
java学习:Hibernate入门的更多相关文章
- Java入门-浅析Java学习从入门到精通【转】
一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库 ...
- 真正的Java学习从入门到精通
http://www.it.com.cn/f/edu/059/6/169189.htm 一. 工具篇JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行 ...
- Java学习从入门到精通(2) [转载]
Java Learning Path(二).书籍篇 学习一门新的知识,不可能指望只看一本,或者两本书就能够完全掌握.需要有一个循序渐进的阅读过程.我推荐Oreilly出版的Java系列书籍. 在这里我 ...
- Java ORM Hibernate 入门笔记
一.下载 官网地址:http://hibernate.org/ Hibernate下有ORM(关系型数据库).OGM(NoSQL数据库).Search(对象全文检索).Validator的工具. OR ...
- Java学习从入门到精通(1) [转载]
Java Learning Path (一).工具篇 一. JDK (Java Development Kit) JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envi ...
- java学习-初级入门-面向对象⑥-类与对象-静态static
这次我们来学习静态(static) 知识点 1.静态方法只能调用静态变量 2.静态变量属于整个Class,会随着发生变化. 案例:定义一个自动增长的学生类. 题目要求: 定义一个学生类,除了姓名.性别 ...
- java学习-初级入门-面向对象⑤-类与对象-类与对象的定义和使用3
这次我们要做一个日期类Date类 主要目的是 1. 熟悉-->构造不同参数的函数 2.善于利用已有的函数!! 题目要求: Date类要求 可设定年月日 可转换为字符串,并可指定分隔符, ...
- java学习-初级入门-面向对象②-面向对象概述-面向对象程序设计
我们在 面向对象①中学习了,结构化程序设计. 今天我们一起学习面向对象程序设计. 学习面向对象程序设计就要了解,在面向对象中重要的知识点. 继承 . 多态 . 抽象 . 接口 我们会在接下 ...
- java学习-初级入门-面向对象①-面向对象概述-结构化程序设计
为了学习面向对象程序设计,今天我们先利用面向对象以前的知识,设计一个学生类. 要求进行结构化程序设计. 学生类: Student 要求:存储学生的基本信息(姓名.性别.学历层次和年级),实现学生信息的 ...
- java学习-初级入门-面向对象④-类与对象-类与对象的定义和使用2
我们继续学习类与对象,上一篇我们定义了 坐标类(Point), 这次我们在Point的基础上,创建一个圆类(Circle). 案例:创建一个圆类 题目要求: 计算圆的周长和面积:求判断两个圆的位置关 ...
随机推荐
- js 图片处理 Jcrop.js API
引入jquery.Jcrop.min.css和jquery.Jcrop.min.js 参数/接口说明 options 参数说明 名称 默认值 说明 allowSelect true 允许新选框 all ...
- 纪念逝去的岁月——C/C++二分查找
代码 #include <stdio.h> int binarySearch(int iList[], int iNum, int iX, int * pPos) { if(NULL == ...
- POI Word 模板 文字 图片 替换
实验环境:POI3.7+Word2007 Word模板: 替换后效果: 代码: 1.入口文件 public class Test { public static void main(String[] ...
- zepto的tap事件的点透问题的几种解决方案
你可能碰到过在页面上创建一个弹出层,弹出层有个关闭的按钮,你点了这个按钮关闭弹出层后,这个按钮正下方的内容也会执行点击事件(或打开链接).这个被定义为这是一个“点透”现象. 以前,我也听到过tap的点 ...
- 8.0/9.0 Email 设置
Email 设置一直都是Odoo的一个坑,巨坑. 先讲结论,发邮件可以用,收还是算了吧 1. 发邮件设置 发的设置相对简单,如果企业邮箱支持catcll all功能,基本不用改动可以直接用,否则需要安 ...
- 读《深入php面向对象、模式与实践》有感(一)
什么样的代码需要改进?书中给出了四个标准(我个人比较认可这四个标准,实际开发中也的确时常遇到): 一.代码重复 用书中的原话讲:“如果你在写代码的时候,总是感觉似曾相识,很可能你的代码已经重复了”. ...
- sql 数据库 初级 个人学习总结(一)
数据库个人总结(初级)1.增删改查 insert into 表名 values ('条件','条件2') delete from 表名 where 条件 update 表名 set=条件值 where ...
- 关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法
WPF中所有的集合类控件,子项都不能继承父级的DataContext,需要手动将绑定的数据源指向到父级控件才可以. <DataGridTemplateColumn Header="操作 ...
- 实验四 Android开发基础
实验四 Android开发基础 实验内容 1.安装Android Studio 2.运行安卓AVD模拟器 3.使用安卓运行出虚拟手机并显示HelloWorld以及自己的学号 (一)SDK的安装 (二) ...
- PHP如何通过SQL语句将数据写入MySQL数据库呢?
1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...