Hibernate ORM框架学习日记基础篇-1

一、简介

      Hibernate是轻量级Java EE应用的持久层解决方案,不仅管理Java类库到数据库表的映射,还提供数据查询和获取数据的

方法,它完成对象模型和基于SQL的关系模型的映射关系,使得开发者可以完全采用面向对象的方法来开发应用程序。

      ORM全称为Object/Relation Mapping,即对象/关系数据库映射,完成面向对象到关系数据库的映射,将关系数据库包装成

面向对象的模型

image

二、hibernate 及相关下载

      在Eclipse中新建一个项目,然后准备好需要的jar包,数据库使用的是mysql

      a.官网下载hibernate orm jar包,解压之后将lib中的required所有jar包导入项目

      b.由于使用mysql数据库连接,所以要将mysql的数据库连接的jar导入项目,即mysql-connector-java-5.1.42-bin.jar

      c.这里使用c3p0数据源进行数据库的连接管理,所以需要将下载的hibernate jar包中的lib文件夹下的optional文件夹下的

        c3p0文件夹下的所有jar包导入项目

      d.测试类需要用到JUnit,需要在项目中导入JUnit4的jar包

三、开始使用hibernate

1.创建持久化对象

   持久化对象(PO)是hibernate中重要的媒介,以面向对象的方式完成对数据库的增删改的操作,在我们对持久化进行创建、修改

删除的操作时,不需要去再去操作数据库,hibernate会负责把这种操作转换为对数据库表的操作。

  持久化对象(PO)= java的普通传统对象POJO+持久化的注解

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name="user_info")
public class User {
    
    private Integer userId;
    private String userName;
    private String telNumber;
    private Date registerDate;
    
    
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getTelNumber() {
        return telNumber;
    }
    public void setTelNumber(String telNumber) {
        this.telNumber = telNumber;
    }
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="registerDate")
    public Date getRegisterDate() {
        return registerDate;
    }
    public void setRegisterDate(Date registerDate) {
        this.registerDate = registerDate;
    }

}

上面创建一个名为User的持久化对象,并使用了相应的注解

@Entity 表明该类为Hibernate的持久化类

@Table 指定该类映射的数据库中的表,user_info

@Id 表示该类的标识属性,一般对应数据库的主键

@GeneratedValue: 表示主键的生产策略,此处的策略为自动增长

@Column:对应表中的字段名称

@Temporal:处理时间的格式

通过上面的注解就将POJO类映射到了数据库的user_info表中

 

二、配置文件hibernate.cfg.xml

右击src文件夹,新建文件,命名为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>
        <!-- 连接数据库的信息 -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/huan</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!-- 连接池管理策略 -->
        <!-- 最大连接数 -->
        <property name="hibernate.c3p0.max_size">100</property>
        <!-- 最小连接数 -->
        <property name="hibernate.c3p0.min_size">10</property>
        <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
        <property name="hibernate.c3p0.timeout">5000</property>
        <!-- 最大的PreparedStatement的数量 -->
        <property name="hibernate.c3p0.max_statements">100</property>
        <property name="hibernate.c3p0.idle_test_period">300</property>
        <property name="hibernate.c3p0.acquire_increment">2</property>
        <property name="hibernate.c3p0.validate">true</property>
        <!-- 数据库的方言 -->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>        
        <!-- 根据需要自动创建表 如果表存在不新建表,只操作数据 -->
        <property name="hbm2ddl.auto">update</property>
        <!-- 打印sql -->
        <property name="show_sql">true</property>
        <!-- 格式化打印的sql -->
        <property name="hibernate.format_sql">true</property>
        
        <!-- 罗列持久化的类名 -->
        <mapping class="com.huan.entity.User"/>
        
    </session-factory>
</hibernate-configuration>

hibernate配置文件的默认名称为hibernate.cfg.xml,hibernate会自动去加载该文件。

三、测试使用hibernate

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.huan.entity.User;

public class HibernateBasicUseTest {
    
    
    private SessionFactory sessionFactory;

    @Before
    public void setUp() {
        //解析配置文件 默认去加载hibernate.cfg.xml
        Configuration config = new Configuration().configure();
        //创建SessionFactory实例
        sessionFactory = config.buildSessionFactory();
    }
    @After
    public void tearDown(){
        sessionFactory.close();
    }
    
    
    @Test
    public void testHibernateBasicUse(){
        //创建Session
        Session session = sessionFactory.openSession();
        //开启事务
        Transaction tx = session.beginTransaction();
        //操作持久化对象
        User user =  new User();
        user.setRegisterDate(new Date());
        user.setTelNumber("15678986774");
        user.setUserName("aha");
        //保存
        session.save(user);
        
        //事务提交
        tx.commit();
        //关闭Session
        session.close();
        
    }
    

}

上面代码创建了一个测试类,对于使用Hibernate可以总结为如下步骤

1.获取Configuration实例(加载配置文件)

2.获取SqlSessionFactory

3.获取Session

4.开启事务Transaction

5.完成业务逻辑,使用Session操作持久化对象,即完成对数据库的操作

6.提交事务,关闭Session

运行上面的测试类,由于之前的<property name="hbm2ddl.auto">update</property>为update,在没有表的情况下hibernate会先去创建表,

所以第一次运行上面的测试类可以看到控制台输出了两条SQL语句。

image

然后到数据库中查看是否已经新建了表并且保存了数据:

image

结果表明测试运行成功,整个过程并没有手写sql语句去操作数据库,这个操作由hibernate去完成,我们操作的仅仅是User对象。

这应该就是ORM框架的特色吧。

posted @ 2017-06-14 00:43  月关莫利亚  阅读(248)  评论(0编辑  收藏  举报