Hibernate常用API
ps : 关于api的介绍
一 : Configuration(加载配置)
// 加载src下的hibernate.cfg.xmlConfiguration 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_customerSQLQuery 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之外使用。(注意)
// 获取CriteriaCriteria criteria = session.createCriteria(Customer.class);
// 查询所有
List<Customer> list=criteria.list();
System.out.println(list);
- 分页查询
// 获取CriteriaCriteria 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