【SSH框架】之Hibernate系列(一)

微信公众号:compassblog

欢迎关注、转发,互相学习,共同进步!

有任何问题,请后台留言联系!

1、Hibernate框架概述

(1)、什么是Hibernate

Hibernate是一个开放源代码的 ORM 框架,是主流的Java持久层框架之一,它对 JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

(2)、Hibernate在三层架构中的位置

上篇文章所讲的Struts2框架取代的是三层架构中的web层,而Hibernate框架取代的则是dao层,具体描述如下图:

(3)、什么是ORM

ORM(Object Relational Mapping),即对象关系映射,就是利用描述对象和数据库表之间映射的元数据,自动把Java应用程序中的对象,持久化到关系型数据库的表中。通过操作Java对象,就可以完成对数据库表的操作。可以把 ORM 理解为关系型数据和对象的一个纽带,开发人员只需要关注纽带一端映射的对象即可。ORM 实现原理如下图:

(4)、Hibernate框架的优势与功能

  • Hlbernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。

  • Hlbernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO (DataAccess Object,数据访问对象)层编码工作。操作数据库的时候,可以以面向对象的方式来完成,不再需要书写SQL语句。

  • Hlbernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。

  • 可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。

2、搭建Hibernate框架,完成第一个应用实例

(1)、创建一个web项目,导入所需要的jar包,包括数据库驱动包,如下图所示:

(2)、创建数据库demo_project和表user,建表语句如下:

创建数据库demo_project语句:

create database demo_project;

常见表user语句:

CREATE TABLE `user` (
 `id` int(10) NOT NULL,
 `name` varchar(50) DEFAULT NULL,
 `age` int(3) DEFAULT NULL,
 `height` int(11) DEFAULT NULL,
 `weight` double(10,0) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(3)、创建实体User.java,具体代码如下:

User.java

package com.hibernate.demo;

public class User {
   //基本属性
   private int id;
   private String name;
   private int age;
   private int height;
   private int weight;

   //setter和getter方法
   public int getId() {
       return id;
   }
   public void setId(int id) {
       this.id = id;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
   public int getHeight() {
       return height;
   }
   public void setHeight(int height) {
       this.height = height;
   }
   public int getWeight() {
       return weight;
   }
   public void setWeight(int weight) {
       this.weight = weight;
   }

}

(4)、导入约束,在与实体同一个包下新建ORM配置文件User.hbm.xml,书写ORM元数据,具体配置代码如下:

User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  <!-- 配置表与实体对象的关系 -->
<hibernate-mapping package="com.hibernate.domain" >

   <class name="User" table="user" >
       <id name="id"  >
           <generator class="native"></generator>
       </id>
       <property name="name" column="name" ></property>
       <property name="age" column="age" ></property>
       <property name="height" column="height" ></property>
       <property name="weight" column="weight" ></property>    
   </class>

</hibernate-mapping>

(5)、在src下新建hibernate.cfg.xml主配置文件,具体配置代码如下:

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
   <session-factory>

        <!-- 数据库驱动 -->
       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库url -->
       <property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
        <!-- 数据库连接用户名 -->
       <property name="hibernate.connection.username">root</property>
        <!-- 数据库连接密码 -->
       <property name="hibernate.connection.password">root</property>
       <!-- 数据库方言-->
       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

       <property name="hibernate.show_sql">true</property>

       <property name="hibernate.format_sql">true</property>

       <property name="hibernate.hbm2ddl.auto">update</property>
       <!-- 引入orm元数据  -->
       <mapping resource="com/hibernate/domain/User.hbm.xml" />

   </session-factory>
</hibernate-configuration>

(6)、新建测试类TestDemo.java,书写测试代码,具体如下:

TestDemo.java

package com.hibernate.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import com.hibernate.domain.User;

//测试Hibernate框架
public class TestDemo {

   @Test
   //插入信息
   public void test(){
       Configuration conf = new Configuration().configure();

       SessionFactory sessionFactory = conf.buildSessionFactory();

       Session session = sessionFactory.openSession();

       Transaction tx = session.beginTransaction();

       //保存信息
       User u = new User();
       u.setName("孔乙己");
       u.setAge(22);
       u.setHeight(172);
       u.setWeight(120);

       session.save(u);

       tx.commit();
       session.close();
       sessionFactory.close();
   }
}

(7)、使用JUnit测试运行,信息插入成功,具体结果如下图:

本项目运行环境:jdk1.7、Tomcat7.0

3、Hibernate配置文件详解

(1)、orm元数据配置详解:

package属性

   <!-- package属性:填写一个包名,在元素内部凡是需要书写完整类名的属性,就可以直接写简答类名 -->
  <hibernate-mapping package="com.hibernate.domain" >

class属性

<!-- 
       class元素: 配置实体与表的对应关系的
           name: 完整类名
           table:数据库表名
    -->
   <class name="User" table="user" >

id属性

<!-- id元素:配置主键映射的属性
               name: 填写主键对应属性名
               column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
               type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                       每个类型有三种填法: java类型|hibernate类型|数据库类型
               not-null(可选):配置该属性(列)是否不能为空. 默认值:false
               length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
        -->
       <id name="id"  >
           <!-- generator:主键生成策略 -->
           <generator class="native"></generator>
       </id>

property属性

<!-- property元素:除id之外的普通属性映射
               name: 填写属性名
               column(可选): 填写列名
               type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                       每个类型有三种填法: java类型|hibernate类型|数据库类型
               not-null(可选):配置该属性(列)是否不能为空. 默认值:false
               length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
        -->
       <property name="name" column="name" >
           <!--  <column name="cust_name" sql-type="varchar" ></column> -->
       </property>
       <property name="age" column="age" ></property>
       <property name="height" column="height" ></property>
       <property name="weight" column="weight" ></property>

(2)、Hibernate主配置文件详解:

必选配置属性

<!-- 数据库驱动 -->
       <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 数据库url -->
       <property name="hibernate.connection.url">jdbc:mysql:///demo_project</property>
        <!-- 数据库连接用户名 -->
       <property name="hibernate.connection.username">root</property>
        <!-- 数据库连接密码 -->
       <property name="hibernate.connection.password">root</property>
       <!-- 数据库方言-->
       <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

可选配置属性

<!-- #hibernate.show_sql true 
            #hibernate.format_sql true
       -->
       <!-- 将hibernate生成的sql语句打印到控制台 -->
       <property name="hibernate.show_sql">true</property>
       <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
       <property name="hibernate.format_sql">true</property>
       <!--
       ## auto schema export  自动导出表结构,自动建表
       #hibernate.hbm2ddl.auto create      自动建表,每次框架运行都会创建新的表,以前表将会被覆盖,表数据会丢失。(开发环境中测试使用)
       #hibernate.hbm2ddl.auto create-drop 自动建表,每次框架运行结束都会将所有表删除。(开发环境中测试使用)
       #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表,如果已经存在不会再生成;如果表有变动,自动更新表(不会删除任何数据)
       #hibernate.hbm2ddl.auto validate    校验。不自动生成表,每次启动会校验数据库中表是否正确,校验失败。
        -->
       <property name="hibernate.hbm2ddl.auto">update</property>

引入orm元数据配置属性

<!-- 引入orm元数据
           路径书写: 填写src下的路径
-->
<mapping resource="com/hibernate/domain/User.hbm.xml" />


后台回复 “Hibernate系列一” 获取本项目源码


您可能还喜欢:

  • 原文中此处为链接,暂不支持采集

  • 原文中此处为链接,暂不支持采集

  • 原文中此处为链接,暂不支持采集

  • 原文中此处为链接,暂不支持采集

  • 原文中此处为链接,暂不支持采集



  • 本系列后期仍会持续更新,欢迎关注!


    如果你认为这篇文章有用,欢迎转发分享给你的好友!

    本号文章可以任意转载,转载请注明出处!


    点击 “阅读原文”,了解更多的我!


    每一步成长,都想记录与分享


    长按关注,了解更多

    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 211,376评论 6 491
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 90,126评论 2 385
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 156,966评论 0 347
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 56,432评论 1 283
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 65,519评论 6 385
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 49,792评论 1 290
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 38,933评论 3 406
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 37,701评论 0 266
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 44,143评论 1 303
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 36,488评论 2 327
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 38,626评论 1 340
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 34,292评论 4 329
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 39,896评论 3 313
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 30,742评论 0 21
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 31,977评论 1 265
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 46,324评论 2 360
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 43,494评论 2 348

    推荐阅读更多精彩内容

    • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
      子非鱼_t_阅读 31,598评论 18 399
    • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
      passiontim阅读 171,760评论 25 707
    • 明朝的“庚戌之变”是怎么回事? 明嘉靖二十九年(1550),鞑靼军俺答率军入古北口,兵临城下。首辅严嵩,不准诸将出...
      熊啊熊look阅读 375评论 0 0
    • 矜持了半辈子,感情 已随己,颠沛流离。 毅然决然的把身心交给大藏经典—— 菩堤路上,修炼着自己。 唯怕双亲,再也触...
      娑婆如斯阅读 493评论 12 38
    • 我们一生可以活很多辈子的 这句话当然不是我说的,李笑来老师在他的众创书籍《新生——7年就是一辈子》前言部分,第一段...
      帅帅的厨男子阅读 531评论 0 0