hibernate概述与入门(1)

Hibernate概述

1.1 什么是hibrnate

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。(https://baike.baidu.com/item/Hibernate/206989?fr=aladdin
Hibernate就是一个持久层的ORM的框架. ORM :Object Relational Mapping.对象关系映射.

1.2 hibernate优点

简化JDBC的编程.
修改了实体类,不需要修改源代码.
轻量级的框架.
移植性好,支持各种数据库

1.3 hiebernate相关api

Hibernate的API一共有6个,分别为:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通过这些接口,可以对持久化对象进行存取、事务控制。下载地址:https://sourceforge.net/projects/hibernate/files/hibernate-orm/

1.3.1 Configuration(加载配置文件)

Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。

1.3.2 SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。

1.3.3 Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
Session不是线程安全的.
是与数据库交互的桥梁:完成CRUD的操作:常用的方法:
* save(Object obj);
* update(Object obj);
* delete(Object obj);
* T get(Class c,Serializable s);
* T load(Class c,Serializable s);
* saveOrUpdate(Object obj);

1.3.4 Transaction

Transaction 接口是一个可选的API,可以选择不使用这个接口,取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

1.3.5 Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

1.3.6 Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

1.4 hibernate核心配置

1.4.1 核心配置

Hibernate的核心配置有两种方式:


1.属性文件的方式:hibernate.properties
            属性文件的方式不能配置映射:
            通过手动编写代码方式加载映射:
2.XML文件的方式:hibernate.cfg.xml
         一块:必须的配置:
             数据库连接信息:
             数据库方言:
         二块:可选的配置:
             显示SQL
             格式化SQL
             hbm2ddl.auto
                 none               
                 create:数据库有表,每次都会创建一个新的表.(测试时候)
                 create-drop:每次都会创建一个新的表,用完之后就删除掉.(测试时候)
                 update:如果数据库没有表,创建一个新表,如果有表,使用原有表.更新表结构
                 validate:使用原有表,进行校验.
         三块:加载映射,例如:      
<mapping resource="com/zh/domain/Customer.hbm.xml"/> 
例如hibernate.cfg.xml:
<hibernate-configuration>
    <!-- 先配置SessionFactory标签,一个数据库对应一个SessionFactory标签 -->
    <session-factory>
        <!-- 必须要配置的参数有5个,4大参数,数据库的方言 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql:///hibernate1?characterEncoding=UTF-8</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>

        <!-- 数据库的方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!-- 可选配置 -->
        <!-- 显示SQL语句,在控制台显示 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化SQL语句 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 生成数据库的表结构 
            update:如果没有表结构,创建表结构。如果存在,不会创建,添加数据
        -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- 映射配置文件,需要引入映射的配置文件 -->
        <mapping resource="com/zh/domain/Customer.hbm.xml"/>
    </session-factory>
</hibernate-configuration>  

1.4.2 映射文件配置

映射文件是一个XML文件,通常命名 类名.hbm.xml。例如Customer.hbm.xml:

<hibernate-mapping>
    <!-- 配置类和表结构的映射 -->
    <class name="com.zh.domain.Customer" table="cst_customer">
        <!-- 配置id 
            name属性,JavaBean的属性
            column属性,是表结构的字段
        -->
        <id name="cust_id" column="cust_id">
            <!-- 主键的生成策略 -->
            <generator class="native"/>
        </id>
        <!-- 配置其他的属性 -->
        <property name="cust_name" column="cust_name"/>
        <property name="cust_user_id" column="cust_user_id"/>
        <property name="cust_create_id" column="cust_create_id"/>
        <property name="cust_source" column="cust_source"/>
        <property name="cust_industry" column="cust_industry"/>
        <property name="cust_level" column="cust_level"/>
        <property name="cust_linkman" column="cust_linkman"/>
        <property name="cust_phone" column="cust_phone"/>
        <property name="cust_mobile" column="cust_mobile"/>
    </class>
</hibernate-mapping>    

1.6 hibernate入门程序

1.下载

http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download

2.创建数据库表

CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
  `cust_create_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_linkman` varchar(64) DEFAULT NULL COMMENT '联系人',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;

3.引入jar包
数据库驱动包:Hibernate/lib/required/*和日志包
4.创建实体
5.创建映射配置文件Cutomer.hbm.xml
6.创建核心配置文件Hibernate.cfg.xml
7.编写代码

    //测试保存客户
    @Test
    public void testSave(){
        // 1.加载配置文件
        Configuration config = new Configuration().configure();
        // 2. 创建SessionFactory对象
        SessionFactory factory = config.buildSessionFactory();
        // 3. 创建session对象
        Session session = factory.openSession();
        // 4. 开启事务
        Transaction tr = session.beginTransaction();
        // 5. 编写保存的代码
        Customer c = new Customer();
        // c.setCust_id(cust_id);   主键是自动递增了
        c.setCust_name("测试3");
        c.setCust_level("2");
        c.setCust_phone("110");
        // 保存数据,操作对象就相当于操作数据库的表结构
        session.save(c);
        // 6. 提交事务
        tr.commit();
        // 7. 释放资源
        session.close();
        factory.close();
    }

猜你喜欢

转载自blog.csdn.net/qq_26798823/article/details/81241106
今日推荐