一,Hibernate框架的主要工作:
- 提高数据访问层的编码效率,对JDBC进行了轻量级的对象封装;
- 将数据库的关系型数据,映射到普通的java类中,通过操作对象来操作数据库的数据,即ORM(Object Relational Mapping)对象-关系型数据映射。
二,Hibernate使用前的准备过程:
- 编写Hibernate的配置文件(可自动生成):hibernate.cfg.xml,主要是配置SessionFactory。
<hibernate-configuration>
<!-- 配置SessionFactory -->
<session-factory>
<!-- 1,配置数据源 -->
<!-- 1.1,配置数据库的驱动l类 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 1.2,配置数据库的url地址 -->
<property name="connection.url">
jdbc:mysql://localhost:3306/cnconsum
</property>
<!-- 1.3,配置数据库的用户名 -->
<property name="connection.username">root</property>
<!-- 1.4,配置数据库的密码 -->
<property name="connection.password">naruto68</property>
<!-- 配置数据库的类型 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否显示sql语句 -->
<property name="show_sql">true</property>
<!-- 配置映射表 -->
<mapping resource="com/hibernate/entity/CnUser.hbm.xml"/>
...
</session-factory>
</hibernate-configuration>
- 编写回话工厂类HibernateSessionFactory:主要用于根据配置文件创建SessionFactory,并利用SessionFactory获取Session。
//1,通过Configuration对象解析hibernate.cfg.xml的内容,并创建SessionFactory对象。
configuration.configure();
......省略注册机代码
sessionFactory = configuration.buildSessionFactory(serviceRegistry);
//2,通过sessionFactory的openSession()方法,获取session对象;
......省略处理每个线程维护自己的session的代码
session = sessionFactory.openSession();
- 创建实体类(对应数据库中的一张表),该实体类的属性值,对应表的列属性,并提供getXxx和setXxx方法。这些可自动生成。
public class CnUser
{
private String uuid;
private String phone;
......省略其它属性
public String getUuid()
{
return this.uuid;
}
public void setUuid(String uuid)
{
this.uuid = uuid;
}
......省略其它方法
}
- 编写映射文件(实体类和关系表的真正映射关系),可自动生成。
<hibernate-mapping>
<!-- 配置一个实体类的映射关系 -->
<class name="实体类的具体位置" table="对应的表明" catalog="对应的数据库">
<!-- 映射主键(也可以是组合主键) -->
<id name="实体类中的属性名" type="数据类型">
<!-- 对应表中的主键 -->
<column name="表中的主键名"/>
<!-- 主键生成策略 -->
<generator class="assigned(默认)"/>
</id>
<!-- 映射其它属性 -->
<property name="实体类中的属性名" type="数据类型">
<!-- 对应表中的属性 -->
<column name="表中的列属性" length="字段长度"/>
</property>
</class>
</hibernate-mapping>
- 通过Annotation注解的方式,进行映射配置;
三,使用Hibernate操作数据库
操作数据的代码框架结构
//1,获得session实例
Session session = HibernateSessionFactory.getSession();
//2,开启事务
Transaction tx = null;
try
{
tx = session.beginTransaction();
//3,通过session操作持久化对象
session.save(user);
//4,提交事务
tx.commit();
}
catch(Exception e)
{
if(tx != null)
{
//4,事务回滚
tx.rollback();
}
}
finally
{
//5,关闭session
HibernateSessionFactory.closeSession();
}
- 加载数据(只能根据主键加载)
session.get(CnUser.class,id); //记录不存在,返回null
session.load(CnUser.class,id); //记录必须存在,否则返回异常
- 添加数据
session.save(user); //重复提交会报异常
session.saveOrUpdate(user); //重复提交,第二次做为更新
- 删除数据
session.delete(user); //先通过get或load加载到user,然后删除
- 修改数据
session.update(user);//先通过get或load加载到user,然后修改
四,使用hibernate检索数据
- 使用HQL(Hibernate Query Language),HQL对应于数据库中的sql查询;
使用HQL进行查询的代码框架
//1,获取session实例
Session session = HibernateSessionFactory.getSession();
//2,声明hql查询语句
String hql = "from CnUser user";
//3,通过session和hql创建sql查询
Query query = session.createQuery(hql);
/*4,对query可以设置查询的限制,包括:
4.1,动态设置条件;
4.2,sql查询的对应查询:分组,排序等;
4.3,聚集函数;
4.4,分页查询;
4.5,连接查询
*/
//5,获取查询结果
List list = query.list();
- 使用QBC(Query By Criteria)
因为HQL的虽然比JDBC方式的查询有进步,但是还是需要编写繁琐的HQL语句,Criteria采用面向对象的方式,封装查询条件,使得查询代码编写更加方便;代码结构如下:
//1,获取Session实例;
Session session = HibernateSessionFactory.getSession();
//2,利用Session创建Criteria对象;
Criteria criteria = session.createCriteria(CnUser.class);
/*3,给Criteria对象设置查询条件Critetion接口,实现类包括:
Example,SimpleExpression和Junction,都由Restrictions工具类来创建;*/
//3.1,直接使用Restrictions工具类来设置条件
criteria.add(Restrictions.like("userLevel", "ORD", MatchMode.ANYWHERE));
//3.2,使用Example类的实例来设置条件
//QBE查询
CnUser condition = new CnUser();
condition.setUserLevel("ORD");
condition.setName("liu");
Example example = Example.create(condition);
example.enableLike(MatchMode.ANYWHERE);
example.ignoreCase();
criteria.add(example);
//4,使用Order设置排序方式
criteria.addOrder(Order.desc);
//5,使用Projection进行分组和统计
//分组
ProjectionList pList = Projections.projectionList();
//分组依据
pList.add(Projections.groupProperty("sex"));
//统计分组数
pList.add(Projections.rowCount());
criteria.setProjection(pList);
网友评论