属性的映射 <class name="User" table="T_USER"> <id name="id" > <generator class="increment" /> </id> <property name="username" update="false" type="string" length="50" unique="true" not-null="true"/> <!--不允许更新,相似的还有insert="false"--> <property name="user" column="_user"/> <!--类中的字段是user,数据库表中的列名是_user--> <property name="sex" /> <property name="birthday" /> <property name="salary" /> <property name="age" /> <property name="story" type="text"/> <!--特殊数据类型。数据量比较大的时候用--> <property name="music" type="binary" length="90000000"/> <!--能存80MB字节的数组 类中定义为 (需要commons-io-2.0.1.jar) private byte[] music = null; user.setMusic(FileUtils.readFileToByteArray(new File("c:/1.mp3"))); 需要在Mysql中的my-large.ini中找到max_allowed_packet配置,copy到my.ini下,max_allowed_packet=90M,重启Mysql。 取出来 FileUtils.writeByteArrayToFile(new File("s:/1.mp3"),user.getMusic()); --> </class>
List和Iterator的区别
transaction = session.beginTransaction();
Query query = session.createQuery("from com.umgsai.hibernate.entity.User");
List<User> users = query.list();
for(User user : users){
System.out.println(user.getId()+":"+user.getUsername());
}
Iterator<User> iterator = query.iterator();
while(iterator.hasNext()){
User user = iterator.next();
System.out.println(user.getId()+":"+user.getUsername());
}
transaction.commit();
List不能利用缓存,每次都要从数据库中select
Iterator可以利用缓存,值在第一次查询时从数据库中select,以后只根据id从缓存中取数据,再进行迭代。
最好的方法是先利用List查数据,再用Iterator迭代。
HQL查询基本规则及查询方法
Transaction transaction = session.beginTransaction();
String hql = "from com.umgsai.hibernate.entity.User";
String hql = "from User";
String hql = "from User as U";//User区分大小写
String hql = "select u from User u";
String hql = "select u from User u where u.username is null";//空值判断
String hql = "select u from User u where u.id in (1,2,3,4,5,6,7)";//集合查询,硬编码
String hql = "select u from User u where u.id > 10 and u.id < 20";//硬编码
String hql = "select u from User u where u.id in (:ids)";//集合参数
List<Integer> ids = new ArrayList<Integer>();
ids.add(1);
ids.add(2);
ids.add(3);
ids.add(4);
ids.add(5);
ids.add(6);
ids.add(7);
Query query = session.createQuery(hql);
query.setParameterList("ids";ids);//参数集合
List<User> users = query.list();
for(User u :users){
System.out.println(u.getId()+":"+u.getUsername);
}
transaction.commit();
//条件查询类似于SQL
int min = 10;
int max = 20;
String hql = "select u from User u where u.id > + min + and u.id < + max ";
//*匿名参数查询
String hql = "select u from User u where u.id > ? and u.id < ?";
Query query = session.createQuery(hql);
query.setParameter(0,min);
query.setParameter(1,max);
/*/
//*命名参数查询
String hql = "select u from User u where u.id > :min and u.id < :max";
Query query = session.createQuery(hql);
query.setParameter("min",min);
query.setParameter("max",max);
//*/
Query query = session.create Query(hql);
List<User>users = query.list();
for(User u : users){
System.out.println(u.getUsername());
}
//*聚合函数
String hql = "select count(*) from user";
//...
Long t = (Long)query.uniqueResult();
System,out,prinltn(t);
//*/
///*uniqueResult的用法
String hql = "select u from User u where u.id = 1";
//...
User u = (User)query.uniqueResult();
//只返回一行一列
//*/
//*查询多个列
String hql = "select u.username,u.password from User u";
//...
List<Object[]> objects = query.list();
for(Object[] object : objects){
System.out.println(object[0]+":"+object[1]);
}
//*/
//*HQL中的单行函数
transaction = session.beginTransaction();
String hql = "select upper(u.username) ,u.sex from User u";
String hql = "select substring(u.username,2,3) ,u.sex from User u";//从第2个字符开始取3个
String hql = "select length(u.username),u.sex from User u";//取字符串长度
String hql = "select locate('s',u.username),u.sex from User u";//搜索s在username的什么位置
String hql = "select bit_length(u.username),u.sex from User u";//username占的位数
String hql = "select current_date(),u.sex from User u";//取当前时间。current_time(),current_timestamp()
String hql = "select year(current_date()),u.sex from User u";//取时间的特定部分,second,minute,hour,day,month,year,date
String hql = "select cast(current_date() as string),u.sex from User u";//转换类型
String hql = "select cast('2013-7-1' as date),u.sex from User u";
String hql = "select cast(123456 as string),u.sex from User u";
String hql = "select cast('2013' as int),u.sex from User u";
Query query = session.createQuery(hql);//HQL璇彞
List<Object[]> objects = query.list();
for (Object[] object : objects) {
System.out.println(object[0]);//+" // "+object[1]);
}
//*/
/*Hibernate分页查询及排序*/
String hql = "select u from User u";
String hql = "select u from User u order by u.id";//排序
Query query = session.createQuery(hql);
query.setFirstResult(40);//从第40条开始
query.setMaxResults(10);//每次取10条
List<User> objects = quert.list();
fro(User object : objects){
System.out.println(object.getId() +":"+ object.getUsername());
}
transaction.commit();
Hiberbate 原生SQL语句(无法利用缓存)
String sql = "select * from t_user";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(User.class);//把查询到的每一行封装成指定实体对象
List<User> list = query.list();
for(User user : list){
System.out.println(user.getUername+user.getPassword);
}
或者不封装成指定实体对象
List<Object> list = query.list();
for(Object[] obj : list){
System.out.println(obj[0] +":" + obj[1]);
}
Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为内置缓存和外置缓存。
Session缓存和SessionFactory缓存都是内置缓存,由session缓存,不能被卸载,也被称为Hibernate的第一级缓存。
session缓存里面是普通属性
SessionFactory缓存里面是实体对象
外置缓存(可以配置,可以取消),包括二级缓存(里面是实体对象,session关闭后实体还在)和查询缓存,可以和session交互。
查询缓存(普通属性、实体对象,实体id)
get和load方法查询的时候可以利用一级缓存,如果缓存中已经存在要查询的对象,则可以不查询数据库,直接从缓存中取数据。session关闭后缓存里面的数据会被清空。
list不能利用缓存,不能从缓存中取数据。get和load可以从list的缓存中取数据。
iterate可以利用缓存,可以从缓存中取数据。但是iterate会先查询出对象id,再根据id查询出对象。
推荐先用list查询出数据,然后用iterate从缓存中取数据。
可以通过配置查询缓存来用list从缓存中取数据,
<property name="cache.use_query_cache">true</property> <!--开启查询缓存-->
list查询时调用setCacheable(true)指定query接口使用查询缓存,跨session,session关闭后还可以从缓存中取数据。要求查询参数完全一样。
List<User> list = session.createQuery("from User").setCacheable(true).list();
本文出自 “优赛工作室” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/1236073