本帖最后由 htb52110 于 2018-1-15 19:13 编辑
4、Hibernate的常用API介绍
4.1、Configuration
它主要是用于加载hibernate配置.
Configuration config=new Configuration().config();
主要加载src下的hibernate.cfg.xml
Configuration config=new Configuration();
主要加载的src下的hibernate.properties
Configuration config=new Configuration().config(核心配置文件名称);
加载指定的名称的配置文件
4.2、sessionFactory
首先SessionFactory它的获取是通过Configuration得到。
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
通过SessionFactory可以得到Session
是从连接池中获取一个连接。
获取一个与线程绑定的Session.
SessionFactory它不是轻量级的,不要频繁创建关闭它。在一个项目中有一个SessionFactory就可以,通过SessionFactory来获取Session进行操作。
注意:为了保证项目中使用同一个sessionFactory,可以创建一个工具类
SessionFactory内部还维护了一个连接池,使用c3p0连接池,
我们要导入c3p0的相关jar包
在hibernate/lib/options下有关于c3p0连接池jar包
在hibernate.cfg.xml文件中配置c3p0连接
可以查看etc/hibernate.properties中关于c3p0的配置
4.3、Session
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。
注意为了解决Session的安全问题,只需要在方法内部使用Session即可。
4.3.1、获取Session
SessionFactory.openSession() ;
相当于直接通过SessionFactory创建一个新的Session,使用完成后要手动调用close来关闭。
SessionFactory.getCurrentSession();
获取一个与线程绑定的Session,当我们提交或事务回滚后会自动关闭。
4.3.2、Session的方法
save 保存对象
update 修改操作
delete 删除
get/load 根据id进行查询
savenOrUpdate 执行save或update操作
createQuery() 获取一个Query对象
CreateSQLQUery() 获取一个可以操作sql的SQLQuery对象
createCriteria() 获取一个Criteria它可以完成条件查询
4.4、Transaction
Transaction接口主要用于管理事务,它是hibernate的事务接口,对底层的事务进行了封装。使用它可以进行事务操作。
commit 事务提交
rollback 事务回滚
开启事务
Session.beginTransaction();
获取事务
Session.getTransaction();
注意:
session的每一个操作就会开启一个事务。默认情况下是不会自动提交事务的。可以在配置文件中设置
默认不自动提交事务
自动提交事务
4.5、Query
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。
通过Query可以执行hql语句.
Query query=Session.createQuery(hql);
下面这个可以执行sql语句
SQLQUery sqlQuery=Session.createSQLQuery(sql);
SQLQuery是Query的子。
扩展:
Query上有list()与iterate()方法,两者的差别在于list()方法在读取数据时,并不会利用到缓存,而是直接向数据库查询,而iterate ()则将读取到的数据写到缓存,并于读取时再次利用。
4.5.1、查询所有操作【使用HQL】
4.5.2、分页查询
4.5.3、查询指定列信息
注意:
Select name ,address from Customer; 得到的是List<Object[]>结果要想得到List<Customer>结果
在Customer类中生成以name,address为参数的构造,注意,无参数构造也要有。
Select new Customer(name,address) from Customer;
4.5.4、条件查询【可以使用where关键字】
无名称参数 from Customer where name=?
对其进行赋值 query.setParameter(0,”张三”)
有名称参数 from Customer where name=:myname;
对其进行赋值 query.setParameter(“myname”,”李四”);
如果查询结果可以保证就是唯一 的,我们可以使用
query. uniqueResult()来得到一个单独对象.
4.5.5、SQLQuery
执行本地sql
SQLQuery sqlQuery=session.createSqlQuery(String sql);
使用addEntity方法来将结果封装到指定的对象中,如果不封装,得到的是List<Object>
如果sql中有参数,我们使用setParameter方法完成参数传递。
如果结果就是一个可以使用uniqueResult()来得到一个单独对象。
4.6、Criteria
Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。
使用Criteria要先获取到Criteria
Criteria criteria=Session.createCriteria()
查询所有操作
Session.createCriteria(实体类.class)得到一个Criteria对象,调用list查询所有
分页操作与query的方法一样
setFirstResult() setMaxResults()
条件查询
criteria.add(Restrictions.eq(“name”,”xxxx”));
criteria.add(Restrictions.or(Restricitons.eq(),Restrictions.list()…..))
使用Criteria可以更加面向对象去操作,非常适合进行多条件组合查询。
扩展:
Criteria Query常用的查询限制方法
方 法
| 说 明
| Restrictions.eq()
| equal,=
| Restrictions.allEq()
| 参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果
| Restrictions.gt()
| greater-than, >
| Restrictions.lt()
| less-than, <
| Restrictions.le()
| less-equal, <=
| Restrictions.between()
| 对应SQL的between子句
| Restrictions.like()
| 对应SQL的like子句
| Restrictions.in()
| 对应SQL的in子句
| Restrictions.and()
| and关系
| Restrictions.or()
| or关系
| Restrictions.isNull()
| 判断属性是否为空,为空返回true,否则返回false
| Restrictions.isNotNull()
| 与Restrictions.isNull()相反
| Order.asc()
| 根据传入的字段进行升序排序
| Order.desc()
| 根据传入的字段进行降序排序
| MatchMode.EXACT
| 字符串精确匹配,相当于“like 'value'”
| MatchMode.ANYWHERE
| 字符串在中间位置,相当于“like '%value%'”
| MatchMode.START
| 字符串在最前面的位置,相当于“like 'value%'”
| MatchMode.END
| 字符串在最后面的位置,相当于“like '%value'”
|
|
|