当前位置: 移动技术网 > IT编程>开发语言>Java > Hibernate知识总结(一)

Hibernate知识总结(一)

2019年02月27日  | 移动技术网IT编程  | 我要评论
一、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的注解来创建数据表,不提及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对象数据已经插入到数据表中。

 

 

 

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网