Hibernate常用API

Hibernate常用API

Hibernate的核心类和接口一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration

1. Configuration

Configuration config=new Configuration(); // 主要加载的是src目录下的hibernate.properties配置文件
public class HibernateTest {

    // 测试手动加载映射配置文件
    @Test
    public void test() {
        // 1.创建Configuration来加载配置文件
        Configuration config = new Configuration().configure();


        // 手动加载映射(可以省略,因为在hibernate核心配置文件中已经配置过,也就是mapping resource里面)
        config.addResource("cn/itheima/domain/Customer.hbm.xml"); // 直接加载映射配置文件

        // 2.得到SessionFactory
        SessionFactory sessionFactory = config.buildSessionFactory();

        // 3.得到Session
        Session session = sessionFactory.openSession();
        // 开启事务
        session.beginTransaction();

        Customer c = session.get(Customer.class, 1);
        System.out.println(c);

        // 事务提交
        session.getTransaction().commit();
        // 关闭Session
        session.close();
        // 关闭SessionFactory
        sessionFactory.close();
    }
}

2. SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。

这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

首先SessionFactory它的获取是通过Configuration得到:

// 1.创建Configuration来加载配置文件
Configuration config = new Configuration().configure();
// 2.得到SessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();

SessionFactory内部还维护了一个连接池,如果我们要想使用c3p0连接池,应该怎样做昵?也即在Hibernate中如何使用c3p0连接池?

1.导入c3p0相关的jar包

2. 在hibernate.cfg.xml文件中配置c3p0连接池

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>

<!-- C3P0连接池的配置  -->
<property name="hibernate.c3p0.max_size">20</property> <!-- 最大连接数 -->
<property name="hibernate.c3p0.min_size">5</property> <!-- 最小连接数 -->
<property name="hibernate.c3p0.timeout">120</property> <!-- 超时时间 -->
<property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 空闲连接(等待)时间,以秒为单位 -->

3. Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。

通过SessionFactory获得Session的两种方式:

  • SessionFactory.openSession();:相当于直接通过SessionFactory创建一个新的Session,使用完成后要手动调用close()方法来关闭。
  • SessionFactory.getCurrentSession();:获取一个与线程绑定的Session,当我们提交事务或事务回滚后会自动关闭。

Session的常用方法

  • save()保存对象
  • update ():修改操作
  • delete():删除
  • get()/load():根据id进行查询
  • avenOrUpdate():执行save或update操作
  • createQuery():获取一个Query对象
  • CreateSQLQUery():获取一个可以操作SQL的SQLQuery对象

  • createCriteria():取一个Criteria对象,它可以完成条件查询

4. Transaction

Transaction接口主要用于管理事务,它是Hibernate的事务接口,对底层的事务进行了封装。使用它可以进行事务操作。例如:

  • 事务提交:commit()
  • 事务回滚:rollback()

问题一:如何获取一个Transaction对象昵?可通过如下代码获得:

Transaction transaction = session.beginTransaction();

问题二:如果在程序中没有开启事务,是否存在事务?存在事务,默认session的每一个操作就会开启一个事务。并且默认情况下事务是不会自动提交的。相当于在Hibernate的核心配置文件中又如下配置:

<!-- 用于设置事务提交方式,默认是不自动提交的 -->
<property name="hibernate.connection.autocommit">false</property>

如果我们将其修改为:

<property name="hibernate.connection.autocommit">true</property>

则此时事务就会自动提交。

5. Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

通过Query即可以执行hql语句:

Query query = session.createQuery("hql语句");

又可以执行本地sql语句:

SQLQuery sqlQuery = session.createSQLQuery("本地sql语句");

其中SQLQuery是Query的子类。

1 查询所有操作

使用HQL语句完成查询所有客户的操作,代码如下:

public class HibernateTest {

    // 使用hql完成查询所有操作
    @Test
    public void test() {
        Session session = HibernateUtils.openSession();
        Query query = session.createQuery("from Customer"); // from后面是类名
        List<Customer> list = query.list();
        System.out.println(list);

        session.close();
    }

}

2 分页查询

public class HibernateTest {

    // 分页查询
    // 一页显示10条,要得到第二页数据
    @Test
    public void test() {
        Session session = HibernateUtils.openSession();
        session.beginTransaction();

        // 一页显示10条,要得到第二页数据
        Query query = session.createQuery("from Customer");
        query.setFirstResult(10); // 从第几条开始,即开始位置,从0开始计数
        query.setMaxResults(10); // 本次查询结果回显的条数
        List<Customer> list = query.list();
        System.out.println(list);

        session.getTransaction().commit();
        session.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值