zoukankan      html  css  js  c++  java
  • hibernate框架学习第二天:核心API、工具类、事务、查询、方言、主键生成策略等

    核心API
    Configuration
    描述的是一个封装所有配置信息的对象
    1.加载hibernate.properties(非主流,早期)
    Configuration conf = new Configuration();
    conf.addResource("cn/itcast/h3/helloworld/vo/UserModel.hbm.xml");
    2.加载hibernate.cfg.xml(主流)
    Configuration conf = new Configuration().configure();

    SessionFactory
    描述的是创建Session对象的工厂类,它需要通过Configuration对象创建得到
    SessionFactory sf = conf.buildSessionFactory();
    线程安全的

    Session
    描述的是一次应用程序与数据库间进行数据交换的对象
    Session对象描述的是一次操作过程,因此多次操作,应该使用不同的Session对象
    Session对象需要依赖SessionFactory对象每次开启全新的对象
    Session s = sf.openSession();
    线程不安全的
    Session是一个数据仓库(临时)
    操作:
    增删改:Session对象获取到要操作的数据,和操作的种类后,自动根据操作方法生成SQL语句
    做数据变更操作,一定要基于事务
    查询:查询操作也是临时操作
    做数据查询操作,可以不使用事务(通常开启事务)
    Session使用完毕,关闭Session对象
    s.close();

    开发一个工具类
    HibernateUtil.java

    public class HibernateUtil {
      private static Configuration conf = null;
      //静态的SessionFactory
      private static SessionFactory sf = null;
      static{
        conf = new Configuration().configure();
        sf = conf.buildSessionFactory();
      }
      public static SessionFactory getSf(){
        return sf;
      }
      /**
      * 获取Session对象
      * @return 全新的Session对象
      */
      public static Session getSession(){
        return sf.openSession();
      }
    }

    Transaction
    对象描述Hibernate执行过程中事务对象
    Transaction对象需要依赖Session对象开启
    开启事务
    Transaction t = s.beginTransaction();
    提交事务
    t.commit();
    回滚事务
    t.rollback();

    Query
    描述的是Hibernate中进行查询的对象
    1.Query对象的获取
    获取Query对象,需要依赖1.Session对象,2.HQL
    String hql = "from UserModel"; //HQL语句必须按照规则来写,所以操作以对象为基础
    Query q = s.createQuery(hql);
    2.获取查询结果方式
    2.1使用list方法,得到一个集合List
    基于查询的内容不同,可以得到两种信息
    1.对象模型
    如果查询的是所有数据,得到的是封装好的对象
    如果查询的只是一个属性,得到是该属性对应的数据类型数据
    2.对象数组Object[]
    如果查询的数据超过一个,此时范围的是对象数组Object[]
    投影(不推荐使用):将查询的多个散的数据,包装成一个数据模型,需要提供对应的构造方法
    注意:
    1.一定要提供默认无参的构造方法
    2.添加的构造方法根据使用需求来添加,尽量不要使用该形式
    2.2使用uniqueResult方法,得到一个对象
    注意:
    1.集合函数count返回的是Long型数据
    2.如果使用该操作,查询的结果返回了超过1条数据,报错
    3.查询结果可以是单个数据,也可以是多个数据,规则与list相同
    3.分页查询
    操作,设置要查询的第一条数据,和数据总量
    规定查询的结果是从第几条开始
    q.setFirstResult(1);
    规定查询的结果一共多少条
    q.setMaxResults(10);
    4.条件查询
    固定值查询(略)
    传入可变参数查询
    1.HQL:from UserModel where *** = ? and **** = ?
    赋值是对Query对象添加参数
    q.setParameter(索引,数据);
    q.setParameter(0,"aa"); //为第一个参数赋值为字符串的"aa"
    q.setParameter(4,33); //为第五个参数赋值为int型的33
    弊端:索引传递参数,必须位置全完匹配,如果不匹配,错误
    2.HQL:from UserModel where age >= :aa and userName like :userName
    赋值是对Query对象添加参数,以变量的格式进行添加
    q.setParameter(变量名,数据); //变量名一定是在HQL中前面有个冒号的名称
    q.setParameter("age","aa"); //为名称为age的参数赋值为字符串的"aa"
    q.setParameter("name",33); //为名称为name的参数赋值为int型的33
    弊端:由于当前传递的参数是没有类型限定的,因此需要开发者传递参数时明确数据类型
    3.HQL:from UserModel where age >= ? and userName like ?
    赋值是对Query对象添加参数,以索引的格式进行添加,并且规定了参数的数据类型
    q.set数据类型(索引,数据);
    q.setInteger(0,123);
    q.setString(4,"aaa");
    q.setDouble(5,3.5);
    4.(推荐格式)HQL:from UserModel where age >= :aa and userName like :userName
    赋值是对Query对象添加参数,以变量的格式进行添加,并且规定了参数的数据类型
    q.set数据类型(变量名,数据);
    q.setInteger("aa",123);
    q.setString("bb","aaa");
    q.setDouble("cc",3.5);

    Criteria
    描述的是Hibernate中按条件查询的对象
    Criteria对象通过Session对象创建出来的
    描述查询条件时,按照Java面向对象的方式添加条件,每种不同的条件被封装成了一个对应的方法
    Criteria对象查询支持分页
    Criteria对象查询支持投影
    Criteria对象支持list和uniqueResult查询结果
    -----------------------------------------------------------
    系统配置文件(cfg.xml)
    数据库连接的配置
    hibernate.connection.driver_class
    JDBC驱动类类名
    hibernate.connection.url
    JDBC连接字符串
    hibernate.connection.username
    JDBC连接用户名
    hibernate.connection.password
    JDBC连接用户名对应的密码
    连接池的配置
    1.Hibernate有一个默认的连接池,可以对其修改连接池连接数量
    hibernate.connection.pool_size = 10
    更改连接的数量
    2.可以使用外部技术开启连接池(c3p0)
    2.1首先导入c3p0连接池jar包 lib/optional/c3p0/*.jar
    2.2在cfg.xml中配置下列配置属性
    <property name="hibernate.c3p0.min_size">10</property>
    <property name="hibernate.c3p0.max_size">1000</property>
    <property name="hibernate.c3p0.timeout">181</property>

    可选配置
    1.(必选)方言
    SQL语句基于不同的数据库,写出来,格式,关键字,都不一定完全相同
    配置方言,可以让H3生成对应数据库使用的SQL语句
    dialect 配置对应的数据库方言(到文档中查找)
    2.控制SQL语句的显示与分行显示
    show_sql true/false
    format_sql true/false

    资源注册
    H3只能控制在配置文件中声明的资源文件对应的类
    <mapping resource="cn/itcast/h3/helloworld/vo/UserModel.hbm.xml"/>


    映射关系中的Object制作规范
    1.提供公共无参的构造方法(可使用自动生成的)
    注意:如果使用投影技术,一定要显式声明公共无参的构造方法
    2.提供一个标识属性,作为对象的主键,映射数据库表主键
    通常使用uuid作为主键
    3.对所有其他属性进行私有化声明,并进行标准封装
    注意:属性声明时使用封装类模型,避免使用基本数据类型
    4.不要使用final修饰符(否则将无法生成代理对象进行优化)

    OID
    是H3用于区分对象的,不同的对象OID一定不同,相同的对象OID一定相同
    自然主键:具有业务含义
    代理主键:不具有业务含义
    OID选择应尽量避免使用自然主键,改用代理主键(uuid)

    属性的数据类型选择问题
    基本数据类型 long,int
    封装类类型 Long,Integer

    封装类类型可以区分出数据是否输入了
    基本数据类型的默认值是无法确认是用户输入的还是自动添加的

    优先使用封装类

    映射配置文件(hbm.xml)
    类与表的映射class
    name:模型类的全路径名格式
    table:数据库表名
    schema:数据库名

    主键的映射id
    H3使用OID,这里配置的主键映射就是OID
    name:数据模型中的OID,通常使用uuid属性(必须)
    column:数据库表的主键,通常使用uuid字段(可选)
    如省略column配置,则默认column值与name值相同
    type:标识属性或字段的类型(兼容Java、DB、Hibernate类型)
    length:标识数据库字段的长度

    主键生成策略generator
    手工控制
    assigned(不限制类型)
    必须手工提供OID
    自动生成
    uuid(字符串类型)
    长度必须是大于等于32位,生成策略是由JVM完成
    increment(整型数值类型)(不常用)
    数据库端与模型必须都制作成整型,数据库端不需要做自增策略
    每次使用时获取当前的最大值,然后+1,给当前使用(具有风险性)
    identity (整型数值类型)(安全)
    数据库端需要做【自增策略】,数据库端与模型必须都制作成整型
    MySQL可用
    sequence (整型数值类型)
    序列完成,基于数据库
    Oracle可用
    native(整型数值类型)
    根据配置的数据库类型不同,选择对应的自增生成策略
    MySQL:整型,自增策略

    双主键,多主键(了解)
    <composite-id>
    <key-property name="uuid"/>
    <key-property name="userName"/>
    </composite-id>

    属性与字段的映射
    配置Java模型中属性与数据库表中字段间的关系
    常用属性
    name:数据模型中的属性名,也就是Java字段名(必须)
    column:数据库表的字段名(可选)
    如省略column配置,则默认column值与name值相同
    其他属性
    type:标识属性或字段的类型(兼容Java、DB、Hibernate类型)
    length:标识数据库字段的长度
    not-null:是否为空
    unique:是否唯一

    配置格式:3种
    <property name="userName" column="name" type="java.lang.String" length="30"/>
    <property name="age" column="age" type="int" length="3"></property>
    <property name="address">
    <column name="address" sql-type="string" length="30"/>
    </property>
    <property name="userName"/>(常用)

    自动生成表结构
    写在cfg.xml中,属于可选配置
    <property name="hbm2ddl.auto">create</property>

    自动提交事务
    写在cfg.xml中,属于可选配置
    <property name="connection.autocommit">true</property>
    问题:任意一个Session中,执行任意操作,将对应一个事务
    s.save(um);
    s.delete(um);
    s.update(um);

    ---------------------------------------------------------
    总结:
    H3简介
    ORM
    H3HelloWorld(重点)
    1.环境搭建
    2.ORM制作
    3.cfg制作
    4.客户端
    完成
    H3基本操作 (重点)
    核心API
    6个对象
    Query (重点)
    配置
    cfg.xml
    hbm.xml
    模型

  • 相关阅读:
    JAVA泛类型(汽车Demo)
    java自定义事件机制分析
    ExtJS自定义事件
    模块化设计进化
    面向服务的SOA架构与服务总线ESB
    数据加密数字签名
    面试题
    一点ExtJS开发的感悟
    学习代理模式
    抽象类与接口
  • 原文地址:https://www.cnblogs.com/xyhero/p/9348815.html
Copyright © 2011-2022 走看看