Hibernate搭建开发环境+简单实例(二)

2018-01-12 11:09:56来源:oschina作者:architect刘源源人点击

分享

Hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的。这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和原理,到最后可能什么也学不会,从实践入手,熟能生巧,思想和原理自然而然领悟。

一、开发环境

Win8 + jdk1.7 + MyEclipse + Tomcat5.0 + MySQL


说明:其实Hibernate是非常独立的框架,根本不需要MyEclipse,Eclipse,Tomcat,Log4J等,他们只不过是能满足我们其他的需求,才把他们引进来的。

二、下载文件

你需要Java SDK、 Hibernate包、和JDBC Driver。1、Hibernate包下载地址: http://prdownloads.sourceforge.net/hibernate/?sort_by=date&sort=desc2、JDBC Driver根据你的数据库来定,一般database官网都有。Hibernate支持常用的数据库,比如 MySQL, Oracle等等。这两个数据库是现在比较常用的,都有JDBC Driver:Oracle JDBC Driver下载地址(下载前必须同意Oracle协议书) http://otn.oracle.com/software/htdocs/distlic.html?/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.htmlMySQL JDBC Driver下载地址 http://dev.mysql.com/downloads/connector/j/3.0.html


三、所需jar包


hibernate3.jar Hibernate的核心包


dom4j-1.6.1.jar dom4j读取xml文件包


mysql-connector-java-3.1.13-bin.jar MySQL的jdbc驱动包


Hibernate的作用:让我们以面向对象的方式或思维来考虑怎么向关系型数据库存取数据。它需要与相应的数据库打交道,所以需要相应的jdbc驱动。我们的database用的是MySQL,所以需要引入MySQL的jdbc驱动。


log4j-1.2.11.jar 记录日志框架


由于log4j的记录日志比jdk自带的记录日志功能更加美观,简单,易配置日志级别,便于调试,我们选择使用log4j。

必须要引入的jar:

commons-logging-1.0.4.jar抽象的日志记录框架


本身并没有实现真正的写日志能力(看包结构即可知道)而是结合其它的日志系统如Log4j或者java本身的java.util.logging作为日志输出组件,来实现日志记录的功能。


commons-collections-2.1.1jar 各种集合类和集合工具类的封装


cglib-2.1.3.jar 动态代理,Hibernate用它来实现PO字节码的动态生成


asm.jarcglib需要依赖的jar,ASM字节码库

注:作为初学者不提倡这种做法,只需要将hibernate所要依赖的第三方jar包都引入即可,否则做其他实例时会报NoClassDefFoundError的错误,解决方案:只需将对应jar引入即可。由于这是一个简单实例,仅仅需要引入这些jar。

四、代码展示

1、在IDE中创建java项目(比较简单不再演示)

2、创建source folder,命名为Hibernate3,在Hibernate下载文件中找到我们所需要的三个配置文件和所有jar包,拷贝所需jar文件,构建依赖包


3、提供hibernate.cfg.xml文件,完成基本配置

4、写代码

(1)建立实体类User.java

[java]view plaincopy

packagecom.liang.hibernate;importjava.util.Date;publicclassUser{
privateStringid;
privateStringname;
privateStringpassword;
privateDatecreateTime;
privateDateexpireTime;publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicDategetCreateTime(){
returncreateTime;
}
publicvoidsetCreateTime(DatecreateTime){
this.createTime=createTime;
}
publicDategetExpireTime(){
returnexpireTime;
}
publicvoidsetExpireTime(DateexpireTime){
this.expireTime=expireTime;
}}

(2)提供User.hbm.xml文件,完成实体类映射

[html]view plaincopy

<?xmlversion="1.0"?>
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">












(3)将User.hbm.xml文件加入到hibernate.cfg.xml文件中

[html]view plaincopy

"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">


com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/hibernate_first

root

123456

org.hibernate.dialect.MySQLDialect



(4)编写工具类ExportDB.java,将hbm生成ddl,也就是hbm2ddl

[java]view plaincopy

packagecom.liang.hibernate;importorg.hibernate.cfg.Configuration;
importorg.hibernate.tool.hbm2ddl.SchemaExport;/**
*将hbm生成ddl
*@authorliang
*
*/
publicclassExportDB{
publicstaticvoidmain(String[]args){
//默认读取hibernate.cfg.xml文件
Configurationcfg=newConfiguration().configure();
////生成并输出sql到文件(当前目录)和数据库
SchemaExportexport=newSchemaExport(cfg);
export.create(true,true);
}
}

测试之前,要提前建立数据库hibernate_first,测试如下:

控制台打印的SQL语句:

[sql]view plaincopy

droptableifexistsUser
createtableUser(idvarchar(255)notnull,namevarchar(255),passwordvarchar(255),createTimedate,expireTimedate,primarykey(id))

数据库表结构:


(5)建立客户端类Client,添加用户数据到mySQL

[java]view plaincopy

packagecom.liang.hibernate;importjava.util.Date;importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;publicclassClient{
publicstaticvoidmain(String[]args){
//读取hibernate.cfg.xml文件
Configurationcfg=newConfiguration().configure();
//建立SessionFactory
SessionFactoryfactory=cfg.buildSessionFactory();//取得session
Sessionsession=null;try{
//开启session
session=factory.openSession();
//开启事务
session.beginTransaction();Useruser=newUser();
user.setName("jiuqiyuliang");
user.setPassword("123456");
user.setCreateTime(newDate());
user.setExpireTime(newDate());
//保存User对象
session.save(user);//提交事务
session.getTransaction().commit();}catch(Exceptione){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session!=null){
if(session.isOpen()){
//关闭session
session.close();
}
}
}
}
}

右键debug运行,测试完成之后,我们查询一下测试结果:


5、为了在调试过程中能观察到Hibernate的日志输出,最好加入log4j.properties配置文件、在CLASSPATH中新建log4j.properties配置文件或将该配置文件拷贝到src下,便于程序调试。


内容如下:

[html]view plaincopy

###directlogmessagestostdout###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE}%5p%c{1}:%L-%m%n###directmessagestofilehibernate.log###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE}%5p%c{1}:%L-%m%n###setloglevels-formoreverboseloggingchange'info'to'debug'###log4j.rootLogger=warn,stdout

配置完成后,项目结构如下图所示:



五、最后

自己动手丰衣足食,实践出真理,纸上得来终觉浅,绝知此事要躬行。虽然这个实例非常简单,但是我们踏进了持久层框架的大门。

从上面的简单实例可以看到,我们只是使用Hibernate对User这一个实体进行了映射,比较简单,但是完全不符合实际。如何像关系型数据库一样表示多种关联关系,例如:一对一,一对多,多对多等等,我们还需要深入。下篇博文,我们介绍Hibernate的基本映射原理以及关联关系映射。

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台