Hibernate知识总结(一)

一、ORM

ORM的全称是Object/Relation Mapping,即对象/关系映射,可以将其理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。可以把ORM看作应用程序和数据库的桥梁。

ORM基本映射方式

1、数据表映射实体类(持久化类);
2、数据表中的行映射对象;
3、数据表中的字段映射对象的属性。

基本上所有的ORM工具大致都遵循相同的映射思路。

二、Hibernate

Hibernate是一款轻量级的持久层框架,它完成了对象模型和基于SQL的关系模型的映射关系,使得开发者能够以面向对象的方式开发应用程序,它还提供数据处理的方法,可以大幅度减少开发人员使用SQL和JDBC处理数据的时间。

Hibernate初步使用

下载Hibernate(此步骤略过),解压该文件;

 

使用IDE新建普通java项目(本人使用idea),在项目中引入使用Hibernate所必须的jar包,即引入required文件夹中的jar包;另外此处使用JDBC连接,需要额外引入mysql-connector的jar包

 

现在使用一个简单的小例子,实现Hibernate的初步使用。
注:此处使用的是Hibernate的注解来创建数据表,不提及xml配置文件建表方式。

创建持久化类User,该类和一般的JavaBean并没有什么区别;
User类包含id、userName、age属性,User类的代码如下:

 1 package com.yjry.note;
 2 
 3 public class User {
 4     private Integer id;
 5     private String userName;
 6     private Integer age;
 7     //重写toString方法,便于显示数据
 8     @Override
 9     public String toString() {
10         return "User{" +
11                 "id=" + id +
12                 ", userName='" + userName + '\'' +
13                 ", age=" + age +
14                 '}';
15     }
16 
17     public Integer getId() {
18         return id;
19     }
20 
21     public void setId(Integer id) {
22         this.id = id;
23     }
24 
25     public String getUserName() {
26         return userName;
27     }
28 
29     public void setUserName(String userName) {
30         this.userName = userName;
31     }
32 
33     public Integer getAge() {
34         return age;
35     }
36 
37     public void setAge(Integer age) {
38         this.age = age;
39     }
40 }

 

为该类添加Hibernate注解,添加注解后代码如下:

package com.yjry.note;

import javax.persistence.*;

@Entity
@Table(name = "t_user")
public class User {
    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "user_name", length = 30)
    private String userName;
    private Integer age;
    //重写toString方法,便于显示数据
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }

    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 Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

 

下面解释下各个注解的意义:

@Entity注解声明该类是一个Hibernate的持久化类;

@Table注解指定该类映射的数据表,此处指定该类映射的数据表为t_user表;

@Id用于指定该类的标识属性(可以唯一表示该对象的属性),标识属性通常映射到数据表的主键列;

@GeneratedValue用于指定主键生成策略,其中strategy属性指定了主键生成策略为IDENTITY,对于MySQL数据库来说,主键自增长。

 

接下来编写Hibernate的核心配置文件hibernate.cfg.xml(该文件名为Hibernate加载的默认文件名),配置文件代码如下:

<!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://localhost:3306/test</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123456</property>

        <!--是否打印sql语句-->
        <property name="hibernate.show_sql">true</property>
        <!--打印出来的sql语句是否格式化-->
        <property name="hibernate.format_sql">true</property>

        <!--建表策略,建议使用update-->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!--指定数据库方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!--告诉hibernate映射文件所在位置-->
        <mapping class="com.yjry.note.User"/>
    </session-factory>
</hibernate-configuration>

建表策略

hibernate.hbm2ddl.auto属性可以为validate、update、create、create-drop。

validate:每次创建SessionFactory时,若数据库中没有与持久化类对应的数据表,或者数据表与持久化类不一致,则抛出异常;
注:判断不一致的条件为:数据表中缺少持久化类的属性对应的字段,也就是说,若持久化类对应的数据表含有多余的字段,不会影响validate检查,即程序不会抛出异常。

update:每次创建SessionFactory时,若数据库中没有与持久化类对应的数据表,则自动建表;若数据库中存在对应的表,则保留已有的数据表和数据,仅更新或插入数据;

create:每次创建SessionFactory时,都会自动建表,若之前存在数据表,则原表保留的数据会全部丢失;

create-drop:每次创建SessionFactory时,自动建表,SessionFactory关闭时,自动删表。

数据库方言

Hibernate底层依然使用SQL语句来执行数据库操作,然而各个数据库在SQL语法上存在一些差异,因此Hibernate需要根据数据库来识别这些差异,此时就要指定hibernate.dialect,这里使用MySQL数据库方言,告诉Hibernate使用MySQL的方式执行SQL语句。

 

创建测试类,完成数据表的创建以及数据的插入操作。代码如下:

 

package com.yjry.test;

import com.yjry.note.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class UserTest {
    public static void main(String[] args) {
        /**
         * 加载Hibernate配置文件
         * 不带参数的Configuration方法,默认加载hibernate.cfg.xml文件
         * 若传入test.xml作为参数,则加载test.xml文件
         */
        Configuration configuration = new Configuration().configure();
        //创建SessionFactory实例,创建该实例后,数据表已经创建完毕
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        //创建Session实例
        Session session = sessionFactory.openSession();
        //开启事务
        Transaction transaction = session.beginTransaction();
        //创建User对象,并设置属性
        User user = new User();
        user.setUserName("张三");
        user.setAge(20);
        //执行session的save方法,保存数据,数据表待插入该数据
        session.save(user);
        //提交事务,数据插入到数据表
        transaction.commit();
        //关闭资源
        session.close();
        sessionFactory.close();
    }
}

 

执行该代码,会发现MySQL数据库中多了一张t_user表,该表包含id、age、user_name三个字段,并且刚才创建的User对象数据已经插入到数据表中。

 

 

 
posted @ 2019-02-26 16:17  yjry-th  阅读(331)  评论(0编辑  收藏  举报