属性的映射 <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();