使用hibernate框架,就必须了解hibernate的核心接口.hibernate的核心接口有5个.分别是Configuration,SessionFactory,Session,Query和Criteria,Transaction.本文重点介绍Session接口以及Query和Criteria接口.
[b]1.·Configuration接口[/b]
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
[b]2.SessionFactory接口[/b]
SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。在一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
[b]3.Session接口[/b]
Session接口负责与数据库交流,里面包含了很多常见的sql语句.需要注意的是,hibernate的Session和web中的HttpSession是两个完全不同的概念.下面列举一些hibernate中 Session的常用方法.
返回类型 |方法名 |方法概述
Connection connection() 获得JDBC连接.
Connection close() 通过断开JDBC连接结束Session.
Criteria createCriteria(Class) 为给定的实体类创建一个新的查询实例.
Query createQuery(String) 根据字符串创建一个新的查询实例.
Query createSqlQuery(String) 根据sql语句查询.
void save(Object) 添加.
void delete(Object) 删除.
void update(Object) 修改.
List find(String) 查询.
Object get(Class,id) 根据主键查询.
Session接口的常用方法还有很多,这里不一一介绍.
[b]4.Query和Criteria接口.[/b]
Query和Criteria接口负责执行各种复杂的数据库查询,尅使用sql语句和Hql语言两种方式.
a.Criteria.Criteria提供了add(Criterion)方法来添加查询条件,Criterion可以通过 Restrictions 工具类来创建.Restrictions提供了大量的静态方法.如eq(等于),ge(大于),between等.下面写个简单的例子来说明Criteria的创建和应用.
根据用户名和密码来查询User,返回唯一结果.
b.Query.Query是查询的意思.所谓的HQl就是Hibernate Query Language.它提供了比Criteria更加丰富和灵活的查询特性.HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。同样写个例子.
根据用户的id查出相应的菜单列表.其中涉及到了角色表,菜单表以及角色和菜单的关系表.这里主要为了说明Query的创建和使用HQl查询,具体细节不作介绍.还可以直接使用sql语句查询.如下:
使用sql语句查询的时候,得到的是一个Object数组,如果是多条记录,则返回一个Object数组的List,要进行相应的类型转换.所以推荐使用HQL方式查询.
实际上HQl能做的不仅仅是查询,还包括实体的更新和删除.举个例子.要删除关系表中某个角色对应的所有菜单.
[b]5.Transaction接口[/b]
Transaction接口负责事务相关的操作。它是可选的,可发人员也可以设计编写自己的底层事务处理代码。 关于事务这里不作过多介绍.
[b]1.·Configuration接口[/b]
Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory对象。
[b]2.SessionFactory接口[/b]
SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。在一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
[b]3.Session接口[/b]
Session接口负责与数据库交流,里面包含了很多常见的sql语句.需要注意的是,hibernate的Session和web中的HttpSession是两个完全不同的概念.下面列举一些hibernate中 Session的常用方法.
返回类型 |方法名 |方法概述
Connection connection() 获得JDBC连接.
Connection close() 通过断开JDBC连接结束Session.
Criteria createCriteria(Class) 为给定的实体类创建一个新的查询实例.
Query createQuery(String) 根据字符串创建一个新的查询实例.
Query createSqlQuery(String) 根据sql语句查询.
void save(Object) 添加.
void delete(Object) 删除.
void update(Object) 修改.
List find(String) 查询.
Object get(Class,id) 根据主键查询.
Session接口的常用方法还有很多,这里不一一介绍.
[b]4.Query和Criteria接口.[/b]
Query和Criteria接口负责执行各种复杂的数据库查询,尅使用sql语句和Hql语言两种方式.
a.Criteria.Criteria提供了add(Criterion)方法来添加查询条件,Criterion可以通过 Restrictions 工具类来创建.Restrictions提供了大量的静态方法.如eq(等于),ge(大于),between等.下面写个简单的例子来说明Criteria的创建和应用.
public User getUser(String name, String password) {
Criteria c = getSession().createCriteria(User.class);
c.add(Restrictions.eq("name", name));
c.add(Restrictions.eq("password", password));
return (User) c.uniqueResult();
}
根据用户名和密码来查询User,返回唯一结果.
b.Query.Query是查询的意思.所谓的HQl就是Hibernate Query Language.它提供了比Criteria更加丰富和灵活的查询特性.HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。同样写个例子.
@SuppressWarnings("unchecked")
public List<Menu> getMenusByRole(long roleid) {
String hql = "Select m From Menu m,Role r,RoleMenu rm where r.id =rm.roleid and rm.menuid = m.id and r.id=" + roleid;
Query q = getSession().createQuery(hql);
return q.list();
}
根据用户的id查出相应的菜单列表.其中涉及到了角色表,菜单表以及角色和菜单的关系表.这里主要为了说明Query的创建和使用HQl查询,具体细节不作介绍.还可以直接使用sql语句查询.如下:
@SuppressWarnings("unchecked")
public List<Menu> getMenusByRole(long roleid) {
String sql =
"Select menu.* From menu,role,role_menu rm where role.id =rm.roleid and rm.menuid = menu.id and role.id="
+ roleid;
Query q = getSession().createSQLQuery(sql);
List<Object[]> objs = q.list();
List<Menu> menus = new ArrayList<Menu>();
for (Object[] os : objs) {
Menu menu = new Menu();
menu.setId(tranfer(os[0]));
menu.setPid(tranfer(os[1]));
menu.setPos(tranfer(os[4]));
menu.setTitle((String) os[2]);
menu.setLink((String) os[3]);
menus.add(menu);
}
return menus;
}
/**
* bigInteger 转换成long
*/
private Long tranfer(Object o) {
BigInteger bi = (BigInteger) o;
return bi.longValue();
}
使用sql语句查询的时候,得到的是一个Object数组,如果是多条记录,则返回一个Object数组的List,要进行相应的类型转换.所以推荐使用HQL方式查询.
实际上HQl能做的不仅仅是查询,还包括实体的更新和删除.举个例子.要删除关系表中某个角色对应的所有菜单.
public void delete(long roleid) {
Query query = getSession().createQuery("delete RoleMenu where roleid=" + roleid);
query.executeUpdate();
}
[b]5.Transaction接口[/b]
Transaction接口负责事务相关的操作。它是可选的,可发人员也可以设计编写自己的底层事务处理代码。 关于事务这里不作过多介绍.