欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hibernate知识总结(一)

程序员文章站 2022-08-31 16:28:27
一、ORM ORM的全称是Object/Relation Mapping,即对象/关系映射,可以将其理解成一种规范,它概述了这类框架的基本特征:完成面向对象的编程语言到关系数据库的映射。可以把ORM看作应用程序和数据库的桥梁。 ORM基本映射方式 1、数据表映射实体类(持久化类);2、数据表中的行映 ......

一、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的初步使用。
注:此处使用的是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对象数据已经插入到数据表中。

Hibernate知识总结(一)