您的位置:首页 > 其它

Hibernate基本知识

2017-12-20 19:39 253 查看
1.实体类创建的注意事项

1.持久化类提供无参数构造

2.成员变量私有,提供共有get/set方法访问,需提供属性

3.持久化类中的属性,应尽量使用包装类型

4.持久化类需提供OID与数据中的主键列对应

5.不要用final修饰class(hibernate使用cglib代理生成代理对象,代理对象是继承被代理对象,如果被final修饰,将无法生存代理)
2.主键类型

自然主键:表的业务列中有某业务列符合必须有并不重复的特征时,该列可以作为主键使用

代理主键:表的业务列中没有某业务列符合必须有并且不重复的特征时该列作为主键使用
3.主键生成策略(*,hbm.xml)

<id name="cust_id" column="cust_id">
<!-- 主键生成策略 ,就是每条记录录入时,主键的生成规则,identity主键自增
increment:主键自增有hibernate来维护每次插入前会先查询表中id最大值,+1作为新主键值
sequence:oracie中的主键生成策略
hilo:高低位算法主键自增由hibernate来维护
native:hilo+sequence+identity自动三选一策略
uuid:产生随机字符串作为主键,主键类型必须为string
assigned:自然主键生成策略,hibernate不会管理主键由开发人员自己录入
-->
<generator class="native"></generator>
</id>
4.hibernate中的对象状态

瞬时状态:没有id,没有与session关联

持久化状态:有id与session有关联

托管状态:有id没有与session关联
@Test

//保存客户

//持久化状态特点:持久化状态对象的任何变化都会自动同步到数据库中
public void fun3(){
//获得session
Session session=HibernateUtils.openSession();
//控制事务
Transaction tx=session.beginTransaction();
//执行操作
Customer c=session.get(Customer.class,1l);//持久化状态对象
c.setCust_name("weiyuan");
//提交事务关闭资源
tx.commit();
session.close();//托管状态有id,没关联

}
5.hibernate一级缓存

缓存:提高效率
6.hibernate中的事务

事务:原子性,一致性,隔离性,持久性

事务并发问题:1.脏读,2.不可重复读,3.虚读

事务的隔离级别:读未提交-123,读已提交-23,可重复读-3,串行化-没有问题效率太低

如何在hibernate中指定隔离级别?(hibernate.cfg.xml)

<!-- 0001 1
读未提交
0010 2
读已提交
0100 4
可重复读
1000 8
串行化 -->
<property name="hibernate.connection.isolation">4</property>

在项目中如何管理事务?

业务开始之前打开事务,业务执行之后提交事务,执行过程中出现异常回滚事务

在dao层操作数据库需要用到session对象,在service控制事务也是使用session对象完成,我们要确保dao层和service层使用的是同一个session对象

在hibernate之后确保使用同一个session的问题hibernate已经帮我们解决了,开发人员只需要调用sf.getCurrentSession()方法即可获得session对象
注意:1调用getCurrentSession方法必须配合主配置中的配置(hibernate.cfg.xml)

<!-- 指定session与当前线程绑定 -->
<property name="hibernate.current_session_context_class">thread</property>

2.通过getCurrentSession方法获得的session对象当事务提交时,session会自动关闭不要手动调用close关闭
7.hibernate中 的批量查询
HQL查询-hibernate Query Language(hibernate独家查询语言)属于面向对象的查询语言
@Test

//HQL语句中,不可能出现任何数据库相关的信息的

public void fun7(){
Session session=HibernateUtils.openSession();
Transaction tx=session.beginTransaction();
//执行操作
//书写HQL语句
//String hql="from cn.itcast.domain.Customer";
String hql="from Customer where cust_id=1";//查询所有Customer对象
//根据HQL语句创建查询对象
Query query=session.createQuery(hql);
//根据查询对象获得查询结果
//List<Customer>list= query.list();
//System.out.println(list);
Customer c=(Customer)query.uniqueResult();
System.out.println(c);
//query.uniqueResult();
//提交事务关闭资源
tx.commit();
session.close();

}

@Test

//问号占位符

public void fun8(){
Session session=HibernateUtils.openSession();
Transaction tx=session.beginTransaction();
//书写HQL语句
String hql="from Customer where cust_id=?";
//根据HQL语句创建查询对象
Query query=session.createQuery(hql);
//query.setLong(0, 1l);
query.setParameter(0, 1l);
//根据查询对象获得查询结果
Customer c=(Customer)query.uniqueResult();
System.out.println(c);
tx.commit();
session.close();

}

//分页查询

String hql="from Customer";

Query query=session.createQuery(hql);

//设置分页信息limit ?,?

query.setFirstResult(1);

query.setMaxResult(1);

//根据查询对象获得查询结果

List<Customer>list=query.list();
Criteria查询:无语句

基本查询:

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

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

System.out.println(list);

提交查询:

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

criteria.add(Restrictions.eq("cust_id",1l);

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

System.out.println(c);

分页查询:

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

criteria.setFirstResult(1);

criteria.setMaxResult(2);

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

System.out.println(list);

设置查询的总记录数

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

criteria.setProjection(Projections.rowCount());

Long count=(Long)criteria.uniqueResult();

System.out.println(count);
原生SQL查询

基本查询:返回数组list

String sql="select *from cst_customer";

SQLQuery query=session.createSQLQuery(sql);

List<Object[]>list=query.list();

for(Object[] objs:list){
System.out.println(Arrays.toString(objs));

}

返回对象List

String sql="select *from cst_customer";

SQLQuery query=session.createSQLQuery(sql);

//指定将结果集封装到那个对象中

query.addEntity(Customer.class);

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

System.out.println(list);

条件查询:

String sql="select *from cst_customer where cust_id=?";

SQLQuery query=session.createSQLQuery(sql);

query.setParameter(0,1l);

query.addEntity(Customer.class);

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

System,out.println(list);

分页查询

String sql="select *from cst_customer limit ?,?";

SQLQuery query=session.createSQLQuery(sql);

query.setParameter(0,0);

query.setParameter(1,1);

query.addEntity(Customer.class);

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

System.out.println(list);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: