专栏首页IT 指南者专栏【SSH框架】之Hibernate系列(一)

【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系列一” 获取本项目源码

您可能还喜欢:

本文分享自微信公众号 - compassblog(gh_7303ea249902)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【SSH框架】系列之 Spring 整合 Hibernate

    微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、SSH 三大框架整合原理 ? Spring 与 St...

    compassblog
  • 【SSH框架】之Spring系列(一)

    微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系! 1、前言 前面更新过几篇关于 Struts2 框架和 H...

    compassblog
  • Java 数据结构与算法系列之冒泡排序

    相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 ...

    compassblog
  • Hibernate之开门见山

    1:SSH框架:   Struts2:基于mvc模式的应用层框架模式(Servlet层)   Hibernate:基于持久层的框架(数据访问层)   Sprin...

    别先生
  • Hibernate框架的配置文件

    Hiernate是用来实现连接数据库、操作数据库记录的框架,因此Hibbernate框架首先需要配置连接数据库的信息。Hibernate框架使用连接池(Conn...

    无邪Z
  • Hibernate【与Spring整合】

    前言 前面已经学习了如何使用Spring与Struts2进行整合,本博文主要讲解如何使用Spring对Hibernate进行整合 Spring和Hibernat...

    Java3y
  • hibernate进阶操作

    配置hibernate.cfg.xml配置文件 1.连接数据库 2.数据库方言 3.控制台是否显示sql语句 4.给控制台sql语句添加格式

    微醺
  • web基础之hibernate(一篇)

                                                                   hibernate的一些基本的认识...

    Gxjun
  • hibernate基本使用

    hibernate框架应用在web三层架构的DAO层,是对JDBC的一种轻量级的封装,对javaBeans和数据库表进行映射,就不用再自己编写sql语句去获取对...

    木瓜煲鸡脚
  • Hibernate第一个程序

    爱撒谎的男孩

扫码关注云+社区

领取腾讯云代金券