Web开发 | Hibernate - 04.Hibernate常用的接口和类

1.Configuration类和作用

  Configuration 对象用于配置并且启动 Hibernate。

  Hibernate 应用通过该对象来获得对象-关系映射文件中的元数据,以及动态配置Hibernate 的属性,然后创建 SessionFactory 对象。

  简单一句话:加载 Hibernate 的配置文件,可以获取 SessionFactory (连接池)对象。

  /Hibernate5_d01_c04/src/hibernate/test/TestCustomer.java

读取配置文件

  可以加载自定义的配置的文件
  1、配置文件/Hibernate5_d01_c04/src/log4j.properties中的自动建表更改为update

  2、复制本项目原有的配置文件/Hibernate5_d01_c04/src/log4j.properties,并重命名为/Hibernate5_d01_c04/src/hibernate1.cfg.xml

  /Hibernate5_d01_c04/src/hibernate/test/TestCustomer.java
程序代码如下:

package hibernate.test;

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

import hibernate.domain.Customer;

public class TestCustomer {
    @Test
    public void testSave(){
        ...
        //1.读取配置文件hibernate.cfg.xml
        Configuration config = new Configuration();
        //config.configure();
        config.configure("hibernate1.cfg.xml");
        //2.获取连接池
        ...
    }
}

运行TestCustomer.java
运行效果


Configuration 类的其他应用

  加载配置文件的种类,Hibernate 支持 xml 和 properties 类型的配置文件,在开发中基本都使用 XML 配置文件的方式。

  1、如果采用的是 properties 的配置文件,那么通过 Configuration configuration = new Configuration();就可以加载配置文件,但是需要自己手动加载映射文件
    例如:config.addResource("com/igeek/domain/Customer.hbm.xml");

  2、如 果 采 用的 XML 的 配置文件 ,通过Configuration configuration = new
Configuration().configure();
加载配置文件。


2.SessionFactory接口

  1、是生成 Session 对象的工厂类

  2、SessionFactory 类的特点
    2.1、由 Configuration 通过加载配置文件创建该对象。
    2.2、SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的 SQL 语句。同时,SessionFactory 还负责维护 Hibernate 的二级缓存。
    2.3、预定义 SQL 语句。
    2.4、使用 Configuration 类创建了 SessionFactory 对象是,已经在 SessionFacotry 对象中缓存了一些 SQL 语句。
    2.5、常见的 SQL 语句是增删改查(通过主键来查询)。
    2.6、这样做的目的是效率更高。
    2.7、一个 SessionFactory 实例对应一个数据库,应用从该对象中获得 Session 实例。
    2.8、SessionFactory 是线程安全的,意味着它的一个实例可以被应用的多个线程共享。
    2.9、SessionFactory 是重量级的,意味着不能随意创建或销毁它的实例。如果只访问一个数据库,只需要创建一个 SessionFactory 实例,且在应用初始化的时候完成。
    2.10、SessionFactory 需要一个较大的缓存,用来存放预定义的 SQL 语句及实体的映射信息。另外可以配置一个缓存插件,这个插件被称之为 Hibernate 的二级缓存,被多线程所共享。

  3、总结:一般应用使用一个 SessionFactory,最好是应用启动时就完成初始化。


编写 HibernateUtil 的工具类

  /Hibernate5_d01_c05/src/hibernate/util/HibernateUtils.java
程序代码如下:

package hibernate.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    //使用一个静态块创建SessionFactory
    public static final Configuration CONFIG;
    public static final SessionFactory FACTORY;

    static{
        CONFIG = new Configuration().configure();
        FACTORY = CONFIG.buildSessionFactory();
    }

    //从连接池中获取连接
    public static Session openSession(){
        return FACTORY.openSession();
    }
}

  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer2.java
程序代码如下:

package hibernate.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import hibernate.domain.Customer;
import hibernate.util.HibernateUtils;

public class TestCustomer2 {
    @Test
    public void testSave(){
        Customer c = new Customer();
        c.setCust_name("xiaoming");
        c.setCust_address("意大利");
        //通过session保存
        Session session = HibernateUtils.openSession();
        Transaction tr = session.beginTransaction();
        session.save(c);
        tr.commit();
        session.close();
    }
}

  运行TestCustomer2.java

运行效果


3.Session接口

  1、概述
    1)Session 是在 Hibernate 中使用最频繁的接口。也被称之为持久化管理器。它提供了和持久化有关的操作,比如添加、修改、删除、加载和查询实体对象。
    2)Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心。
    3)Session 是线程不安全的。
    4)所有持久化对象必须在 session 的管理下才可以进行持久化操作。
    5)Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久化操作的数据都缓存在 session 对象处。
    6)持久化类与 Session 关联起来后就具有了持久化的能力。

  2、特点
    1)不是线程安全的。应避免多个线程使用同一个 Session 实例。
    2)Session 是轻量级的,它的创建和销毁不会消耗太多的资源。应为每次客户请求分配独立的 Session 实例。
    3)Session 有一个缓存,被称之为 Hibernate 的一级缓存。每个 Session 实例都有自己的缓存。

  3、常用的方法

save(obj) 保存数据
get(Class,id) 通过主键查询该条记录
delete(obj) 删除数据
update(obj) 修改数据
saveOrUpdate(obj) 保存或者修改
createQuery(String hql) 查询所有的数据

session 中的 save方法

  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer3.java
程序代码如下:

package hibernate.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import hibernate.domain.Customer;
import hibernate.util.HibernateUtils;

public class TestCustomer3 {
    Session session;
    Transaction tr;
    /*
     * @Before – 表示在任意使用@Test注解标注的public void方法执行之前执行
     */
    @Before
    public void init(){
        //获取 session
        session = HibernateUtils.openSession();
        //开启事务
        tr = session.beginTransaction();
    }
    /**
     * save
     */
    @Test
    public void save(){
        //第一个参数是javabean类,第二个参数是数据表的id值
        Customer c = new Customer();
        c.setCust_name("小红");
        session.save(c);
    }
    /*
     * @After – 表示在任意使用@Test注解标注的public void方法执行之后执行
     */
    @After
    public void destory(){
        //提交事务
        tr.commit();
        //释放资源
        session.close();
    }

}

  运行测试单元

选中方法右键运行测试单元
选中方法右键运行测试单元
运行结果
运行结果


session 中的 get 方法

  在 TestSession3 类,添加 get 方法
  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer3.java
程序代码如下:

...

public class TestCustomer3 {
    ...
    /**
     * get 获取一条数据的记录
     * @Test – 使用该注解标注的public void方法会表示为一个测试方法
     */
    @Test
    public void get(){
        //根据 id 获取数据
        //第一个参数是javabean类,第二个参数是数据表的id值
        Customer c = session.get(Customer.class, 4L);
        //在 Customer 类中添加 toString()方法
        System.out.println(c);
    }
    ...
}

  运行测试单元

运行结果
运行结果


session 中的 delete 方法

  在 TestSession3 类,添加 delete 方法
  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer3.java
程序代码如下:

...

public class TestCustomer3 {
    ...
    /**
     * delete
     */
    @Test
    public void delete(){
        //第一个参数是javabean类,第二个参数是数据表的id值
        Customer c = session.get(Customer.class, 6L);
        session.delete(c);
    }
    ...
}

  运行测试单元

运行结果
运行结果


session 中的 update 方法

  在 TestSession3 类,添加 update 方法
  注意:hibernate 会根据主键 id 更新所有字段

  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer3.java
程序代码如下:

...

public class TestCustomer3 {
    ...
    /**
     * update
     */
    @Test
    public void update(){
        //第一个参数是javabean类,第二个参数是数据表的id值
        Customer c = session.get(Customer.class, 4L);
        c.setCust_name("小丽");
        session.update(c);
    }
    ...
}

  运行测试单元

运行结果
运行结果


session 中的 createQuery 方法

  在 TestSession3 类,添加 queryAll 方法
  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer3.java
程序代码如下:

...

public class TestCustomer3 {
    ...
    /**
     * creteQuery
     */
    @Test
    public void queryAll(){
        //1.执行createQuery方法返回Query接口
        //createQuery方法里写HQL语句,面向javabean查询,hql语句中不能出现表名,只能出现javabean名
        Query query = session.createQuery("from Customer");
        //2.query接口的list方法返回所有数据
        List<Customer> customers = query.list();
        for (Customer customer : customers) {
            System.out.println(customer);
        }
    }
    ...
}

  运行测试单元

运行结果
运行结果


4.Transaction接口

  1、Transaction 是事务的接口

  2、常用的方法
    1)、commit() – 提交事务
    2)、rollback() – 回滚事务

  3、特点
    1)、Hibernate 框架默认情况下事务不自动提交.需要手动提交事务。
    2)、如果没有开启事务,那么每个 Session 的操作,都相当于一个独立的事务。


事务代码编写

  /Hibernate5_d01_c05/src/hibernate/test/TestCustomer4.java
程序代码如下:

package hibernate.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import hibernate.domain.Customer;
import hibernate.util.HibernateUtils;

public class TestCustomer4 {
    /**
     * 事务操作,保存数据
     */
    @Test
    public void save(){
        Session session = null;
        Transaction tr = null;
        //1.在 try...catch 块中使用事务,开发中在业务层使用
        try {
            //2.获取 session
            session = HibernateUtils.openSession();
            //3.开启事务
            tr = session.beginTransaction();
            //4.新建 customer 对象
            Customer c = new Customer();
            c.setCust_name("老刘"); 
            session.save(c);
            //5.提交事务
            tr.commit();
        } catch (Exception e) {
            //6.回滚事务
            tr.rollback();
        }finally {
            //7.释放资源
            session.close();
        }
    }
}

运行效果
运行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值