zoukankan      html  css  js  c++  java
  • Hibernate

    • Hibernate环境搭建

    • Hibernate的API

    • Hibernate的CRUD

    EE三层结构:

    • web层      
    • 业务逻辑层   
    • 持久层         jdbc,DBUTils,Hibernate 

     

    Hibernate简介:

    一个开源的对象关系映射框架,对JDBC进行了轻量级封装,将pojo与数据库表建立映射关系,是一个全自动的ORM(Object Relation  Mapping,对象关系映射,通过操作对象操作表)框架,可以自动生成sql语句,自动执行。

     可以根据映射自动建表

    HIbernate配置

    Hibernate Configuration:Customer.hbm.xml

     

     

    class标签:建立类与表的映射关系

    属性:

    • name: 类的全路径
    • table:表名(类名和表名一致,table可省略)
    • catalog:数据库名,可不填

    id标签:建立类中的属性和表中主键对应关系

    • name:类中属性
    • column:表中字段(类中属性和表中字段一致,可省略该项)
    • length:长度
    • type:类型

    property标签:普通属性和表中字段对应关系

    • name:类中属性
    • column:表中字段
    • length:长度
    • type:类型
    • not-null:设置非空
    • unique:设置唯一,默认false

    Hibernate核心配置:

    • 属性文件的方式  hibernate.properties(手动编写代码加载映射文件)
    • xml文件的方式    hibernate.cfg.xml  

     

    必须配置:

    • 连接数据库的基本参数:
      • 驱动类
      • url
      • 用户名
      • 密码
    • 方言

    可选配置:

    • 显示sql:<property name="hibernate.show_sql">true</property>
    • 格式化sql:<property name="hibernate.format_sql">true</property>
    • 自动建表:<property name="hibernate.hbm2ddl.auto">update</property>
        • none:不使用Hibernate的自动建表 
        • create:如果数据库已经有表,会删除原有表重新闯进啊
        • create-drop:删除原有表创建新表,使用完后删除表。
        • update:使用原来的表,在原来的表的上更新数据。如果没有表,创建新表(更新表结构)。  
        • validate: 如果没有表,不会创建表。只会用数据库中原有表(校验数据库表结构,自带校验功能)
    • 映射文件的引入:<mapping resource="com/Hidemo1/Customer.hbm.xml"/>

    编写测试类:

     

    Hibernate的核心API:

    Configuration类:

    Hibernate的配置对象,以及对它进行启动。定位映射文档,读取配置,创建SessionFactory对象。

    作用:加载核心配置文件,加载映射文件

    SessionFactory接口:

    负责初始化Hibernate,创建Session对象,用到了工厂模式。

    作用:内部维护了Hibernate连接池和Hibernate的二级缓存(不讲,一般用Redis替换)。线程安全的,一个项目创建一个对象就可以。

    配置成c3p0连接池(了解):

    抽取工具类:

    工具类测试:

    Hibernate的核心对象:Session

    类似连接对象Connection,负责执行被持久化对象的CRUD操作,是与数据库交互的桥梁。

    由于是非线程安全对象,所以不能定义成全局的,需要定义在方法内部,否则有线程安全问题。

    Session中的API:

    保存:Serializable save(obj)

    查询:T get(Class c ,Serializable id)  ,  T load(Class c ,Serializable id)  

        • get采用的是立即加载,执行到这一行代码的时候就马上发送sql语句查询。
        • get查询后返回的是对象本身。
        • get查询找不到对象返回空
        • load采用的是延迟加载(懒加载),执行到这行代码的时候,不会发送sql语句,当使用到这个对象的时候才会发送sql语句.
        • load返回的是代理对象(非java动态代理,而是javasist技术产生的代理对象)
        • load查询找不到对象返回ObjectNotFoundException

    修改: void update(obj)

    //直接创建对象进行修改,没有被set的属性会被置为null,不推荐              

     //先查询再修改(推荐方式)

    删除:void delete(obj)

    //直接创建对象进行删除

    //先查询再删除(推荐方式,Hibernate下面有个级联删除,前提 是先查询再删除)

    保存或更新:void saveOrUpdate(obj)

    查询所有:

    //接收HQL,Hibernate Query Language 面向对象的查询语言
    Query query = session.createQuery("from Customer");

    //接收sql
    SQLQuery query2 = session.createSQLQuery("select * from cst_customer");

    代码:

    package com.Hidemo1;
    
    import java.util.Arrays;
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import com.HiUtils.HibernateUtils;
    /**
     * Hibernate入门
     *
     */
    public class HibernateDemo1 {
    
       @Test
       //保存客户的需求
       public void demo1(){
           //1 加载核心配置文件
           Configuration configuration = new Configuration().configure();
           //2 创建一个SessionFactory对象,相当于JDBC连接池
           SessionFactory sessionFactory = configuration.buildSessionFactory();
           //3 通过SessionFactory获取到Session对象:类似于JDBC重Connection
           Session session = sessionFactory.openSession();
           //4 手动开启事务
           Transaction transaction = session.beginTransaction();
           //5 编写代码
           Customer customer = new Customer();
           customer.setCust_name("王可可");
           session.save(customer);
           //6 事务提交
           transaction.commit();
           //7资源释放
           session.close();
       }
       
       @Test
       /*
        *Hibernate工具类测试
        */
       public void demo2(){
           Session session = HibernateUtils.openSession();      
           Transaction tx = session.beginTransaction();
           Customer customer = new Customer();
           customer.setCust_name("工具类测试");
           session.save(customer);
           tx.commit();
           session.close();
       }
       
       @Test
       /*
        * 查询操作
        */
       public void demo3(){
           Session session = HibernateUtils.openSession();
           Transaction transaction = session.beginTransaction();
           //使用get方法
    //       Customer customer = session.get(Customer.class, 1l);
           //使用load方法查询
           Customer customer = session.load(Customer.class, 1l);
           System.out.println(customer);
           
           transaction.commit();
           session.close();
       }
    @Test
    /* * 修改操作 */ public void demo4(){ Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); //直接创建对象进行修改,没有被set的属性会被置为null,不推荐 /*Customer customer = new Customer(); customer.setCust_id(1l); customer.setCust_name("wangkeke"); session.update(customer);*/ //先查询再修改(推荐方式) Customer customer = session.get(Customer.class, 1l); customer.setCust_name("王改改"); session.update(customer); transaction.commit(); session.close(); }
    @Test
    /* * 删除操作 */ public void demo5(){ Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); //直接创建对象进行删除,不推荐 /* Customer customer = new Customer(); customer.setCust_id(1l); session.delete(customer);*/ //先查询再删除(推荐方式) Customer customer = session.get(Customer.class, 2l); session.delete(customer); transaction.commit(); session.close(); }
    @Test
    /* * 保存或者更新 */ public void demo6(){ Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); customer.setCust_id(3l); customer.setCust_name("王改改"); session.saveOrUpdate(customer); transaction.commit(); session.close(); }
    @Test
    /* * 查询所有 */ public void demo7(){ Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); //接收HQL,Hibernate Query Language 面向对象的查询语言 Query query = session.createQuery("from Customer"); List<Customer> list = query.list(); for (Customer customer : list) { System.out.println(customer); } //接收sql SQLQuery query2 = session.createSQLQuery("select * from cst_customer"); List<Object[]> list2 = query2.list(); for (Object[] objects : list2) { System.out.println(Arrays.toString(objects)); } transaction.commit(); session.close(); } }

     Transaction对象:

    Hibernate中管理事务的对象。

    commit()

    rollback()

  • 相关阅读:
    (转)sysbench部署与参数详解
    (转)MySQL自带的性能压力测试工具mysqlslap详解
    (转)mysql双机热备的实现
    (转)linux运维必会MySQL企业面试题
    (转)MySQL出现同步延迟有哪些原因?如何解决?
    (转)mysql数据库高可用高扩展性架构方案实施
    java.IO
    String类的编码和解码问题
    编码表的概述和常见编码表
    05_打字游戏
  • 原文地址:https://www.cnblogs.com/ltfxy/p/10296670.html
Copyright © 2011-2022 走看看