zoukankan      html  css  js  c++  java
  • hibernate介绍及环境搭建

    1.前言 

       hibernate与mybatis的位置一样,都是属于DAO层的框架,代替我们原来的JDBC操作数据库,属于ORM(object relationg mapping. 对象关系映射)框架。ORM分为四级,hibernate属于4级:完全面向对象操作数据库,mybatis属于2级,半自动化的ORM框架,dbutils属于1级。

    2.使用hibernate的好处

       操作数据库的时候,可以以面向对象的方式来完成.不需要书写SQL语句

    3.搭建开发环境

     1.导包:

    如果没有maven依赖的话需要导入hibernate下required目录下的包。

    或者直接采用maven项目,导入maven包地址如下:

            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.0.7.Final</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.37</version>
            </dependency>

    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=1 DEFAULT CHARSET=utf8;

    3.准备orm元数据

    结构

    Customer.java

    package cn.qlq.domain;
    
    
    public class Customer {
        
        /*
         * 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_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=1 DEFAULT CHARSET=utf8;
         */
        private Long cust_id;
        
        private String cust_name;
        private String cust_source;
        private String cust_industry;
        private String cust_level;
        private String cust_linkman;
        private String cust_phone;
        private String cust_mobile;
        public Long getCust_id() {
            return cust_id;
        }
        public void setCust_id(Long cust_id) {
            this.cust_id = cust_id;
        }
        public String getCust_name() {
            return cust_name;
        }
        public void setCust_name(String cust_name) {
            this.cust_name = cust_name;
        }
        public String getCust_source() {
            return cust_source;
        }
        public void setCust_source(String cust_source) {
            this.cust_source = cust_source;
        }
        public String getCust_industry() {
            return cust_industry;
        }
        public void setCust_industry(String cust_industry) {
            this.cust_industry = cust_industry;
        }
        public String getCust_level() {
            return cust_level;
        }
        public void setCust_level(String cust_level) {
            this.cust_level = cust_level;
        }
        public String getCust_linkman() {
            return cust_linkman;
        }
        public void setCust_linkman(String cust_linkman) {
            this.cust_linkman = cust_linkman;
        }
        public String getCust_phone() {
            return cust_phone;
        }
        public void setCust_phone(String cust_phone) {
            this.cust_phone = cust_phone;
        }
        public String getCust_mobile() {
            return cust_mobile;
        }
        public void setCust_mobile(String cust_mobile) {
            this.cust_mobile = cust_mobile;
        }
        @Override
        public String toString() {
            return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]";
        }
        
        
        
    
    }

    Customer.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属性:填写一个包名.在元素内部凡是需要书写完整类名的属性,可以直接写简答类名了. -->
    <hibernate-mapping package="cn.qlq.domain" >
        <!-- 
            class元素: 配置实体与表的对应关系的
                name: 完整类名
                table:数据库表名
         -->
        <class name="Customer" table="cst_customer" >
            <!-- id元素:配置主键映射的属性
                    name: 填写主键对应属性名
                    column(可选): 填写表中的主键列名.默认值:列名会默认使用属性名
                    type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                            每个类型有三种填法: java类型|hibernate类型|数据库类型
                    not-null(可选):配置该属性(列)是否不能为空. 默认值:false
                    length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
             -->
            <id name="cust_id"  >
                <!-- generator:主键生成策略 -->
                <generator class="native"></generator>
            </id>
            <!-- property元素:除id之外的普通属性映射
                    name: 填写属性名
                    column(可选): 填写列名
                    type(可选):填写列(属性)的类型.hibernate会自动检测实体的属性类型.
                            每个类型有三种填法: java类型|hibernate类型|数据库类型
                    not-null(可选):配置该属性(列)是否不能为空. 默认值:false
                    length(可选):配置数据库中列的长度. 默认值:使用数据库类型的最大长度
             -->
            <property name="cust_name" column="cust_name" >
                <!--  <column name="cust_name" sql-type="varchar" ></column> -->
            </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_linkman" column="cust_linkman" ></property>
            <property name="cust_phone" column="cust_phone" ></property>
            <property name="cust_mobile" column="cust_mobile" ></property>
        </class>
    </hibernate-mapping>

    4.classpath目录下编写hibernate.cfg.xml文件(或者hibernate.properties文件,两者作用一样,早期版本你的hibernate采用properties文件进行配置,目前采用xml进行配置)

    例如我们采用hibernate.cfg.xml配置文件: (头引入的是3.0.dtd是为了兼容旧版本,有时候这个会有区别)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
        
            <!-- 
            #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
             -->
             <!-- 数据库驱动 -->
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
             <!-- 数据库url -->
            <property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
             <!-- 数据库连接用户名 -->
            <property name="hibernate.connection.username">sa</property>
             <!-- 数据库连接密码 -->
            <property name="hibernate.connection.password">123456</property>
            <!-- 数据库方言
                不同的数据库中,sql语法略有区别. 指定方言可以让hibernate框架在生成sql语句时.针对数据库的方言生成.
                sql99标准: DDL 定义语言  库表的增删改查
                          DCL 控制语言  事务 权限
                          DML 操纵语言  增删改查
                注意: MYSQL在选择方言时,请选择最短的方言.
             -->
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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        自动建表.每次框架运行都会创建新的表.以前表将会被覆盖,表数据会丢失.(开发环境中测试使用)
            #hibernate.hbm2ddl.auto create-drop 自动建表.每次框架运行结束都会将所有表删除.(开发环境中测试使用)
            #hibernate.hbm2ddl.auto update(推荐使用) 自动生成表.如果已经存在不会再生成.如果表有变动.自动更新表(不会删除任何数据).
            #hibernate.hbm2ddl.auto validate    校验.不自动生成表.每次启动会校验数据库中表是否正确.校验失败.
             -->
            <property name="hibernate.hbm2ddl.auto">update</property>
            <!-- 引入orm元数据
                路径书写: 填写src下的路径
             -->
            <mapping resource="cn/qlq/domain/Customer.hbm.xml" />
            
        </session-factory>
    </hibernate-configuration>

    必选配置
      4+1 方言
    可选配置
      显示sql
      格式化sql
      自动生成表
        |- update
    orm元数据引入
      <mapping resource="" />

    补充:

              jdbc:mysql:///company   等同于    jdbc:mysql://localhost:3306/company company 

         指的是数据库名称也就是说第三个'/'代表 'localhost:3306/'       

             "/"其实就是说从根目录开始的意思。

     4.书写代码进行测试

     1.测试构建会话工厂  (如果表不存在会自动创建表)

    package cn.qlq.util;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.service.ServiceRegistry;
    
    public class Test {
    
        public static void main(String[] args) {
            //3.3以及之前的版本构建会话工厂对象
    //        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            
            //5.0之后获取SessionFactory
            //创建服务注册对象
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
            SessionFactory  sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
              
            System.out.println(sessionFactory);
        }
    
    }

    日志信息:

    七月 18, 2018 11:58:34 下午 org.hibernate.Version logVersion
    INFO: HHH000412: Hibernate Core {5.0.7.Final}
    七月 18, 2018 11:58:34 下午 org.hibernate.cfg.Environment <clinit>
    INFO: HHH000206: hibernate.properties not found
    七月 18, 2018 11:58:34 下午 org.hibernate.cfg.Environment buildBytecodeProvider
    INFO: HHH000021: Bytecode provider name : javassist
    七月 18, 2018 11:58:35 下午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
    INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
    七月 18, 2018 11:58:39 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
    WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
    七月 18, 2018 11:58:39 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql:///hibernate]
    七月 18, 2018 11:58:39 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH10001001: Connection properties: {user=sa, password=****}
    七月 18, 2018 11:58:39 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH10001003: Autocommit mode: false
    七月 18, 2018 11:58:39 下午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
    INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
    七月 18, 2018 11:58:40 下午 org.hibernate.dialect.Dialect <init>
    INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
    七月 18, 2018 11:58:41 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: HHH000228: Running hbm2ddl schema update
    org.hibernate.internal.SessionFactoryImpl@4e38854
    1

    2.测试保存数据

      注意:

      获取会话工厂可以用3.0或者5.0获取会话工厂的方法,但是不可以用4.0获取的方法,会报错Unknown entity: cn.qlq.domain.Customer。

      也就是5.0兼容3.0版本的获取活化工厂的方式。

    package cn.qlq.util;
    
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.service.ServiceRegistry;
    
    import cn.qlq.domain.Customer;
    
    public class Test {
    
        public static void main(String[] args) {
            //3.3以及之前的版本构建会话工厂对象
    //        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
            
            //5.0之后获取SessionFactory
            //创建服务注册对象
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
            //创建会话工厂对象
            SessionFactory  sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
              
            
            //获取session对象
            Session session = sessionFactory.openSession();
            //开启事务
            Transaction tx = session.beginTransaction();
            //保存对象
            Customer customer = new Customer();
            customer.setCust_name("测试名称222");
            session.save(customer);
            tx.commit();
            //关闭流
            session.close();
            sessionFactory.close();
        }
    
    }

    结果:

    七月 19, 2018 12:18:33 上午 org.hibernate.Version logVersion
    INFO: HHH000412: Hibernate Core {5.0.7.Final}
    七月 19, 2018 12:18:33 上午 org.hibernate.cfg.Environment <clinit>
    INFO: HHH000206: hibernate.properties not found
    七月 19, 2018 12:18:33 上午 org.hibernate.cfg.Environment buildBytecodeProvider
    INFO: HHH000021: Bytecode provider name : javassist
    七月 19, 2018 12:18:34 上午 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
    INFO: HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
    七月 19, 2018 12:18:38 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
    WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
    七月 19, 2018 12:18:38 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH10001005: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql:///hibernate]
    七月 19, 2018 12:18:38 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH10001001: Connection properties: {user=sa, password=****}
    七月 19, 2018 12:18:38 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
    INFO: HHH10001003: Autocommit mode: false
    七月 19, 2018 12:18:38 上午 org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
    INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
    七月 19, 2018 12:18:39 上午 org.hibernate.dialect.Dialect <init>
    INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
    七月 19, 2018 12:18:41 上午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: HHH000228: Running hbm2ddl schema update
    Hibernate: 
        insert 
        into
            cst_customer
            (cust_name, cust_source, cust_industry, cust_level, cust_linkman, cust_phone, cust_mobile) 
        values
            (?, ?, ?, ?, ?, ?, ?)
    七月 19, 2018 12:18:42 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
    INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql:///hibernate]

     至此,采用hibernate实现了简单的添加。

     

    5.API解释:

    Configuration 读取配置
    sessionFactory 创建session
    Session 获得事务操作对象,以及数据增删改查
    Transaction 控制事务.

    • Configuration对象
    package cn.itheima.b_api;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import cn.itheima.domain.Customer;
    
    //学习Configuration对象
    // Configuration功能: 配置加载类.用于加载主配置文件,orm元数据加载
    public class Demo {
    
        @Test
        public void fun1(){
            //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详解(一个web项目要保证一个SessionFactory,单例模式)
    package cn.itheima.b_api;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import cn.itheima.domain.Customer;
    
    //学习SessionFactory对象
    // SessionFactory功能: 用于创建操作数据库核心对象session对象的工厂.
    //                     简单说功能就一个---创建session对象
    //注意:1.sessionfactory 负责保存和使用所有配置信息.消耗内存资源非常大.
    //      2.sessionFactory属于线程安全的对象设计.
    //结论: 保证在web项目中,只创建一个sessionFactory.
    public class Demo2 {
    
        @Test
        public void fun1(){
            //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();
            //--------------------------------------------------
            //5 获得session
            //打开一个新的session对象
            sf.openSession();
            //获得一个与线程绑定的session对象
            sf.getCurrentSession();
        }
    }
    • Session对象
    package cn.itheima.b_api;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    import org.junit.Test;
    
    import cn.itheima.domain.Customer;
    
    //学习Session对象
    //session对象功能: 表达hibernate框架与数据库之间的连接(会话).session类似于
    //                JDBC年代的connection对象. 还可以完成对数据库中数据的增删改查操作.
    //                session是hibernate操作数据库的核心对象
    public class Demo3 {
    
        @Test
        //事务操作
        public void fun1(){
            //1 创建,调用空参构造
            Configuration conf = new Configuration().configure();
            //2 根据配置信息,创建 SessionFactory对象
            SessionFactory sf = conf.buildSessionFactory();
            //3 获得session
            Session session = sf.openSession();
            //4 session获得操作事务的Transaction对象
            //获得操作事务的tx对象
            //Transaction tx = session.getTransaction();
            //开启事务并获得操作事务的tx对象(建议使用)
            Transaction tx2 = session.beginTransaction();
            //----------------------------------------------
            
            
            //----------------------------------------------
            tx2.commit();//提交事务
            tx2.rollback();//回滚事务
            session.close();//释放资源
            sf.close();//释放资源
        }
        
        @Test
        //session的新增
        public void fun2(){
            //1 创建,调用空参构造
            Configuration conf = new Configuration().configure();
            //2 根据配置信息,创建 SessionFactory对象
            SessionFactory sf = conf.buildSessionFactory();
            //3 获得session
            Session session = sf.openSession();
            //4 session获得操作事务的Transaction对象
            //获得操作事务的tx对象
            //Transaction tx = session.getTransaction();
            //开启事务并获得操作事务的tx对象(建议使用)
            Transaction tx2 = session.beginTransaction();
            //----------------------------------------------
            Customer c = new Customer();
            c.setCust_name("测试");
            
            session.save(c);
            //----------------------------------------------
            tx2.commit();//提交事务
            session.close();//释放资源
            sf.close();//释放资源
        }
        @Test
        //session的查询
        //查询id为1的customer对象
        public void fun3(){
            //1 创建,调用空参构造
            Configuration conf = new Configuration().configure();
            //2 根据配置信息,创建 SessionFactory对象
            SessionFactory sf = conf.buildSessionFactory();
            //3 获得session
            Session session = sf.openSession();
            //4 session获得操作事务的Transaction对象
            //获得操作事务的tx对象
            //Transaction tx = session.getTransaction();
            //开启事务并获得操作事务的tx对象(建议使用)
            Transaction tx2 = session.beginTransaction();
            //----------------------------------------------
            
            Customer customer = session.get(Customer.class, 1l);
            
            System.out.println(customer);
            //----------------------------------------------
            tx2.commit();//提交事务
            session.close();//释放资源
            sf.close();//释放资源
        }
        @Test
        //session的修改
        //修改id为1的customer对象的name属性为黑马程序员
        public void fun4(){
            //1 创建,调用空参构造
            Configuration conf = new Configuration().configure();
            //2 根据配置信息,创建 SessionFactory对象
            SessionFactory sf = conf.buildSessionFactory();
            //3 获得session
            Session session = sf.openSession();
            //4 session获得操作事务的Transaction对象
            //获得操作事务的tx对象
            //Transaction tx = session.getTransaction();
            //开启事务并获得操作事务的tx对象(建议使用)
            Transaction tx2 = session.beginTransaction();
            //----------------------------------------------
            //1 获得要修改的对象
            Customer c = session.get(Customer.class, 1l);
            //2 修改
            c.setCust_name("程序员一枚");
            //3 执行update
            session.update(c);
            //----------------------------------------------
            tx2.commit();//提交事务
            session.close();//释放资源
            sf.close();//释放资源
        }
        @Test
        //session的删除
        //删除id为1的customer对象
        public void fun5(){
            //1 创建,调用空参构造
            Configuration conf = new Configuration().configure();
            //2 根据配置信息,创建 SessionFactory对象
            SessionFactory sf = conf.buildSessionFactory();
            //3 获得session
            Session session = sf.openSession();
            //4 session获得操作事务的Transaction对象
            //获得操作事务的tx对象
            Transaction tx = session.getTransaction();
            tx.begin();
            //开启事务并获得操作事务的tx对象(建议使用)
            Transaction tx2 = session.beginTransaction();
            //----------------------------------------------
            //1 获得要修改的对象
            Customer c = session.get(Customer.class, 1l);
            //2 调用delete删除对象
            session.delete(c);
            //----------------------------------------------
            tx2.commit();//提交事务
            session.close();//释放资源
            sf.close();//释放资源
        }
    }

    6.抽取公共类

      我们发现上面有大量重复的代码,可以将上面的代码进行抽取。抽取获取session的代码

    package cn.qlq.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.MetadataSources;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.service.ServiceRegistry;
    
    public class HibernateUtils {
    
        private static SessionFactory sessionFactory;
    
        // 创建一个对象,一个web项目只有一个SessionFactory
        static {
            // 3.3以及之前的版本构建会话工厂对象
            // SessionFactory sessionFactory = new
            // Configuration().configure().buildSessionFactory();
    
            // 5.0之后获取SessionFactory
            // 创建服务注册对象
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().configure().build();
            // 创建会话工厂对象
            sessionFactory = new MetadataSources(serviceRegistry).buildMetadata().buildSessionFactory();
        }
    
        // 获得session => 获得全新session
        public static Session openSession() {
            return sessionFactory.openSession();
        }
    
        // 获得session => 获得与线程绑定的session
        public static Session getCurrentSession() {
            return sessionFactory.getCurrentSession();
        }
    
        /**
         * 测试方法
         * 
         * @param args
         */
        public static void main(String[] args) {
            System.out.println(HibernateUtils.openSession());
        }
    
    }
  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/9333562.html
Copyright © 2011-2022 走看看