zoukankan      html  css  js  c++  java
  • hibernate框架

      在之前的DAO开发中,对关系型数据库进行增删改查都是直接通过sql语句,需要人工的进行对象和表之间的转换。而Hibernate提供了对象和表之间进行映射的框架,使得这种转换更加方便。

    1.ORM概念

    O:Object 对象

    R:Relational 关系型数据库

    M:Mapping 映射

    ORM要解决两个问题:

    • 存储:把对象直接存入数据库;
    • 获取:从数据库拿到一个对象;

    做到这些需要以下条件:

    • 对象与表的映射;
    • 属性与字段的映射;
    • 类型的映射;

    Hibernate就是ORM的一种实现。

    2.使用Hibernate框架

    • 导入jar包:hibernate3.jar核心  +  required (6个) +  jpa 目录  + 数据库驱动包
    • 映射配置文件Employee.hbm.xml
    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!--package:要映射的对象所在的包,如果不写,此文件所有的类都要指定全名称
        auto-import:默认为true,在写HQL的时候自动导入包明
        如果指定为false,在写HQL的时候必须要写上类的全名
        如:session.createQuery("from com.juaner.hibernate.Employee").list()-->
    <hibernate-mapping package="com.juaner.hibernate">
        <!--一个class映射一个表,一般情况下一个映射文件写一个class-->
        <class name="Employee">
            <!--主键-->
            <id name="empId" column="id">
                <!--主键的生成策略
                identity 自增长(mysql、db2)
                sequence 自增长(序列),oracle中自增长是以序列的方式实现
                native 会根据底层数据库自增长的方式选择identity或sequence
                assigned 指定主键生成策略为手动指定主键的值
                uuid 指定uuid随机生成的唯一的值,uuid为string类型
                -->
                <generator class="identity"/>
            </id>
            <!--普通映射-->
            <!--
                name 指定对象的属性名称
                column 指定对象属性的表的字段名称,如果不指定
                length 指定字符的长度,默认为255
                type 指定映射表的字段的类型
                    Java类型 必须写全名
                    hibernate类型 直接写类型,都是小写
                -->
            <property name="empName" column="name" length="25"/>
            <property name="workDate" column="workdate"/>
        </class>
    
    </hibernate-mapping>
    • 主配置文件hibernate.cfg.xml
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    <hibernate-configuration>
        <!--通常,一个session-facttory节点代表一个数据库-->
        <session-factory name="foo">
            <!--数据库连接配置-->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql:///test</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">juaner767</property>
            <!--数据库方法配置,hibernate在运行的时候会生成符合当前数据库语法的sql语句-->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            <!--其他相关配置-->
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">true</property>
            <!--自动建表
            create:每次都重新建表,如果表已存在,删除之后重建
            update:如果表不存在就创建,如果表存在就修改
            validate:验证,如果表和映射不相符,报错-->
            <property name="hibernate.hbm2ddl.auto">update</property>
            <!--加载所有映射-->
            <mapping resource="com/juaner/hibernate/Employee.hbm.xml"/>
            <mapping resource="com/juaner/hibernate/User.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>
    • Hibernate API
        @Test
        public void test1(){
            Employee emp = new Employee();
            emp.setEmpName("班长");
            emp.setWorkDate(new Date());
    
            //获取加载配置文件的管理类对象
            Configuration config = new Configuration();
            //加载配置文件,默认加载src/hibernate.cfg.xml
            config.configure();
    
            //创建session的工厂对象
            SessionFactory sf = config.buildSessionFactory();
            //创建session(代表一个会话,与数据库连接的会话)
            Session session = sf.openSession();
            //开启事务
            Transaction transaction = session.beginTransaction();
            //保存数据库
            session.save(emp);
            //提交事务
            transaction.commit();
            session.close();
    
        }

    3.Hibernate API

    |-- Configuration       配置管理类对象

           config.configure();    加载主配置文件的方法(hibernate.cfg.xml),默认加载src/hibernate.cfg.xml

           config.configure(“cn/config/hibernate.cfg.xml”);   加载指定路径下指定名称的主配置文件

           config.buildSessionFactory();   创建session的工厂对象

    |-- SessionFactory     session的工厂(代表了hibernate.cfg.xml配置文件)

           sf.openSession();   创建一个sesison对象

           sf.getCurrentSession();  创建session或取出session对象

    |--Session      session对象维护了一个连接(Connection), 代表了与数据库连接的会话。但是比Connection对象更强大,拥有save()、update()、delete()等方法。

            Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象。

          session.beginTransaction(); 开启一个事务; hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!

      session.close();关闭连接;

    更新:

             session.save(obj);   保存一个对象

             session.update(emp);  更新一个对象

             session.saveOrUpdate(emp);  保存或者更新(如果没有设置主键,执行保存;如果有设置主键,执行更新操作;如果设置主键不存在报错!)

    主键查询:

             session.get(Employee.class, 1);    主键查询

         session.load(Employee.class, 1);   主键查询 (支持懒加载)

    删除:

      session.delete(employee);

    |-- Transaction    hibernate事务对象

      提交事务:

        transaction.commit();

    4.Hibernate支持的3中查询

    • HQL查询:

             SQL: (结构化查询语句)查询的是表以及字段;  不区分大小写。

             HQL: hibernate  query  language 即hibernate提供的面向对象的查询语言

                   查询的是对象以及对象的属性。

                   区分大小写。

     Query query = session.createQuery("from Employee where empId = 1");
     List<Employee> list = query.list();
    • Criteria查询:

              完全面向对象的查询。

    Criteria criteria = session.createCriteria(Employee.class);
    criteria.add(Restrictions.eq("empId",1));
    List<Employee> list = criteria.list();
    • 本地SQL查询:

             复杂的查询,就要使用原生态的sql查询。

             (缺点: 不能跨数据库平台!)

    SQLQuery sqlQuery = session.createSQLQuery("select * from t_employee").addEntity(Employee.class);
    List list = sqlQuery.list();

    5.复合主键映射

      如果表中有复合主键,需要将对象中的相应属性封装成复合主键类,并实现Serializable接口:

    public class User {
        private CompositeKeys keys;
        private int age;
        set...
        get...
    }
    public class CompositeKeys implements Serializable{
        private String userName;
        private String address;
    
        set...
        get...  
    }

      然后在映射文件中配置composite-id:

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="com.juaner.hibernate">
        <class name="User">
            <!--复合主键映射-->
            <composite-id name="keys">
                <key-property name="userName" type="string"></key-property>
                <key-property name="address" type="string"></key-property>
            </composite-id>
            <property name="age" type="int"/>
        </class>
    
    </hibernate-mapping>

       结果:

  • 相关阅读:
    开放源码的对象关系映射工具ORM.NET 插入数据 Insert/Update Data
    开放源码的对象关系映射工具ORM.NET 快档开发入门 Quick Start
    .NET 动态脚本语言Script.NET 开发指南
    开放源码的对象关系映射工具ORM.NET 删除数据 Deleting Records using ORM.NET
    .NET Remoting过时了吗?为什么公司的项目还是选择用.NET Remoting,而不是WCF?
    开放源码的对象关系映射工具ORM.NET 查看和显示数据 View and Display data using ORM.NET
    开放源码的对象关系映射工具ORM.NET 查询表 调用存储过程 增加自定义代码
    技术人生:坚持,每日一博
    CQRS:CQRS + DDD + MDP 实现快速应用程序开发
    NodeJs:Happy代码生成器,重构了代码,更新了文档,完善了示例,欢迎下载使用
  • 原文地址:https://www.cnblogs.com/juaner767/p/5561540.html
Copyright © 2011-2022 走看看