Hibernate学习笔记(1)

nibiru 2019年04月26日 60次浏览

前言:

说实话,建这博客的目的就是为了记录自己的学习和生活,然并卵。。。。我好像忘了它的存在,一直在我github上挂着,下午抽出来时间搞了一下博客中的评价系统,我也不知道到底能不能用- -,而且其他一些功能我还没有研究透,慢慢来咯~

最近在学习SSH框架,其中Struts2已经学完了,但是学的不怎么样,估计还要再重新学一遍- -。等把hibernate搞完在写Struts2的学习笔记吧。(刚开始学,内容难免有不准确的地方,等到学完回头来看看再修改啦!)

JAVA EE开发的结构:

web层,业务层,持久层是EE开发中经典的三层结构
web层:servlet+jsp,Struts1,2,Spring mvc
业务层:Javabean,spring
持久层:JDBC,hibernate,mybatis

Hibernate简介

Hibernate处于ee开发结构的持久层(DAO层),他使用ORM思想对数据库进行crud(增删改查)操作。
那么什么是ORM呢?

orm就是对象关系映射,什么是对象关系映射呢?我个人的理解就是让实体类,也就是Javabean中的内容,与数据库中的内容进行一一对应,让实体类与数据库中的表对应,实体类里面的内容与数据库中的内容对应,这样,我们在操作数据库中内容的时候,就不用直接操作数据库中的表了,直接操作实体类中的对象、
而这对应的过程是使用配置文件来完成的。

Hibernate环境搭建过程

我是用Intellij IDE来学习Hibernate的,其实老师上课一直在用myeclipise,各种导包,导入约束,我觉得这种过程只需要做一次自己知道的大概就行了,不用每次都在这地方浪费时间,intellij ide的好处就是可以自动导包,比myeclipise简化多了,时间也节省了- -这里我就不多说了

没有对比就没有伤害,如下图:
hibernate1-1
hibernate1-2

Hibernate优势

1.Hibernate对jdbc访问数据库的代码进行了封装,终于可以不用写繁琐的重复性的sql代码了- -
2.不知道了

学习过程

开头已经说了,我们首先要有一个实体类(JavaBean)
这里我没有在数据库中先创建表,因为Hibernate框架会根据后面的配置文件自动在数据库中创建表

1.先来看实体类:

//实体类,要与数据库表中名称一一对应
/*这些属性通过getter和setter方法来访问,对外部隐藏了内部是实现细节*/
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_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_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;
    }
}

2.实体类创建完毕,接下来我们要创建配置文件,让它与数据库中的表进行对应

在实体类所在的包中,创建一个名称为 实体类名称+hbm.xml的映射文件,在这个映射文件中,定义了实体类中的属性是如何映射到数据库中的表的,在这里我的映射文件名称为:Custome+hbm.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!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="cn.lcx.domain.Customer" table="cst_customer">
        <id name="cust_id" column="cust_id">
            <generator class="native"/>
        </id>
        <property name="cust_name" column="cust_name"/>
        <property name="cust_source" column="cust_source"/>
        <property name="cust_industry" column="cust_industry"/>
        <property name="cust_level" column="cust_level"/>
        <property name="cust_phone" column="cust_phone"/>
        <property name="cust_mobile" column="cust_mobile"/>
    </class>
</hibernate-mapping>

我来对上面的表进行一些说明:

class标签是用来建立实体类和数据库表中的映射的

name:实体类的路径,这个不用多解释,你总要告诉是哪个实体类吧,注意名称必须是全路径

table:看名字就知道是数据库的表了,也就是实体类所对应的那个表,这里表的名称为cst_customer,数据库还没有指定,在后面的会说到

catalog:这个属性就是指定数据库了,可以省略,这里我没有写,因为后面的配置文件会指定-

id标签是用来指定类中的属性和表中的主键相对应,说白了就是建立主键的,什么是主键- -这个我就不多说了,主键是唯一的。

name:这个是指类中的属性名

column:这个是指表中的名,如果实体类中的名字和表中的名字相同可以省略,不过我没测试,我觉得还是不要省略吧,便与检查

length:字段的长度啦,除非有特殊的,这个默认就好

type:类型啦,对应sql的类型,没什么多说点

< generator class=“native”/> 这个是主键生成策略,native为自动增长,就是123456这样增长下去,后面肯定还有不同的增长策略,我还没有学习到- -。等再补充

property标签,就是建立类中的普通属性与数据库表中的标签相对应,这个很好理解

Hibernate核心配置文件

以上的内容是实体类与数据库中的表来建立映射关系,我上面有说,我们还没有指定是哪个数据库,这里就是来配置数据库连接的,首先来看代码

<?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="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01?useUnicode=true&amp;characterEncoding=UTF8</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <property name="hibernate.connection.username">root</property>
         <property name="hibernate.connection.password">abc3770166</property>
        <!--hibernate属性-->
        <!-- DB schema will be updated if needed -->
        <!--根据配置生成sql语句-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!--在控制台显示sql语句-->
        <property name="hibernate.show_sql">true</property>
        <!--格式化sql语句-->
        <property name="hibernate.format_sql">true</property>
        <!--hbm2ddl属性说明-->
        <!--hbm2ddl.auto的取值-->
        <!--none 不自动生成表-->
        <!--create 每次都会创建一个新的表-->
        <!--create-drop每次都会创建一新的表,然后程序结束后删除这个表-->
        <!--update 如果数据库中有这个表,则使用,没有,则创建一个表-->
        <!--validate 只会使用原有的表,可以用来检测映射关系-->
        <property name="hbm2ddl.auto">update</property>
        <!--加载映射关系-->
        <mapping resource="cn/lcx/domain/Customer.hbm.xml"></mapping>
    </session-factory>
</hibernate-configuration>

在src下创建一个名称为hibernate.cfg.xml的文件,这里我就不用创建啦,因为智能的intellij ide已经帮我创建好啦,eclipse下要手动创建的,所以强烈安利使用 intellij ide,可以节省不少时间呢!

上面这个配置文件设置了数据库的相关属性和其他一些常用的数据,通过mapping的resource属性将对象的关系加入到了hibernate的配置文件中

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day01?useUnicode=true&amp;characterEncoding=UTF8</property>

这里我在数据库名称 hibernate_day01后面加入了 ?useUnicode=true&characterEncoding=UTF8 这个是编码格式,实测如果不加的话在数据库中出现中文会识别不了,hhibernate_day01为数据库的名称,这个数据库要提前建好哦,表就不用了。
hibernate1-3

ps:mysql数据库中有个坑爹的地方,字符集有utf8和utf8mb4,记住!!!永远不要在MySQL中使用utf8,要用utf8mb4,至于为什么,各位可以网上进一步了解,我是吃了大亏!!!!!

编写测试代码

好了,配置文件都搞完了,我们现在要开始测试一下我们弄的成果。先上代码:

public class HibernateDemo1 {

    public static void demo01 ()
    {

            //加载配置文件
            Configuration cfg = new Configuration().configure();
            //创建一个SeeeionFactory
            SessionFactory sessionFactory =cfg.buildSessionFactory();
            //创建session对象,类似于jdbc的Connection
            Session session = sessionFactory.openSession();
            //开启事务
            Transaction tx = session.beginTransaction();
            //执行相关操作
            Customer customer = new Customer();
            customer.setCust_name("小溪");
            customer.setCust_source("网络推广");
            session.save(customer);

            //提交事务
            tx.commit();
            //释放资源
            session.close();
    }

    public static void main(final String[] args)
    {
        demo01();
        System.out.println("success");
    }
}

通过代码我们可以分析:

Configuration主要是用于加载、启动映射文件,反正就是和映射文件有关啦,通过 Configuration cfg = new Configuration().configure(); 来创建实例,configure()这个方法是使用默认的hibernate.cfg.xml配置文件,如果不是默认的文件,就要指定文件的位置,方法是configure(“路径/配置文件.xml”),不过我觉得一般很少用到这个方法

SessionFactory 工厂对象,这个接口可以看得出来是初始化和建立 session对象,session在hibernate中起到一个缓冲作用,hibernate将自动生成的东东放到这个缓冲区中,就是缓存嘛~它的同一个实例可以提供多个线程共享,所以只需要建立一个就行了,节约资源~~~

Session就是类与数据库交互的一个对象啦,crud操作就是用它来完成,创建完SessionFactory实例以后就可以获取session实例了,这里获取session实例有两种方式,一种是openSession()方法,一种是getCurrentSession()方法,

第一种方法:

Session session = sessionFactory.openSession();

第二种方法

Session session = sessionFactory.getCurrentSession();

这两种方法,简单来说,就是使用第一种的时候要在最后手动使用close方法关闭,而第二种不用,他会自动关闭。

方法总结:
hibernate1-4

Transaction 接口主要用于管理事务,它由Session对象开启,在Transaction接口中,提供了常用方法,比如commit ()方法,它用于提交session实例,这个很重要,执行完数据操作以后,要用这个方法来进行提交,才能真正的将内容同步到数据库中,roolback()是回滚操作,在出现异常错误时,要用此方法回滚,这里我没有用到这个方法。

Customer类就是获取对象啦,对对象中的属性进行操作从而实现对数据库中的操作,然后用session.save()方法进行保存

好了我们运行来看一下:
hibernate1-5

hibernate1-6

运行成功,可以看到数据已经添加到数据库的表中。

总结

以上就是我第一天学习Hibernate的心得,第一天学习嘛,肯定还有很多地方的理解的不行,再接下来的学习中慢慢努力咯~