Hibernate常用API

编程

ps : 关于api的介绍

一 : Configuration(加载配置)

// 加载src下的hibernate.cfg.xml

Configuration config = new Configuration().configure(); `

// 主要加载的src下的hibernate.properties

Configuration config = new Configuration();

// 加载指定的名称的配置文件

Configuration config=new Configuration().configure(核心配置文件名称);

二 : sessionFactory(数据源代理)

// 1.创建Configuration来加载配置文件()

Configuration config = new Configuration().configure();

// 2.得到SessionFactory

SessionFactory sessionFactory = config.buildSessionFactory();

  • SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。
  • SessionFactory不是轻量级的, 不要频繁创建关闭它, 很浪费性能的。在一个项目中有一个SessionFactory就可以,通过SessionFactory来获取Session进行操作, 当需要操作多个数据库时, 可以为每个数据库指定一个。
  • 问题:怎样可以保证在一个项目中所使用的SessionFactory是同一个呢?

public class HibernateUtils {

private static Configuration config;

private static SessionFactory sessionFactory;

static{

config=new Configuration().configure();

sessionFactory=config.buildSessionFactory();

}

public static Session openSession(){

return sessionFactory.openSession();

}

}

  • SessionFactory内部维护了一个连接池,可以替换成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>

三 : Session(操作持久化对象对象)

  • Session接口负责执行被持久化对象的CRUD操作,(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句),需要注意的是Session对象是非线程安全的。
  • 那么如何解决session的安全问题? -----> 在方法内部来使用Session就可以。

// 相当于直接通过SessionFactory创建一个新的Session,使用完成后要手动调用close来关闭。

SessionFactory.openSession();

// 获取一个与线程绑定的Session,当我们提交或事务回滚后会自动关闭。

SessionFactory.getCurrentSession();

  • Session常用的方法:

    • save() : 保存对象
    • update() : 修改操作
    • delete() : 删除
    • get()/load() : 根据id进行查询
    • saveOrUpdate() : 执行save或update操作
    • createQuery() : 获取一个Query对象
    • CreateSQLQUery():获取一个可以操作sql的SQLQuery对象
    • createCriteria():获取一个Criteria它可以完成条件查询

四 : Transaction

  • Transaction接口主要用于管理事务,它是hibernate的事务接口,对底层的事务进行了封装。
  • 作用:进行事务操作。

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

  • 获取Transaction : Session.beginTransaction();
  • 如果在程序中没有开启事务,仍然会有事务,session的每一个操作就会开启一个事务(默认不自动提交)。

<!-- 用于设置事务提交方式 -->

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

五 : Query

// 执行hql语句.

Query query = Session.createQuery(hql);

// 执行sql语句

SQLQUery sqlQuery = Session.createSQLQuery(sql);

  • SQLQuery是Query的子类

(一) 执行HQL---Query

  • 查询所有操作

// 使用hql完成查询操作

Query query = session.createQuery("from Customer");

List<Customer> list = query.list();

System.out.println(list);

  • 分页查询

Query query = session.createQuery("from Customer");

query.setFirstResult(10);

query.setMaxResults(10);

List<Customer> list = query.list();

System.out.println(list);

  • 查询指定列信息

//查询指定列信息

Query query=session.createQuery("select new Customer(name,address) from Customer");

List<Customer> list=query.list();

System.out.println(list);

  • 条件查询where

// 无名称参数,按索引进行赋值

Query query=session.createQuery("from Customer where name=?");

// 要对参数按索引进行赋值

query.setParameter(0, "姓名1");

List<Customer> list = query.list();

System.out.println(list);

// 有名称参数,按名称参数指定赋值

// 名称参数格式---> ":"+自定义参数名

Query query = session.createQuery("from Customer where name=:myname");

query.setParameter("myname", "姓名1");

List<Customer> list = query.list();

System.out.println(list);

  • 唯一结果

Query query=session.createQuery("from Customer where name=?");

query.setParameter(0, "姓名1");

// 如果能保证结果就是唯一的,那么可以使用uniaueResult()

Customer c = (Customer) query.uniqueResult();

System.out.println(c);

(二) 执行本地SQL---SQLQuery

  • 使用addEntity(Class T.class)方法来将结果封装到指定的对象中,如果不封装,得到的是List<Object>
  • 如果sql中有参数,我们使用setParameter(int index, String param)方法完成参数传递。
  • 如果结果就是一个,可以使用uniqueResult()来得到一个单独对象。

// 执行select * from t_customer

SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");

// 想要将结果封装到Customer对象中

sqlQuery.addEntity(Customer.class);

List<Customer> list=sqlQuery.list();

System.out.println(list);

  • 条件查询

// 执行select * from t_customer where name=?

SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer where name=?");

// 对参数进行赋值

sqlQuery.setParameter(0, "姓名1");

// 将想要的结果封装到Customer对象中

sqlQuery.addEntity(Customer.class);

// 返回唯一结果

Customer c = (Customer) sqlQuery.uniqueResult();

System.out.println(c);

(三) Criteria

Criteria criteria=Session.createCriteria();

  • Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。
  • Criteria接口也是轻量级的,它不能在Session之外使用。(注意)

// 获取Criteria

Criteria criteria = session.createCriteria(Customer.class);

// 查询所有

List<Customer> list=criteria.list();

System.out.println(list);

  • 分页查询

// 获取Criteria

Criteria criteria = session.createCriteria(Customer.class);

// 分页查询

criteria.setFirstResult(2);

criteria.setMaxResults(2);

List<Customer> list=criteria.list();

System.out.println(list);

  • 多条件AND

// 多条件查询

//1.查询name="姓名1"

criteria.add(Restrictions.eq("name", "姓名1"));//where name="姓名1"

//2.查询address="上海"

criteria.add(Restrictions.eq("address", "上海"));

List<Customer> list=criteria.list();

System.out.println(list);

  • 多条件OR

// 查询name="姓名1" 或者 address="上海"

criteria.add(Restrictions.or(Restrictions.eq("name", "姓名1"),

Restrictions.eq("address", "上海")));

List<Customer> list = criteria.list();

System.out.println(list);

以上是 Hibernate常用API 的全部内容, 来源链接: utcz.com/z/511329.html

回到顶部