Hibernate

Posted xuweiweiwoaini

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate相关的知识,希望对你有一定的参考价值。

1 Hibernate简介

1.1 ORM框架

  • 对象关系映射(Object Relation Mapping)。
  • 是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
  • Object:对象,Java对象,此处特指JavaBean。
  • Relation:关系,二维表,数据库中的表。
  • Mapping:映射。

1.2 什么是Hibernate

  • Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装。
  • 它将POJO和数据库表建立映射关系,是一个全自动的ORM框架。
  • POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通的JavaBean。
  • Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用面向对象编程思维来操纵数据库。
  • Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序中使用,也可以在Servet/JSP的web应用中使用。

1.3 总结Hibernate

  • Hibernate是一个数据持久层的ORM框架,它的主要功能就是将对象映射到表中,操作API,只需要将一个对象存储到数据库,不需要写SQL。
  • Hibernate提供了对关系型数据库增删改查操作。

1.4 主流的ORM框架

  • JPA:Java Persistence API,JPA通过JDK5.0注解或XML描述对象--关系表的映射关系(只有接口规范)。
  • Hibernate:最流行的ORM框架,通过对象--关系映射配置,可以完全脱离底层SQL。
  • Mybatis:本来是Apache的一个开源项目iBatis,支持普通的SQL查询,存储过程和高级映射的优秀持久层框架。
  • Apache DBUtils。
  • Spring JDBC Template。

1.5 Hibernate的优点

  • Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性的代码。
  • Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度上简化了DAO层编码工作。
  • Hibernate使用Java的反射机制。
  • Hibernate的性能非常好,因为它是一个轻量级的框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一到多对多的各种复杂关系。

 

2 Hibernate的简单使用

2.1 Hibernate的使用步骤

  • ①在项目中加入hibernate的maven坐标:
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.4.Final</version>
</dependency>
  • ②创建数据库和数据库表。
  • ③编写核心配置文件hibernate.cfg.xml,这个文件有连接数据库的配置。
  • ④编写映射文件*.hbm.xml,声明对象如何关联数据库表字段。
  • ⑤调用Hibernate的API。

2.2 创建数据库表

  • sql:
CREATE DATABASE hibernate;
USE hibernate;
CREATE TABLE USER (    
    id INT PRIMARY KEY auto_increment, 
    username VARCHAR ( 50 ),
    `password` VARCHAR ( 50 ) 
);

2.3 导入数据库的驱动

  • mysql的驱动的maven坐标:
<dependency>
    <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>5.1.48</version>
</dependency>

2.4 编写JavaBean

  • User.java
技术图片
package com.sunxiaping.hibernateDemo.domain;

public class User {
    private Integer id;
    private String username;
    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }


    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


}
View Code

2.5 编写映射文件

  • 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>

    <class name="com.sunxiaping.hibernateDemo.domain.User" table="user" schema="hibernate">
        <id name="id">
            <column name="id" />
            <!-- 使用本地生成策略 -->
            <generator class="native"/>
        </id>
        <property name="username">
            <column name="username"/>
        </property>
        <property name="password">
            <column name="password"/>
        </property>
    </class>
</hibernate-mapping>
View Code

2.6 编写核心配置文件

  • hibernate.cfg.xml
技术图片
<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!--配置数据库连接参数-->
        <property name="connection.url">
            <![CDATA[
                jdbc:mysql://localhost:3306/hibernate?useUnicode=true&characterEncoding=utf-8&useSSL=false
            ]]>
        </property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <!--是否显示SQL-->
        <property name="show_sql">true</property>
        <!--是否格式化SQL-->
        <property name="format_sql">true</property>
        <!--是否自动提交事务-->
        <property name="connection.autocommit">true</property>

        <!--配置JavaBean和表的映射关系-->
        <mapping resource="com/sunxiaping/hibernateDemo/domain/User.hbm.xml"/>

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

2.7 测试

  • 测试
技术图片
package com.sunxiaping.hibernateDemo;

import com.sunxiaping.hibernateDemo.domain.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class HibernateTest {

    @Test
    public void test() {
        //加载hibernate.cfg.xml文件
        Configuration configuration = new Configuration().configure();
        //创建会话创建工厂
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        //创建会话
        Session session = sessionFactory.openSession();
        //开启事务
        Transaction transaction = session.beginTransaction();

        User user = new User();
        user.setUsername("张三");
        user.setPassword("123456");

        session.save(user);

        //提交事务
        transaction.commit();
        //关闭会话
        session.close();
        //关闭会话工厂
        sessionFactory.close();

    }
}
View Code

 

3 API详解

 

以上是关于Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的HQL多表查询

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

Hibernate CriteriaQuery where - ManyToOne 字段

Hibernate + MySQL:如何为数据库和表设置编码 utf-8

hibernate在使用getCurrentSession时提示no session found for current thread

Java类型相互转换byte[]类型,blob类型