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

Stella981
• 阅读 641

 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=desc

2、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.html

MySQL JDBC Driver下载地址
http://dev.mysql.com/downloads/connector/j/3.0.html  

三、所需jar包

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

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.jar                                                      cglib需要依赖的jar,ASM字节码库

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

四、代码展示

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

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

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

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

4、写代码

(1)建立实体类User.java

[java] view plain copy

  1. package com.liang.hibernate;  

  2. import java.util.Date;  

  3. public class User {  

  4.     private String id;  

  5.     private String name;  

  6.     private String password;  

  7.     private Date createTime;  

  8.     private Date expireTime;  

  9.     public String getId() {  

  10.         return id;  

  11.     }  

  12.     public void setId(String 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 String getPassword() {  

  22.         return password;  

  23.     }  

  24.     public void setPassword(String password) {  

  25.         this.password = password;  

  26.     }  

  27.     public Date getCreateTime() {  

  28.         return createTime;  

  29.     }  

  30.     public void setCreateTime(Date createTime) {  

  31.         this.createTime = createTime;  

  32.     }  

  33.     public Date getExpireTime() {  

  34.         return expireTime;  

  35.     }  

  36.     public void setExpireTime(Date expireTime) {  

  37.         this.expireTime = expireTime;  

  38.     }  

  39. }

  

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

[html] view plain copy

  1.   

  2.     "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  

  3.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  

  4.   

  5.       

  6.       

  7.           

  8.               

  9.               

  10.           

  11.           

  12.           

  13.           

  14.           

  15.       

  

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

[html] view plain copy

  1.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"  

  2.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  

  3.   

  4.       

  5.           

  6.         com.mysql.jdbc.Driver  

  7.           

  8.         jdbc:mysql://localhost:3306/hibernate_first  

  9.           

  10.         root  

  11.           

  12.         123456  

  13.           

  14.         org.hibernate.dialect.MySQLDialect  

  15.           

  16.           

  17.       

  

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

[java] view plain copy

  1. package com.liang.hibernate;  

  2. import org.hibernate.cfg.Configuration;  

  3. import org.hibernate.tool.hbm2ddl.SchemaExport;  

  4. /** 

  5.  * 将hbm生成ddl 

  6.  * @author liang 

  7.  * 

  8.  */  

  9. public class ExportDB{    

  10.     public static void main(String[]args){  

  11.         //默认读取hibernate.cfg.xml文件  

  12.         Configuration cfg = new Configuration().configure();  

  13.         ////生成并输出sql到文件(当前目录)和数据库  

  14.         SchemaExport export = new SchemaExport(cfg);  

  15.         export.create(true, true);  

  16.     }  

  17. }

  

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

控制台打印的SQL语句:

[sql] view plain copy

  1. drop table if exists User  
  2. create table User (id varchar(255) not null, name varchar(255), password varchar(255), createTime date, expireTime date, primary key (id))

  

数据库表结构:

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

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

[java] view plain copy

  1. package com.liang.hibernate;  

  2. import java.util.Date;  

  3. import org.hibernate.Session;  

  4. import org.hibernate.SessionFactory;  

  5. import org.hibernate.cfg.Configuration;  

  6. public class Client {  

  7.     public static void main(String[]args){  

  8.         //读取hibernate.cfg.xml文件  

  9.         Configuration cfg = new Configuration().configure();  

  10.         //建立SessionFactory  

  11.         SessionFactory factory =cfg.buildSessionFactory();  

  12.         //取得session  

  13.         Session session = null;  

  14.         try{  

  15.             //开启session  

  16.             session = factory.openSession();  

  17.             //开启事务  

  18.             session.beginTransaction();  

  19.             User user = new User();  

  20.             user.setName("jiuqiyuliang");  

  21.             user.setPassword("123456");  

  22.             user.setCreateTime(new Date());  

  23.             user.setExpireTime(new Date());  

  24.             //保存User对象  

  25.             session.save(user);  

  26.             //提交事务  

  27.             session.getTransaction().commit();  

  28.         }catch(Exception e){  

  29.             e.printStackTrace();  

  30.             //回滚事务  

  31.             session.getTransaction().rollback();  

  32.         }finally{  

  33.             if(session != null){  

  34.                 if(session.isOpen()){  

  35.                     //关闭session  

  36.                     session.close();  

  37.                 }  

  38.             }  

  39.         }  

  40.     }  

  41. }

  

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

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

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

内容如下:

[html] view plain copy

  1. ### direct log messages to stdout ###  

  2. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  

  3. log4j.appender.stdout.Target=System.out  

  4. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  

  5. log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  

  6. direct messages to file hibernate.log ###

  7. #log4j.appender.file=org.apache.log4j.FileAppender  

  8. #log4j.appender.file.File=hibernate.log  

  9. #log4j.appender.file.layout=org.apache.log4j.PatternLayout  

  10. #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n  

  11. set log levels - for more verbose logging change 'info' to 'debug' ###

  12. log4j.rootLogger=warn, stdout

  

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

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

 

五、最后

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这