hinernate 杂文

1.hiberante,将部分查询字段值封装成自定义的bean
List<MyBean> users = this.hibernateTemplate.find("select new MyBean(usename, password) from JBAUser u where u.username='" + jbaUser.getUsername() + "'");

for(JBAUser user : users) {
System.out.println(user.getUsername());
System.out.println(user.getPassword());
}
注:把选取的部分属性值用自定义的new MyBean包含起来
2.hibernate的批量更新
效率最低的一种方式
session.find("from Customer c where c.age>0")执行的结果是想符合的数据都查询到内存中。然后对查询结果再进行遍历再修改。
这种方式第一消耗内存,第二参数大量的更新sql语句,浪费资源。
改进方式
session.flush();
session.evict(customer);
flush方法会马上让hibernate根据对象的状态马上同步数据库。从而立即执行update语句
evict方法会让session把该对象从缓存中清除掉
虽然上面对内存进行了及时释放进行了一些处理,但是还是要进行大量的更新操作。
所以可以通过JDBC的批处理的方式进行更新,即使用
tx = session.beginTransaction();
Connection con=session.connection(); //该方法过期,可以使用SessionFactoryUtils的getDataSource方法
PreparedStatement stmt=con.prepareStatement("update语句");//直接通过sql语句更新了
stmt.executeUpdate();
tx.commit();
当然也可以调用存储过程
create or replace procedure batchUpdateObject(p_age in number) as
begin
更新语句;
end;
调用存储过程
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call 存储过程名称(?)}";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();

session的各自update方法重载一次就只能更新一个对象。
session的delete方法可以传入hql语句,但是delete方法并没有直接执行delete的sql语句。而是先将delete的对象加载到内存然后再一条一条delete的。
如它会先执行:
select * from CUSTOMERS where AGE>0;
接下来执行一万条delete语句,逐个删除Customer对象:
delete from CUSTOMERS where ID=i;
delete from CUSTOMERS where ID=j;
……
delete from CUSTOMERS where ID=k;
但是hibernate的Query对批量更新和批量删除提供了支持
批量更新:
1.Session session = sessionFactory.openSession();
2.Transaction tx = session.beginTransaction();
3.String hqlUpdate = "update Customer set name = :newName where name = :oldName";
4.int updatedEntities = s.createQuery( hqlUpdate )
5..setString( "newName", newName )
6..setString( "oldName", oldName )
7..executeUpdate();
8.tx.commit();
9.session.close();
批量删除:
1.Session session = sessionFactory.openSession();
2.Transaction tx = session.beginTransaction();
3.String hqlDelete = "delete Customer where name = :oldName";
4.int deletedEntities = s.createQuery( hqlDelete )
5..setString( "oldName", oldName )
6..executeUpdate();
7.tx.commit();
8.session.close();

3.Hibernate 3中引入了用于批量更新或者删除数据的HQL语句
HQL语句可以处理批量更新或是删除,使用HQL要通过Query对象。
如:
String HQL="delete User";
Query query=session.createQuery(HQL);
int size=query.executeUpdate();
这种使用方式与直接使用JDBC性能相差无几。
如果使用JDBC进行批处理如插入,修改,删除无疑具有最高的性能。
因为省去了
● HQL语句到SQL语句的转换。
● Java对象的初始化。
● Java对象的缓存处理。
但是直接使用JDBC一个最重要的问题就是要处理缓存中的Java对象。因为通过这种底层方式对数据的修改将不能通知缓存去进行相应的更新操作,以保证缓存中的对象与数据库中的数据是一致的。
4.hibernate中SQL语句的生产方式有2种,一种是编程人员自动编写的SQL语句。而是使用关联对象自动生成的SQL语句,如criteria。
5.对象关联时使用的抓取策略是非常重要的。
6.Hibernate执行查询的基本方法:
执行单个基本查询使用的方法get和load
他们的基本区别就是在二级缓存的使用上,load会去查询二级缓存,而get在1级缓存查找不到数据时就会直接去数据库进行查询了。
如果使用了二级缓存,则使用load方法。
查询多个对象使用list()方法和iterator()方法
区别是list()方法在运行时直接执行查询结果所需要的查询语句,而iterator()方法会先查找持久化对象的id,然后再根据id查询需要的对象。因此list()方法只会执行一条SQL语句,而iterator()可能需要执行N+1条语句(具体情况要看缓存)。
7.缓存的使用
list()方法只能使用二级缓存中的查询缓存。而无法使用二级缓存的单个对象缓存(但是会把查询出来的对象放入二级缓存中)。除非执行相同的查询操作,否则无法运用缓存机制来提高效率。
 iterator()方法则可以充分利用二级缓存,在根据ID检索对象的时候会首先到缓存中查找,只有在找不到的情况下才会执行相应的查询语句。所以,缓存中对象的存在与否会影响到SQL语句的执行数量。
对结果处理的使用不同
list()方法会一次性获取所有的查询结果,然后根据结果进行对象的初始化,如果数据量特别大可能会照成内存溢出的情况。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。因此在访问中可以控制缓存中对象的数量,以避免占用过多缓存,导致内存溢出情况的发生。使用iterator()方法的另外一个好处是,如果只需要结果集中的部分记录,那么没有被用到的结果对象根本不会被初始化。所以,对结果集的访问情况也是调用iterator()方法时执行数据库SQL语句多少的一个因素。
8.hibernate的clear清除全部session缓存数据。evict(Object)清除指定的缓存对象
9.query.setCacheable(true);//激活查询缓存
10.createQuery和createSQLQuery()需要注意的问题
使用createSQLQuery()会去数据库查询数据。若是想要直接出对应的pojo对象可以使用
session.createSQLQuery().addEntity(Product.class);的方式,
createSQLQuery不会去利用二级缓存
如果不添加addEntity(Product.class)会是返回object[]的数组。即对应返回字段的值的数组

createQuery若是设置.setCacheable(true)表示使用二级缓存
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值