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)表示使用二级缓存
在IT领域,尤其是地理信息系统(GIS)中,坐标转换是一项关键技术。本文将深入探讨百度坐标系、火星坐标系和WGS84坐标系之间的相互转换,并介绍如何使用相关工具进行批量转换。 首先,我们需要了解这三种坐标系的基本概念。WGS84坐标系,即“World Geodetic System 1984”,是一种全球通用的地球坐标系统,广泛应用于GPS定位和地图服务。它以地球椭球模型为基础,以地球质心为原点,是国际航空和航海的主要参考坐标系。百度坐标系(BD-09)是百度地图使用的坐标系。为了保护隐私和安全,百度对WGS84坐标进行了偏移处理,导致其与WGS84坐标存在差异。火星坐标系(GCJ-02)是中国国家测绘局采用的坐标系,同样对WGS84坐标进行了加密处理,以防止未经授权的精确位置获取。 坐标转换的目的是确保不同坐标系下的地理位置数据能够准确对应。在GIS应用中,通常通过特定的算法实现转换,如双线性内插法或四参数转换法。一些“坐标转换小工具”可以批量转换百度坐标、火星坐标与WGS84坐标。这些工具可能包含样本文件(如org_xy_格式参考.csv),用于提供原始坐标数据,其中包含需要转换的经纬度信息。此外,工具通常会附带使用指南(如重要说明用前必读.txt和readme.txt),说明输入数据格式、转换步骤及可能的精度问题等。x86和x64目录则可能包含适用于32位和64位操作系统的软件或库文件。 在使用这些工具时,用户需要注意以下几点:确保输入的坐标数据准确无误,包括经纬度顺序和浮点数精度;按照工具要求正确组织数据,遵循读写规则;注意转换精度,不同的转换方法可能会产生微小误差;在批量转换时,检查每个坐标是否成功转换,避免个别错误数据影响整体结果。 坐标转换是GIS领域的基础操作,对于地图服务、导航系统和地理数据分析等至关重要。理解不同坐标系的特点和转换方法,有助于我们更好地处
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值