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

Hibernate快速入门

程序员文章站 2024-03-23 13:24:46
...

Hibernate快速入门

前两天学习完毕了Mybatis,今天来学习另一个ORM框架,Hibernate。

Hibernate的优势:

  1. 对象化

Hibernate可以使开发人员以面向对象的思想来对数据库进行操作。Jdbc只能通过sql语句将元素传递给数据库,进行数据库操作。但是Hibernate可以在底层对数据进行对象转化,使开发人员只用面向对象的思想和方式来存取数据即可。

  1. 更好的移植性

Hibernate使用XML或者jpa的配置以及数据库方言等等的一系列机制,使得Hibernate具有更好的移植性,面对不同的数据库,开发人员仅需要使用想的数据操作即可,无需关心数据库之间的差异,而直接使用Jdbc就不得不考虑数据库之间的差异的问题。

  1. 缓存机制的使用

Hibernate提供了缓存机制,(session缓存,二级缓存,查询缓存),对于那些改动不大且进场时用的数据,可以将它们放在缓存中,不必每次使用都去查询数据,缓存机制对于提升性能有很大的作用。

  1. 开发效率高

Hibernate提供了大量的封装(这也是它最大的缺点),很多数据操作以及关联关系等都被封装的很好,开发者不需要写大量的sql语句,这就极大的提高了开发者的开发效率。

Hibernate的快速入门小案例

老生常谈,先说说Hibernate需要什么
1.Jar包
2.要操作的数据库
3.实体类
4.实体类映射文件
5.核心配置文件

按照我们上述的分析,来一步一步的实现。
首先导入Jar包,因为我使用的是Maven工程,这里我就仅需要配置坐标就好了,这里写一下必须的jar包:
1.数据库连接驱动mysql-connector-java
2.hibernate-core

<dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.6.Final</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

2.数据库:
(这里我就随便找了一个)
Hibernate快速入门
3.实体类:



public class News {
    private int nid;
    private String title;
    private String content;
    private String photo;

    @Override
    public String toString() {
        return "News{" +
                "nid=" + nid +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", photo='" + photo + '\'' +
                '}';
    }


    public int getNid() {
        return nid;
    }

    public void setNid(int nid) {
        this.nid = nid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }
}

4.实体类对应的映射文件:

命名规范为XXX.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.bean.News" table="news">
        <!-- 建立类中的属性与表中的主键相对应 -->
        <id name="nid" column="nid">
            <!-- 主键的生成策略,后面会讲,现在使用的是本地生成策略 -->
            <generator class="native" />
        </id>

        <!-- 建立类中的普通属性和表中的字段相对应 -->
        <property name="title" column="title" />
        <property name="content" column="content" />
        <property name="photo" column="photo" />

    </class>
</hibernate-mapping>

解释一下这里的几个关键的标签和标签属性:
< class >标签中的name属性就是代表你要操作哪个数据库表所对应的实体类的全类名,table属性也显而易见,就是对应数据库的那张表。
剩下的属性和mybatis的映射文件相同,如果映射的是主键,就是用id标签,如果映射的不是主键,就使用property标签,name对应实体类中的属性,column对应数据库表中的列名。

5.主配置文件:
默认名称为hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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>
        <!-- 下面是三个必须要有的配置 -->
        <!-- 配置连接MySQL数据库的基本参数 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate_demo01</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>

        <!-- 配置Hibernate的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 下面两个是可选的配置哟! -->
        <!-- 打印sql语句 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化sql语句 -->
        <property name="hibernate.format_sql">true</property>

        <!-- 告诉Hibernate的核心配置文件加载哪个映射文件 -->
        <mapping resource="com/bean/News.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

这个就没啥好说的了。

hibernate需要的文件都创建完毕了,接下来就是创建一个测试类,来对hibernate的功能进行测试,我们这个demo就实现CRUD功能。

创建测试类:

//这里我使用的是单元测试:
import com.offcn.bean.News;
import com.offcn.bean.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.List;


public class Hibernate02 {


    Session session;
    Transaction transaction;
    SessionFactory sessionFactory;

    @Before
    public void init() {
        //1. 加载Hibernate的核心配置文件
        Configuration configuration = new Configuration().configure();
        //如果在Hibernate的核心配置文件没有设置加载哪个映射文件,则可手动加载映射文件
        //configuration.addResource("com/meimeixia/hibernate/demo01/Customer.hbm.xml");

        //2. 创建SessionFactory对象,类似于JDBC中的连接池
        sessionFactory = configuration.buildSessionFactory();

        //3. 通过SessionFactory获取到Session对象,类似于JDBC中的Connection
        session = sessionFactory.openSession();

        //4. 手动开启事务,(最好是手动开启事务)
        transaction = session.beginTransaction();
    }
    
    //增加
    @Test
    public void insert(){
        News news = new News();
        news.setTitle("号外号外");
        news.setContent("大新闻");
        news.setPhoto("photo01");

        session.save(news);
    }
    
    //删除
    @Test
    public void delete(){
        //删除方法里面传递的也是一个对象
        News news = new News();
        news.setNid(12);
        session.delete(news);
    }
    
    //修改
    @Test
    public void update(){
        //对象其中必须包含主键
        News news = new News();
        news.setTitle("修改后Title");
        news.setContent("修改后Content");
        news.setNid(10);
        session.update(news);
    }
    
    //查询
    @Test
    public void findById(){
        //有两种查询的方法,get和load,load具有延迟加载的效果。
        News news = session.get(News.class, 10);
        System.out.println(news);
        News news1 = session.load(News.class, 10);
        System.out.println(news1);
    }





    @After
    public void commit(){
        transaction.commit();
        session.close();
        sessionFactory.close();
    }
}

增加操作的结果
Hibernate快速入门
删除操作的结果
Hibernate快速入门
日志文件打印的sql语句:
Hibernate快速入门
修改操作的结果:

Hibernate快速入门

查询操作的结果
Hibernate快速入门

快速入门就是以上的啦,喜欢请点个赞。