hibernate(1):Hibernate概念、入门案例

2019-10-31 16:04:16来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

hibernate(1):Hibernate概念、入门案例

1. Hibernate的概述

1.1 什么是Hibernate

  Hibernate框架是当今主流的Java持久层框架之一,由于它具有简单易学、灵活性强、扩展性强等特点,能够大大地简化程序的代码量,提高工作效率,因此受到广大开发人员的喜爱。
  Hibernate是一一个开放源代码的ORM (Object Relational Mapping, 对象关系映射)框架,它对JDBC进行了轻量级的对象封装,使得Java开发人员可以使用面向对象的编程思想来操作数据库。

 

 

Hibernate就是一个持久层的ORM的框架。
ORM:Object Relational Mapping对象关系映射。

1.2 为什么要学习Hibernate

  使用传统的JDBC开发应用系统时,如果是小型应用系统,并不觉得有什么麻烦,但是对于大型应用系统的开发,使用JDBC就会显得力不从心。例如对几十、几百张包含几十个字段的表进行插入操作时,编写的SQL语句不但很长,而且繁琐,容易出错;在读取数据时,需要写多条getXx语句从结果集中取出各个字段的信息,不但枯燥重复,并且工作量非常大。为了提高数据访问层的编程效率,Gavin King开发出了一个当今最流行的的ORM框架,它就是Hibernate框架。

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

 

 

与其它操作数据库的技术相比,Hibernate具有以下几点优势:

  1. Hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
  2. Hibernate 是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO (Data Access Object,数据访问对象)层编码工作。
  3. Hibernate的性能非常好,映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。
  4. 可扩展性强,由于源代码的开源以及API的开放,当本身功能不够用时,可以自行编码进行扩展。

1.3 下载Hibernate

https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/

 

 

Hibernate5.0.7版本下载后,解压完的目录结构如图所示。

 

 

 从图可以看出,hibernate5.0.7 的解压目录中包含一系列的子目录,这些子目录分别用于存放不同功能的文件,接下来针对这些子目录进行简单介绍,具体如下: 

  1. documentation文件夹:存放Hibernate的相关文档,包括参考文档的API文档。
  2. lib文件夹:存放Hibermnate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate5项目必须的JAR包。
  3. project文件夹:存放Hibermate各种相关的源代码。

在lib/required子目录中,包含的JAR包

 

 

2. 入门案例

2.1 创建项目

创建Dynamic Web Project,命名为hibernate_1。

 

 

2.2 引入Hibernate的开发包

将以下开发包导入项目的hibernate_1\WebContent\WEB-INF\lib目录下

  • 数据库驱动包

 

 

  •  Hibernate/lib/required/*.jar

 

 

  •  日志记录的包

 

 

2.3 创建数据库和表

create database hibernate_1;
use hibernate_1;

  CREATE TABLE cst_customer(
    cust_id BIGINT(32) NOT NULL auto_increment COMMENT '客户编号(主键)',
    cust_name VARCHAR(32) NOT NULL COMMENT '客户名称(公司名称)',
    cust_source VARCHAR(32) DEFAULT NULL COMMENT '客户信息来源',
    cust_industry VARCHAR(32) DEFAULT NULL COMMENT '客户所属行业',
    cust_level VARCHAR(32) DEFAULT NULL COMMENT '客户级别',
    cust_phone VARCHAR(64) DEFAULT NULL COMMENT '固定电话',
    cust_mobile VARCHAR(16) DEFAULT NULL COMMENT '移动电话',
    PRIMARY KEY(cust_id)
) ENGINE=INNODB auto_increment=94 DEFAULT CHARSET=utf8;

  持久化类是应用程序中的业务实体类,这里的持久化是指类的对象能够被持久化保存到数据库中。Hibernate使用普通Java对象(Plain Old Java Object),即POJO的编程模式来进行持久化。POJO类中包含的是与数据库表相对应的各个属性,这些属性通过getter和setter方法来访问,对外部隐藏了内部的实现细节。下面就来编写Customer持久化类。
  在项目src 目录下,创建cn.xhh.domain包,并在包中创建实体类Customer (对应数据库表cst_ customer),Customer 类包含与cst_customer数据表字段对应的属性,以及相应的getXxx()和setXxx()方法。.

package cn.itheima.domain;

public class Customer {
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkman;
    private String cust_phone;
    private String cust_mobile;
    public Long getCust_id() {
        return cust_id;
    }
    public void setCust_id(Long cust_id) {
        this.cust_id = cust_id;
    }
    public String getCust_name() {
        return cust_name;
    }
    public void setCust_name(String cust_name) {
        this.cust_name = cust_name;
    }
    public String getCust_source() {
        return cust_source;
    }
    public void setCust_source(String cust_source) {
        this.cust_source = cust_source;
    }
    public String getCust_industry() {
        return cust_industry;
    }
    public void setCust_industry(String cust_industry) {
        this.cust_industry = cust_industry;
    }
    public String getCust_level() {
        return cust_level;
    }
    public void setCust_level(String cust_level) {
        this.cust_level = cust_level;
    }
    public String getCust_linkman() {
        return cust_linkman;
    }
    public void setCust_linkman(String cust_linkman) {
        this.cust_linkman = cust_linkman;
    }
    public String getCust_phone() {
        return cust_phone;
    }
    public void setCust_phone(String cust_phone) {
        this.cust_phone = cust_phone;
    }
    public String getCust_mobile() {
        return cust_mobile;
    }
    public void setCust_mobile(String cust_mobile) {
        this.cust_mobile = cust_mobile;
    }
    @Override
    public String toString() {
        return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]";
    }
}

2.4 创建映射文件

实体类Customer目前还不具备持久化操作的能力,而Hibernate需要知道实体类Customer映射到数据库Hibernate中的哪个表,以及类中的哪个属性对应数据库表中的哪个字段,这些都需要在映射文件中配置。
在实体类Customer所在的包中,创建一个名称为Customer.hbm.xml的映射文件,在该文件中定义了实体类Customer的属性是如何映射到cst_customer表的列上的。

<?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="cn.xhh.domain" >
    <class name="cn.xhh.domain.Customer" table="cst_customer" >

<id name="cust_id" column="cust_id">
            <generator class="native"></generator>
        </id>
<property name="cust_name" column="cust_name" ></property> <property name="cust_source" column="cust_source" ></property> <property name="cust_industry" column="cust_industry" ></property> <property name="cust_level" column="cust_level" ></property> <property name="cust_linkman" column="cust_linkman" ></property> <property name="cust_phone" column="cust_phone" ></property> <property name="cust_mobile" column="cust_mobile" ></property> </class> </hibernate-mapping>

2.5 创建hibernate的核心配置文件

Hibernate的映射文件反映了持久化类和数据库表的映射信息,而Hibernate的配置文件则主要用来配置数据库连接以及Hibernate运行时所需要的各个属性的值。在项目的src下创建一个名称为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> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_32</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</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> <mapping resource="cn/xhh/domain/Customer.hbm.xml" /> </session-factory> </hibernate-configuration>

该配置文件设置了数据库连接的相关属性以及其它的一些常用属性,并且通过mapping的resource属性将对象的映射信息加入到了Hibernate的配置文件中。

2.6 编写测试代码

在项目中创建一个名称为cn.xhh.Demo的包,然后在包中建立一个名为Demo1.java的文件,该文件是用来测试的类文件。

package cn.xhh.Demo;

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

import cn.xhh.domain.Customer;

//测试Hibernate框架
public class Demo {

    @Test
    //保存客户
    public void fun1(){
        Configuration conf = new Configuration().configure();
        
        SessionFactory sessionFactory = conf.buildSessionFactory();
        
        Session session = sessionFactory.openSession();
    
        Transaction tx = session.beginTransaction();
        //----------------------------------------------
        Customer c = new Customer();
        c.setCust_name("google公司");
        
        session.save(c);//执行保存
        
        //----------------------------------------------
        tx.commit();
        session.close();
        sessionFactory.close();
    }
}

原文链接:https://www.cnblogs.com/liuhui0308/p/11768690.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java月考题JSD1908第二次月考(含答案和解析)

下一篇:数字签名与数字加密的区别