zoukankan      html  css  js  c++  java
  • 【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" />
    

    关注微信公众号compassblog,后台回复 “Hibernate系列一” 获取本项目源码

    原文链接:https://mp.weixin.qq.com/s?__biz=MzU5MTE0ODcwNQ==&mid=2247483975&idx=1&sn=24f28cdc3399c0d295a5ceb209383e10&chksm=fe322189c945a89f0c2723de0c7c1ef48cbd218e14ed2c8ea0a9c7c4da241737011bc7cf66d7#rd

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

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

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

    扫码关注微信公众号,了解更多

  • 相关阅读:
    面向对象基本原则
    策略模式
    简单工厂模式
    高内聚、低耦合
    UML在代码中的展现
    使用commons-csv简单读写CSV文件
    java反射机制
    SrpingDruid数据源加密数据库密码
    markdown学习经验
    Vue.js学习笔记
  • 原文地址:https://www.cnblogs.com/compassblog/p/8455986.html
Copyright © 2011-2022 走看看