hibernate入门

一: hibernate框架简单介绍:

       1.hibernate他是一个jdbc封装,可以使用hibernate来完成数据库的操作.他是orm框架 orm(对象关系映射)

       2.来建立javabean和表之间的映射.

          documentation文件夹: 里面相关文件和API;  lib/required jar包 probject: 相关的源代码与资源, etc:配置文件
 

二: hibernate相关的配置:

      1.hbm文件配置.
         xxx.hbm.xml 用于描述类与数据库中表的映射关系;要与实体类在用一个包下,类名hbm.xml   
         <hibernate-mapping package="包名">
             <class name="实体类名" table="表名" catalog="数据库名">
                 <id name="类中主键名" column="数据库中的主键列名" type="主键类型">他是用于描述主键
                    <generator class="native(根据数据库自己选择)">主键生成策略,自动增长....
                 </id>
                 <property name="类属性名" column="表列名" lenth="类型的长度" sql-type="varchar(50)">
            描述表和实体类中的普通字段.
            </class>

    2.   hibernate.cfg.xml  核心配置文件 .

             ①可以加载数据库相关信息,  ②hibernate相关配置  ③加载映射配置文件

             ④配置表的自动创建,<property name="hibernate.hbm2ddl.auto">update</property>
                   create-drop: 每次都会自动创建新的表,执行完成后删除.一般测试用;
                   create:  每次都会创建一个新表,不会删除,用于测试
                   update:  如果数据中有表不创建,没有表创建,还能更新表结构.只能增加列
                   validate:  只能使用我们存在表,并且对映射关系进行校验.


          ⑤ 在src下创建,<hibernate-configuration> 配置driveclass url username password;
              <session-factory>
                 <property name="hibernate.connection.driver_class">com.mysql
                 <property name="hibernate.connection.url">jdbc:mysql
                 <property name="hibernate.connection.username">root
                 <property name="hibernate.connection.password">root

                  可以向数据库发送的SQL语句显示
                 <property name="hibernate.show_sql">true

                  格式化SQL
                 <property name="hibernate.format_sql">true

                  hibernate的方言, 会针对不同数据库产生不同的SQL语言
                 <property name="hibernate.dialect">

                 映射配置文件所在的位置, 注意是/  !!!
                 <property resource="com/xc/domain/配置文件名称">


三. hibernate开发: 

        新建java类, 在方法内, new 实体类,自动增长的id不用赋值,对其他属性赋值

      1.new Configuration().cnfigure();  去加载核心配置文件,把映射文件导入
 
      2.  hibernateCofing.buildsesionfactory(); 得到核心配置文件中标签下的配置信息sessionfactory;
 
      3  sessionfactory.opensession();    相当于得到一个connection;

      4. 开启事物:session.beginTransaction();

      5  opensession.save(对象); 保存, c = session.get(customer.class,1);得到id=1  c.getname信息;
 
          session.load(customer.class,1)都是查询,  session.update(c);修改操作;

          session.delete(c)  //删除操作;

          查询所有;session.createQuery("from 类名");  //HQL 他是类似与SQL;

          query.list();

     6  sessionfactory.gettransaction().commit()  

     7.  关闭连接 ,seesion.close() seesionfatroy.close();

 

四 hibernate: 核心类和接口介绍

       1. 一共6个, session, sessionfactory,transaction, query,criteria,

      1. configuration: 用于加载核心配置.new configuration().configure(); 不用方法载.properties;

                                   在configure("my.xml"),可以改变核心配置文件名称;

                                   手动加载映射 configure.addresource("com.xc.doma/cust.mxl");

                                                     configure.addclass(Custmoer.class);直接在实体类所在包下查找规范映射配置文件

      2.sessionfactory: 用configure.buildsessionfactory()得到; opensession()
                 getcurrentsession() 获取一个与线程绑定的session; 当提交或事物回滚,会自动关闭

          ①不是轻量级的,不要频繁的创建关闭,一个项目只有一个,通过session进行操作;

          ②.保证一个项目所使用sessionfactory只有一个.创建一个工具类, 属性静态 configration和
              sessionfactory,  静态代码块,得到sessionfactory, 然后一个获取session的方法.

          ③.不要关闭sessionfactory; 它内部维护了一个连接池



     3. session: 线程不安全,解决安全问题, 只需要方法内部创建就可以,不要声明成员变量.

           session常用的方法:  save 保存对象 update 修改操作  delete 删除  get/load 根据id查询
                                             savenorupdate : 数据库中有数据update和无数据执行save,
                                             createquery(); 获取query对象
                                             crateSQLquery():获取可以操作SQL的sqlquery对象, cratecriteria() 可以完成条件查询

     4.Transaction 接口主要用于管理事物,对底层的事物进行了封装,它可以进行事物操作
                      程序中没有开启事物,session的每一个操作,他就会开启一个事物;默认事物不会自动提交

      5.query 主要完成查询操作

             ① HQL语句session.createquery(hql); 

                     查询所有操作 ;from 类名  
                     分页查询: query.setfirstresult()开始位置(0开始);  .setmaxresults()本页显示的条数;
                     查询指定列信息: select new 类名(属性1,属性2) from 类名,得到的数组
                     这时候需要hibernate中的投影查询, 在customer类中加一个想要几列的构造函数
                     条件查询: 可以使用where;  查询姓名0的信息 session.createquery(from Customer where name=?)
                                   或 session.createquery(from Customer where name=:abc)有名称参数
                      对无名称参数赋值: query.setparameter(坐标从0开始,"要赋的值");
                      对有名称参数赋值: query.setparameter("abc","要赋的值");
                      如果结果是一条: query.uniqueResult();得到一个对象

              ②SQL语句session.createsqlquery(sql);
                     session.createSQLQuery("sql语句"); query.addentity(类.calss); query.list();
                     对参数赋值 query.setparameter(坐标从0开始,"要赋的值");

             ③criteria : 是轻量级,不能在session外使用,
                     session.createcriteria(customer.class)得到criteria对象;
                      查询所有; criteria.list()  分页: setfirstresult() setmaxresults();
                      query.uniqueResult();得到一个对象
                     多条件查询:  查询name="sdf"
                    criteria.add(Restrictions.eq("类中的属性name","值"));
                    查询name="sdf"或者查询地址为上海     or       
                     criteria.add(restrications.or(Restrictions.eq("类中的属性name","值")
                                     ,(Restrictions.eq("类中的属性id",值))); 值根据类型  和 and

五: hibernate开发规范和主键生成策略

        1.持久化类 persistent object(po) , 对于hibernate 中po编写规则:

            ①必须提供一个无参数的public构造方法
            ②属性要private,对外提供public的get/set方法,
            ③在po类红提供一个标识属性,他与数据库主键对应,叫做oid;  hibernate用过这个属性来区别不同的PO对象;
            ④po类属性尽量使用包装类类型: 基本数据类不能描述不存在概念比如说0在数据库中有意义,
                                                                而0却是int类型的默认值.对象默认值是null;
            ⑤po类不能使用final修饰符,final修饰的类不能被子类继承;    hibernate中get/load方法的区别:
                get直接得到一个持久化类的对象;立即查询操作,发送SQL语句, 查询到不存在的,返回为null;
                load得到一个持久化类的代理对象(子类对象);延迟策略查询数据,只有用到这个查询结果的时候,才会查询;
                                                                                       查询到不存在的,报错;0

        2.hibernate主键生成策略:   

              自然主键(具有业务意义: 身份证号,学号)     
              代理主键(无业务意义,比如自增id,建议使用)
             1.increment: 由hibernate维护的变量, 每次生成注解自动递增, 优点: 夸平台, 缺点: 不合适高并发访问;
             2.identity: 有底层数据库生成标识符,条件数据库支持自动增长数据类型,
                  优点:与hibernate无关  缺点:oracle不能用
            3.sequence : 优点: 由底层数据库维护, 缺点: 数据库必须支持sequence; 在<generator> <param>指定序列名
            4.native:  根据底层数据库来自动选择,主键生成策略 优点:在项目中存在多个数据库中采用, 缺点:效率低
            5 uuid: 保证主键的唯一性, 与数据库无关,方便数据库移植,效率高,不访问数据库可以直接生成主键值
                         缺点: 长度大(32),占用空间大,对应数据库中类型 char varchar;
            6.自然主键  assigned::有Java程序员赋值; 缺点:主键应该尽量避免手动生成
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值