介绍Hibernate的经典内容:对象关系映射。主要介绍映射的基本概念,映射的分类,映射文件。

概念

ORM(Object Relational Mapping),即对象关系映射。它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。相信很多人跟小编一个毛病,看到概念就头疼,下面小编画了一张图加深理解。

这张图特别简单:原来,没有Hibernate时,我们需要通过JDBC+手动写SQL语句来操作数据库,现在,有了Hibernate,它将JDBC+SQL进行了高度封装,我们不需要再去和复杂SQL打交道,只要像操作对象一样操作数据库就可以了。

ORM的实现思想就是将数据库中表的数据映射成对象,Hibernate可以使我们采用对象化的思维操作关系型数据库。

映射文件

Hibernate在实现ORM功能的时候主要用到的文件有:

    1、 映射类(*.Java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。

 

    2、映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

 

    3、
hibernate核心配置文件(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包含与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。映射文件的地址信息也放在这里。

分类

上面的内容看上去挺多,其实特别少,基本映射很简单,我们主要学习关联关系映射,其他几种映射一般不会用,只需要了解即可,用的时候看一下相关资料会做就好。

基本映射

上篇博文我们已经实现了一个基本映射,是使用XML方式配置映射,如下所示:

  1. <span style="font-size:12px;"><?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.liang.hibernate.User" >
  7. <id name="id">
  8. <!-- 算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID -->
  9. <generator class="uuid"></generator>
  10. </id>
  11. <property name="name"></property>
  12. <property name="password"></property>
  13. <property name="createTime" type="date"></property>
  14. <property name="expireTime" type="date"></property>
  15. </class>
  16. </hibernate-mapping></span>

除了XML方式配置映射外,还可以通过给类文件添加注解的方式配置映射,在上篇博文的基础之上,我们稍加修改。

1、加入hibernate annotion支持包

*hibernate-annotations.jar

      *hibernate-commons-annotations.jar

      *ejb3-persistence.jar

如图所示:

2、建立实体类User,采用注解完成映射

  1. package com.liang.hibernate;
  2. import java.util.Date;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.GenerationType;
  7. import javax.persistence.Id;
  8. import javax.persistence.Temporal;
  9. import javax.persistence.TemporalType;
  10. @Entity //不写Table默认为user,@Table(name="t_user")
  11. public class User {
  12. @Id //主键
  13. @GeneratedValue(strategy=GenerationType.AUTO)//采用数据库自增方式生成主键
  14. //JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
  15. //TABLE:使用一个特定的数据库表格来保存主键。
  16. //SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
  17. //IDENTITY:主键由数据库自动生成(主要是自动增长型)
  18. //AUTO:主键由程序控制。
  19. private int id;
  20. private String name;
  21. private String password;
  22. @Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
  23. private Date createTime;
  24. @Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
  25. private Date expireTime;
  26. public int getId() {
  27. return id;
  28. }
  29. public void setId(int id) {
  30. this.id = id;
  31. }
  32. @Column(name="name",unique=true,nullable=false) //字段为name,不允许为空,用户名唯一
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. public String getPassword() {
  40. return password;
  41. }
  42. public void setPassword(String password) {
  43. this.password = password;
  44. }
  45. public Date getCreateTime() {
  46. return createTime;
  47. }
  48. public void setCreateTime(Date createTime) {
  49. this.createTime = createTime;
  50. }
  51. public Date getExpireTime() {
  52. return expireTime;
  53. }
  54. public void setExpireTime(Date expireTime) {
  55. this.expireTime = expireTime;
  56. }
  57. }

注:由于主键改成了自增长,所以数据类型修改成了int类型

3、提供hibernate.cfg.xml文件,将实体类User加入到hibernate.cfg.xml配置文件中,完成基本配置

  1. <span style="font-size:12px;"><!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <!-- 驱动 -->
  7. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <!-- 数据库URL -->
  9. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
  10. <!-- 数据库用户名 -->
  11. <property name="hibernate.connection.username">root</property>
  12. <!-- 数据库密码 -->
  13. <property name="hibernate.connection.password">123456</property>
  14. <!-- mysql的方言 -->
  15. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <!-- 映射文件 -->
  17. <!--  <mapping resource="com/liang/hibernate/User.hbm.xml"/>  -->
  18. <!-- 由原来的映射文件,改成实体类 -->
  19. <mapping class="com.liang.hibernate.User"/>
  20. </session-factory>
  21. </hibernate-configuration></span>

4、编写工具类ExportDB.java,注解生成ddl,必须采用AnnotationConfiguration类

  1. <span style="font-size:12px;">package com.liang.hibernate;
  2. import org.hibernate.cfg.AnnotationConfiguration;
  3. import org.hibernate.cfg.Configuration;
  4. import org.hibernate.tool.hbm2ddl.SchemaExport;
  5. /**
  6. * 将hbm生成ddl
  7. * @author liang
  8. *
  9. */
  10. public class ExportDB{
  11. public static void main(String[]args){
  12. //默认读取hibernate.cfg.xml文件
  13. Configuration cfg = new AnnotationConfiguration().configure();
  14. SchemaExport export = new SchemaExport(cfg);
  15. export.create(true, true);
  16. }
  17. }</span>

数据库生成表如图所示:

5、建立客户端类Client,添加用户数据到MySQL

  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.AnnotationConfiguration;
  6. import org.hibernate.cfg.Configuration;
  7. public class Client {
  8. public static void main(String[]args){
  9. //读取hibernate.cfg.xml文件
  10. Configuration cfg = new AnnotationConfiguration().configure();
  11. //建立SessionFactory
  12. SessionFactory factory =cfg.buildSessionFactory();
  13. //取得session
  14. Session session = null;
  15. try{
  16. //开启session
  17. session = factory.openSession();
  18. //开启事务
  19. session.beginTransaction();
  20. User user = new User();
  21. user.setName("jiuqiyuliang");
  22. user.setPassword("123456");
  23. user.setCreateTime(new Date());
  24. user.setExpireTime(new Date());
  25. //保存User对象
  26. session.save(user);
  27. //提交事务
  28. session.getTransaction().commit();
  29. }catch(Exception e){
  30. e.printStackTrace();
  31. //回滚事务
  32. session.getTransaction().rollback();
  33. }finally{
  34. if(session != null){
  35. if(session.isOpen()){
  36. //关闭session
  37. session.close();
  38. }
  39. }
  40. }
  41. }
  42. }

运行之后,数据库表生成的数据,如下图所示:

转:http://blog.csdn.net/jiuqiyuliang/article/details/40153905

(Hibernate进阶)Hibernate基本映射(三)的更多相关文章

  1. Hibernate学习2--对象的三种状态以及映射关系的简单配置

    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...

  2. Hibernate初探之单表映射——第二章:Hibernate进阶

    第二章:Hibernate进阶 1.hibernate.cfg.xml常用配置 2.session 简介 3.transaction简介 4.session详解 5.对象关系映射常用配置 1.hibe ...

  3. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  4. (Hibernate进阶)Hibernate系列——总结篇(九)

    这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...

  5. (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)

    hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...

  6. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  7. hibernate之单表映射

    目录 第一章 Hibernate初识 1-1 课程介绍 1-2 什么是ORM 1-3 Hibnerate简介 1-4 开发前的准备 1-5 编写第一个Hibernate例子 1-6 创建hiberna ...

  8. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  9. (Hibernate进阶)Hibernate基本原理(一)

    在开始学hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低? 如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎 ...

随机推荐

  1. centos x86_64环境下 下载chrome

    由于Cent OS内核版本过低,无法安装Chrome浏览器2.替代方案:可以使用Chromium浏览器 1.切换到root: su - 或者 sudo -i 2.下载新的软件源定义: cd /etc/ ...

  2. Python检测IP合法 是否为公网IP

    判断IP 格式是否正确 def check_value(self, ipaddr): '''检查IP是否合法 :param ipaddr: string :return True ''' addr=i ...

  3. jsonp案例

    <button id="btn">click</button><script type="text/javascript"> ...

  4. python 调用浏览器方法

    每天都要登陆某网站,刷积分.为了节省时间,用了下python中的webbrowser模块.新建.py 文件 #!/usr/bin/python import webbrowser webbrowser ...

  5. Extnet Direct 提交后台事件文件下载设置

    App.direct.MasterData.Export(App.tfSearch.getValue(), {                    isUpload: true            ...

  6. (转)Three challenges you’re going to face when building a chatbot

        转自:https://blog.infermedica.com/three-challenges-youre-going-to-face-when-building-a-chatbot/   ...

  7. ABBYY FineReader 12对系统有哪些要求

    ABBYY FineReader是市场领先的ocr文字识别软件,可快速方便地将扫描的文档.PDF文档和图像文件(包括数码照片)转化为可编辑.可搜索的格式.每个软件都有其安装运行的系统要求,ABBYY ...

  8. Request.UrlReferrer

    1:Request.UrlReferrer可以获取客户端上次请求的url,这样就可以实现类似“上一页”的功能等 2:刷新当前页面,不会改变Request.UrlReferrer的值 3:如果有A,B两 ...

  9. java编译正常javac出错不是内部或外部命令

    javac不是内部或外部命令 安装jdk版本jdk-8u111-windows-x64(jdk1.8.0_111) 配置环境: JAVA_HOME D:\xiazai\Java\jdk1.8.0_11 ...

  10. Turn off Debug Logging in Quartz .Net

    Quartz.net uses Common.Logging, so something like this in your App.config/Web.config: <configSect ...