Hibernate学习---基本介绍+作用+配置

从今天开始重新学习(以前学的太匆忙)Hibernate,这篇文章主要就一下几点进行讲解和说明:

  • Hibernate的基本介绍
  • Hibernate的作用
  • Hibernate基本配置

Hibernate的基本介绍:

Hibernate最开始的作者是Gavin King,是澳大利亚人,在工作中因为不满EJB的种种不足,而自行花费两年的时间开发出最原始的Hibernate,后来被Jboss收购了Gavin King所在的公司(最主要是看上了Hibernate),后来的Jboss被红帽收购,所以现在Hibernate为红帽旗下的产品。

讲到了Hibernate怎么能不提一下什么叫做JPA(Java persistence API),是JavaEE5标准的ORM接口标准,是一种规范和接口,并不是ORM的具体实现,用于实现这一套规范的框架有很多,其中Hibernate就是一个这样的框架。

JPA,ORM,Hibernate之间的关系: ORM是一种思想,JPA是这种思想的规范约束,Hibernate是这种思想和规范的具体实现。

Hibernate的作用:

说到了作用就自然而然的想到了Hibernate的工作大体工作模式:

这个是Hibernate的一个简单结构。

Hibernate是一款持久化框架(ORM)即Object Relationship Mapping,对JDBC进行了轻量级的封装,他能够自动根据我们的需求,能够将我们的实体类映射到数据库表中而进行存储。 这就是它的作用。

Hibernate基本配置

下面我们就来说说Hibernate的具体配置吧: 首先,我们去官网找到相应的jar包(我使用的是5.0.1)http://hibernate.org/

然后将下载好的安装包解压:

打开lib,选中required中所有jar包,optional里面c3p0所有jar包,optional的ehcache下slf4j-api-1.6.1.jar,jpa-metamodel-generator下所有jar包,jpa下所有jar包,当然还需要我们的数据库驱动jar包,根据我们使用的数据库自行选定。 选完过后的jar包大概是这样的:

将这些jar包放到我们新建的项目中(我创建的是java project,因为Hibernate是对数据库底层的操作,不需要建立web project)。 在项目中创建lib文件夹,将jar包放入,并加入到我们路径中。

接下来就是配置文件了: 我们需要配置两个配置文件: ①/TestHibernate/src/hibernate.cfg.xml ②/TestHibernate/src/entity/Student.hbm.xml 这两个文件所在的位置大家也看到了,hibernate.cfg.xml在src下,Student.hbm.xml和实体类放在同一个包下。

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>
        <!--DB连接四要素  -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///oa?useUnicode=true&amp;characterEncoding=UTF8</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">123</property>
        
        <!-- hibernate会根据你所指定生成sql语句,但是要指定数据库的版本  配置从core jar包里面找 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        
        <!-- 数据源(DBCP):数据库连接池 -->
        <property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
        
        <!-- 配置当前session上下文  保证同一个线程中获取的session是同一个-->
        <property name="hibernate.current_session_context_class">thread</property>
        
        <!-- 自动建表  里面的值也可以是create,但是每次都会新建一个表,影响效率,update在原有的表上面添加信息 -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        <!-- 显示sql -->
        <!-- <property name="hibernate.show_sql">true</property> -->
        
        <!-- 格式化sql -->
        <!-- <property name="hibernate.format_sql">true</property> -->
        
        <!-- 注册映射文件 -->
        <mapping resource="entity/Student.hbm.xml"/>
    </session-factory>


</hibernate-configuration>

Student.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="entity.Student" table="t_student">
        <id name="id" column="tid">
            <generator class="native"/>
        </id>
        <property name="name" column="t_name"/>
        <property name="age" column="t_age"/>
        <property name="score" column="t_score"/>
    
    </class>

</hibernate-mapping>

者两个配置文件的dtd约束在我们我Hibernate核心jar包里面有:

具体的配置和解释配置文件里面我都有具体的介绍。

接下来需要我们再entity包下建立对应的实体类:

package entity;


/**
 * @author:MindMrWang
 *2017年11月15日
 *:function:学生实体类
 */
public class Student {
    Integer id;
    String name;
    int age;
    double score;
    
    public Student() {
    }

    public Student(String name, int age, double score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}

接下来使我们的测试文件:

package Test;
/**
 * @author:MindMrWang
 *2017年11月16日
 *:function:测试hibernate
 */
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import entity.Student;
public class Test1 {
    public static void main(String[] args) {
        //加载配置文件
        Configuration config = new Configuration().configure();
        //根据配置文件创建会话工厂
        SessionFactory factory = config.buildSessionFactory();
        //根据会话工厂创建会话
        Session session = factory.getCurrentSession();
        //创建一个事物对象
        Transaction tx = session.beginTransaction();
        //new 一个学生对象
        Student student = new Student("张三",19,99);
        //将对象持久化到数据表中
        session.save(student);
        //提交事务
        tx.commit();
        //关闭会话
        session.close();
        //关闭工厂
        factory.close();
    }
}

然后打开我们的数据库可视化工具就可以看见我们在hibernate.cfg.xml中指定的t_student表。 本篇文章就介绍到这里了,未完待续。

如有错误,欢迎指正。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

责任链模式

38060
来自专栏刘君君

Spring Boot 静态资源处理

79860
来自专栏开发与安全

linux网络编程之socket(七):一个进程发起多个连接和gethostbyname等函数

一、在前面讲过的最简单的回射客户/服务器程序中,一个客户端即一个进程,只会发起一个连接,只要稍微修改一下就可以让一个客户端发起多个连接,然后只利用其中一个连接发...

27000
来自专栏菩提树下的杨过

Spring 4.0.2 学习笔记(2) - 自动注入及properties文件的使用

接上一篇继续, 学习了基本的注入使用后,可能有人会跟我一样觉得有点不爽,Programmer的每个Field,至少要有一个setter,这样spring配置文件...

22460
来自专栏Java架构师历程

Spring工作原理

      内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、...

23120
来自专栏JMCui

Netty 系列四(ChannelHandler 和 ChannelPipeline).

    先来整体的介绍一下这篇博文要介绍的几个概念(Channel、ChannelHandler、ChannelPipeline、ChannelHandlerC...

13120
来自专栏我的博客

Zend_Config使用笔记

1.zend_Config被设计在应用程序中简化访问和使用配置数据。它为在应用程序代码中访问这样的配置数据提供了一个基于用户接口的嵌入式对象属性。配置数据可能来...

27450
来自专栏java工会

Spring工作原理

内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、...

8010
来自专栏cmazxiaoma的架构师之路

Effective Java学习(1) 服务提供者框架

29030
来自专栏互联网技术杂谈

flume 1.8.0 开发之RPC

flume开发基础可见:https://cloud.tencent.com/developer/article/1195082

45950

扫码关注云+社区

领取腾讯云代金券