zoukankan      html  css  js  c++  java
  • Java知识总结-12

    hql 查询

    内连接:
    from Entity inner join [fetch] Entity.property
    忽略fetch 关键字,我们得到的结果集中,每行数据都是一个Object 数组
    fetch表名表明”右表”对象读出后立即填充到对应的“左表”对象中。
    左外连接:
    from Entity left join [fetch] Entity.property
    session.createQuery("from District d left join fetch d.streets s");
    Hibernate的右外联接语法如下
    from Entity right join [fetch] Entity.property
    from District d right join fetch d.streets s


    查询单个字段:
    也就是需要的数据只是实体对象的某个属性,HQL也可以简单的做到
    String hql =“select s.name from Street s”;
    List.get(0).getClass()
    对于实体单个属性的查询,Hibernate返回的对象都是该属性的类型

    查询多个字段:
    取了id和name的属性内容。返回的List对象中,每个条目都是一个对象数组(Object[]),每个Object数组中依次保存我们所获取的属性数据。
    经验:为了使返回的结果更加符合面向对象风格,可以通过在HQL中动态构造对象实例的方法对数据进行封装。
    可以采用如下HQL语句:
    “select new Street (id,name) from Street“
    这样返回的List对象中将保存Street对象。但必须在Street类中添加一个以id和name属性为参数的构造方法


    distinct:去重

    什么是缓存
    在磁盘上的数据放到内存中一份,我们读取的时候先从缓存中读取,没有再去磁盘上找

    Hibernate缓存作用
    为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能

    缓存分类
    一级缓存(内部缓存)Session:对象
    二级缓存:SessionFactory:对象

    一级缓存介绍:
    一级缓存又称为“Session的缓存”,它是内置的,不能被卸载 在第一级缓存中,采用的是Key-Value的MAP方式来实现的。在缓存实体对象时,对象的主关键字ID是MAP的Key,实体对象就是对象的值。所以说一级缓存是以实体对象为单位进行存储的。由session 自动管理
    ,使用同一 session 查找同一对象时,只对数据库查询一次--使用 key-value 形式存储对象, key 是 oid ,value 是对象,不能被卸载 (ehcath)


    二级缓存作用
    二级缓存又称为“SessionFactory的缓存”,由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略 默认关闭 使用第三方插件
    sessionFactory 缓存(二级缓存):
    hql 查询的 list 方法 : 只会从三级缓存中查询 不会从 1 2 级缓存中查询
    iterate 方法 会使用 1 2 缓存 ,不会使用三级缓存 先查询所有ID 用到再查询得到 类


    配置二级缓存
    1.首先导入ehcache.jar二级缓存包。
    2.然后,在 src 下添加ehcache.xml配置,
    3.同时,在hibernate.cfg.xml中启用二级缓存
    <property name="hibernate.cache.use_second_level_cache"> true</property>
    <property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider</property>。
    4.:指定使用二级缓存缓存哪种类型的对象,在hbm.xml中添加<cache region="sampleCache1" usage="read-only"/>

    Hibernate数据库访问的步骤:
    1)读取并解析配置文件
    Configuration conf = new Configuration().configure();
    (2)读取并解析映射文件,创建SessionFactory
    SessionFactory sf = conf.buildSessionFactory();
    (3)打开Session
    Session session = sf.openSession();
    (4)开始一个事务(增删改必须,查询操作可选)
    Transaction tx = session.beginTransaction();
    (5)数据库操作。
    session.save(user);//或者其他操作
    session.save(tea);
    (6)提交事务(回滚事务)
    tx.commit();//tx.rollback();
    (7)关闭session
    session.close();

    持久化:
    我们以面向对象的方式组织程序,瞬时的数据也以对象的形式存在,而持久的数据多保存在关系型数据库中。所以,在通常情况下,持久化要完成的操作就是把对象保存到关系型数据库中,或者把关系型数据库中的数据读取出来以对象的形式封装。


    模块测试:
    添加junit需要的jar包
    在测试方法的上方写入@Test
    Outline视图选择要执行的Test方法右键run as 选择junit Test


    配置文件示例

    实体类:
    <hibernate-mapping>
    <class name="cn.jbit.houserent.bean.User" table="users" schema="jbit">
    <id name="id" type="java.lang.Integer">
    <column name="id" />
    <generator class="native" />
    </id>
    <property name="password" type="java.lang.String" >
    <column name="password" />
    </property>
    <property name="telephone" type="java.lang.String" >
    <column name="telephon” />
    </property>
    <property name="username" type="java.lang.String" >
    <column name="username" />
    </property>
    </class>
    </hibernate-mapping>


    总配置文件; 名字必须是 hibernate.cfg.xml
    <hibernate-configuration>
    <session-factory>
    <property name="dialect">
    org.hibernate.dialect.MySQLDialect
    </property>
    <property name="connection.url">
    jdbc:mysql://localhost:3306/test
    </property>
    <property name="connection.username">root</property>
    <property name="connection.password">dgt</property>
    <property name="connection.driver_class">
    com.mysql.jdbc.Driver
    </property>
    <property name="myeclipse.connection.profile">my</property>
    <property name="show_sql">true</property>
    <mapping resource="com/bawei/bean/ZUserrole.hbm.xml" />
    <mapping resource="com/bawei/bean/ZUser.hbm.xml" />

    </session-factory>
    </hibernate-configuration>


    **********************
    lizy 配置对象的加载模式 lizy="true" 即时加载
    cascade 是否级联操作 all/delete/none/saveAndUpdate
    inverse 是否由one方主动管理外键 true 由多方管理外键

    查询
    全部 得到对象
    一列 得到(字符串)集合
    多列 得到对象数组集合 得到对象
    条件查询
    占位 数字从 0 开始
    命名参数绑定
    封装参数绑定 setproperties()


  • 相关阅读:
    shell 测试命令
    shell 键盘录入和运算
    shell 的变量
    shell 脚本 helloworld
    让windows系统的DOS窗口也可以显示utf8字符集
    wxpython发布还自己图标的程序
    弥补wxpython无背景图片缺陷
    wxPython实现在浏览器中打开链接
    使用py2exe发布windows平台Python
    python os模块实用函数
  • 原文地址:https://www.cnblogs.com/flytwosky/p/7045586.html
Copyright © 2011-2022 走看看