Hibenate笔记(2)

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


你可能感兴趣的:(Hibernate)