Hibernate学习笔记_01

1.Hibernate是什么

Hibernate是一种Java语言下的对象关系映射解决方案,作为一款优秀的全自动持久层框架,深受广大开发者的青睐.它为面向对象领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。那么什么是框架呢?

用通俗的话来说,框架的特点有以下三个:

  1. 框架是用来提高开发效率的,就像做房子一样,需要使用各种各样的工具来配合使用,而框架就好比一个工具箱,提供各种封装好的工具给开发者使用,提高效率.
  2. 框架封装好了一些功能,我们需要使用这些功能时可以直接去调用,不需要再手动去自己实现.
  3. 框架也可以看成一个半成品的项目,只要懂得如何去驾驭这些功能即可

那么Hibernate框架是什么呢?在JavaWeb开发中位于哪一部分呢?通过下图读者可以了解到一些

大家都知道JavaWeb开发遵循的MVC原则,Hibernate就处于Model层的Dao层,代替了之前的JDBC|DBUtils来方便我们对数据库进行操作,其优点就是在书写SQL语句时可以采用面向对象的方式来书写,不需要书写SQL语句,更符合我们面向对象开发的思路习惯.

同时Hibernate也是一款ORM(orm:object relationg mapping. 对象关系映射)框架

 

ORM也分为4个等级,hibernate属于4级:完全面向对象操作数据库,mybatis属于2级,dbutils属于1级.

2.Hibernate框架的搭建

  1. 导jar包

  

  2.驱动包,在这里以mysql驱动包为示例

  

  3.创建数据库,准备表,实体

CREATE TABLE `cst_customer` (
    `cust_id` BIGINT (32) NOT NULL AUTO_INCREMENT COMMENT '客户编号',
     `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
     `cust_source` VARCHAR (32) DEFAULT NULL COMMENT '客户信息来源',
     `cust_industry` VARCHAR (32) DEFAULT NULL COMMENT '客户所属行业',
      `cust_level` VARCHAR (32) DEFAULT NULL COMMENT '客户级别',
      `cust_linkmen` 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=1 DEFAULT CHARSET=utf8;

 

  3.书写orm元数据(对象与表的映射配置文件

    Ⅰ.导入约束

   

  

    Ⅱ.实体(要有Get/Set方法


    private long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkmen;
    private String cust_phone;
    private String cust_mobile;

    Ⅲ.ORM元数据

<!-- 配置表与实体对象之间的关系 -->
<!-- package属性:填写一个包名(实体所在的包),在元素内部凡是需要书写完整类名的属性,可以直接书写简单类名 -->
<hibernate-mapping package="com.jhdx.domain">
    <class name="Customer" table="cst_customer">
        <id name="cust_id" column="cust_id">
            <generator class="native"></generator>
        </id>
        <property name="cust_name" column="cust_name"></property>
        <property name="cust_source" column="cust_source"></property>
        <property name="cust_industry" column="cust_industry"></property>
        <property name="cust_level" column="cust_level"></property>
        <property name="cust_linkmen" column="cust_linkmen"></property>
        <property name="cust_phone" column="cust_phone"></property>
        <property name="cust_mobile" column="cust_mobile"></property>
</hibernate-mapping>

  4.书写主配置文件

<hibernate-configuration>
    <!-- #hibernate.dialect org.hibernate.dialect.MySQLDialect
        #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
        #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
        #hibernate.connection.driver_class com.mysql.jdbc.Driver
        #hibernate.connection.url jdbc:mysql:///test
        #hibernate.connection.username gavin
        #hibernate.connection.password
     -->
  <session-factory>
      <!-- 数据库驱动 -->
      <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
      <!-- 数据库URL "///"代表本机 -->
      <property name="hibernate.connection.url">jdbc:mysql:///crm</property>
      <!-- 数据库连接用户名 -->
      <property name="hibernate.connection.username">root</property>
      <!-- 数据库连接密码 -->
      <property name="hibernate.connection.password">123456</property>
      <!-- 数据库方言
          不同的数据库中,SQL语法略有区别.指定方言可以让Hibernate框架在生成sql语句时,针对数据库的方言生成
       -->
      <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
      
      <!-- #hibernate.show_sql true 
           #hibernate.format_sql true
      -->
      <!-- 将Hibernate生成的SQL语句打印到控制台 -->
      <property name="hibernate.show_sql">true</property>
      <!-- 将Hibernate生成的SQL语句格式化 -->
      <property name="hibernate.format_sql">true</property>
      <!-- 
          ## auto schema export    自动导出表结构,自动建表
        #hibernate.hbm2ddl.auto create-drop    自动建表,每次框架运行结束都会将表删除(开发环境中测试使用)    
        #hibernate.hbm2ddl.auto create    自动建表,每次框架运行都会自动创建新的表,以前的表将会被覆盖,数据会丢失(开发环境中测试使用)
        #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表,如果已存在不会再生成,如果表有变动,自动更新表.(不会删除任何数据)
        #hibernate.hbm2ddl.auto validate    校验,不自动生成表,每次启动会校验数据库中的表是否正确
       -->
      <property name="hibernate.hbm2ddl.auto">update</property>
      <!-- 引入ORM元数据
          路径书写:填写src下的路径
       -->
      <mapping resource="com/jhdx/lg/Customer.hbn.xml"/>
  </session-factory>
</hibernate-configuration>

  5.书写代码测试

public class Demo {

    @Test
    // 保存客户操作
    public void saveCustomer() {
        Configuration conf = new Configuration().configure();
        
        SessionFactory sessionFactory = conf.buildSessionFactory();
        
        Session session = sessionFactory.openSession();
        
        Transaction tx = session.beginTransaction();
        //------------------------------------------
        Customer c = new Customer();
        c.setCust_name("新浪公司");
        session.save(c);//执行保存
        //------------------------------------------
        tx.commit();
        session.close();
        sessionFactory.close();
    }
}

 

3.配置文件详解

  Ⅰ.orm元数据

    根元素

    

    class元素

    

    id元素

     

    property元素

     

  Ⅱ.hibernate主配置

    必选属性配置(5个)

    

    可选属性配置(3个)

     

    元数据引入配置

    

4.HibernateAPI详解

 Ⅰ.Configuration

//1.创建.调用空参构造
Configuration conf = new Configuration();
//2.读取指定主配置文件 =>空参加载方法,加载src目录下hibernate.cfg.xml文件
conf.configure();
//3.读取指定orm元数据(扩展),如果主配置中已经引入映射配置,则不需要手动加载
//conf.addResource(resourceName);
//conf.addClass(persistentClass);
//4.根据配置信息,创建SessionFactory对象
SessionFactory sf = conf.buildSessionFactory();

  Ⅱ.SessionFactory

/*学习SessionFactory对象
SessionFactory功能:用于创建操作数据库对象的核心对象Session对象的工厂
简单说功能就一个 ===>  创建session对象
注意:
1.SessionFactory负责保存和使用所有的配置信息,消耗内存资源非常大2.SessionFactory属于线程安全的对象设计.
结论:保证在Web项目中只创建一个SessionFactory. 
*/
//5.获得Session
//打开一个新的Session对象
sf.openSession();
//获得一个与线程绑定的Session对象
sf.getCurrentSession();

  Ⅲ.Session

    // 学习Session对象
    // Session对象功能: 表达Hibernate框架与数据库之间的连接(会话).
    // session类似于JDBC年代的Connection对象,还可以完成对数据库中数据的增删改查操作.
    // session是Hibernate操作数据库的核心对象
    // 6.session获得操作事务的Transition对象
    // 获得操作事务的tx对象
    Transaction tx = session.getTransaction();

    // 开启事务并获得操作事务的tx对象(建议使用)
    Transaction tx2 = session.beginTransaction();

  

//
Customer c = new Customer();

c.setCust_name("百度");

session.save(c);

//
Customer customer = session.get(Customer.class, 1l);

System.out.println(customer);

//// 1 获得要修改的对象
Customer c = session.get(Customer.class, 1l);
// 2 修改
c.setCust_name("老王");
// 3 执行update
session.update(c);

//// 1 获得要修改的对象
Customer c = session.get(Customer.class, 1l);
// 2 调用delete删除对象
session.delete(c);

  Ⅳ.Transaction

  封装了事务的操作

//打开事务
//方式一
// 获得操作事务的tx对象
Transaction tx = session.getTransaction();
tx.begin();

//方式二
// 开启事务并获得操作事务的tx对象(建议使用)
Transaction tx2 = session.beginTransaction();

tx2.commit();// 提交事务

tx2.rollback();// 事务回滚

 

 

 

  

 

posted @ 2018-04-05 11:24  JumpCode  阅读(326)  评论(0编辑  收藏  举报