记录Hibernate的搭建过程

Hibernate是ssh框架中的数据库部分,它采用的是ORM的思想即通过操作实体类对象去操作数据库。
PART_ONE:
记录下配置Hibernate的步骤:
1.下载Hibernate的jar包
这个可以自行到Hibernate官网中下载最新完整jar包


image.png

2.编写需要操作的实体类,我这里是客户类(Customer.class)
Customer.class:

public class Customer implements Serializable{

    private static final long serialVersionUID = 1L;
    private Integer id;
    private String name;
    private String gender;
    private Integer age;
    private String level;
    
    private Set<Order> orders = new HashSet<Order>();
    private Set<Role> roles = new HashSet<Role>();
    
    private Card card;
    
    
    
    
    public Card getCard() {
        return card;
    }
    public void setCard(Card card) {
        this.card = card;
    }
    public Set<Role> getRoles() {
        return roles;
    }
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
    public Set<Order> getOrders() {
        return orders;
    }
    public void setOrders(Set<Order> orders) {
        this.orders = orders;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getLevel() {
        return level;
    }
    public void setLevel(String level) {
        this.level = level;
    }
    @Override
    public String toString() {
        return "Customer [id=" + id + ", name=" + name + ", gender=" + gender
                + ", age=" + age + ", level=" + level + "]";
    }
    
}

3.创建客户类对应的hibernte对应数据库信息的xml(Customer.hbm.xml),这个文件与实体类处于同一位置下。
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">
 
<hibernate-mapping package="caixiaohao.entiy">   <!--所在类的包位置-->
 <class name="Customer" table="t_customer">
     <id name="id" column="c_id">
         <generator class="native"></generator>
     </id>
     <property name="name" column="c_name"></property>
     <property name="gender" column="c_gender"></property>
     <property name="age" column="c_age"></property>
     <property name="level" column="c_level"></property>
     
     <!--一对多配置-->
     <set name="orders">
         <key column="cust_id"></key>
         <one-to-many class="Order"/>
     </set>
     
     <!--多对多关系配置-->
     <set name="roles" table="t_user_roles">
         <key column="user_id"></key>
         <many-to-many class="Role" column="role_id"></many-to-many>
     </set>
     
     <!--一对一配置-->
     <one-to-one name="card" class="Card"></one-to-one>
     
 </class>


</hibernate-mapping>    

4.创建Hibernate的核心配置文件(hibernate.cfg.xml),这个文件放置在项目的src下。
hibernate.cfg.xml:

<?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>
        <!-- 1.连接数据库参数 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernatelearn</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password"></property>
        
        <!-- Hibernate整合c3p0 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!-- c3p0详细配置 -->
        <property name="c3p0.min_size">10</property>
        <property name="c3p0.max_size">20</property>
        
        <!-- hibernate方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        
        
        <!-- 2.hibernate扩展参数 -->
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>
        
        
        <!-- *.hbm.xml文件 -->
        <mapping resource="caixiaohao/entiy/Customer.hbm.xml"/>
        <mapping resource="caixiaohao/entiy/Order.hbm.xml"/>
        <mapping resource="caixiaohao/entiy/Role.hbm.xml"/>
        <mapping resource="caixiaohao/entiy/Card.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

5.将初始化的工作写成一个Hibernate的工具类(HibernateUtil.class)
HibernateUtil.class:

package Util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {
    public static Configuration cfg = null;
    public static SessionFactory factory = null;
    
    static {
        cfg = new Configuration();
        cfg.configure();
        factory = cfg.buildSessionFactory();
    }
    
    public static Session getSession() {
        return factory.openSession();
    }
    

}

6.可以进行对数据库的操作,在test类中测试。

@Test
    public void testSaveOrder() {
        Customer test = new Customer();
        test.setName("我是个测试);
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        session.save(test);
        tx.commit();
        session.close();
    }

PART_TWO:
对数据进行CRUD的操作,Hibernate提供了三种方式分别是Hql,criteria,Sql.
Hql方式的演示:

package doTest;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.jupiter.api.Test;

import Util.HibernateUtil;
import caixiaohao.entiy.Customer;

public class HqlTest {
    
    //全表查询
    @Test
    public void test1() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Customer");
        List<Customer> customers = query.list();
        for(Customer c : customers) {
            System.out.println(c);
        }
        tx.commit();
        session.close();    
    }
    
    //条件查询
    @Test
    public void test2() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Query query = session.createQuery("from Customer where c_name like '%胖%' ");
        List<Customer> customers = query.list();
        for(Customer c : customers) {
            System.out.println(c);
        }
        tx.commit();
        session.close();    
    }
    
    //条件查询2
        @Test
        public void test3() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Query query = session.createQuery("from Customer where c_name like ? ");
            query.setParameter(0, "%胖%");
            List<Customer> customers = query.list();
            for(Customer c : customers) {
                System.out.println(c);
            }
            tx.commit();
            session.close();    
        }
        
        //条件查询3
        @Test
        public void test4() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Query query = session.createQuery("from Customer where c_name like :name ");
            query.setParameter("name", "%豪%");
            List<Customer> customers = query.list();
            for(Customer c : customers) {
                System.out.println(c);
            }
            tx.commit();
            session.close();    
        }   
        
        //分页查询
        @Test
        public void test5() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Query query = session.createQuery("from Customer");
            query.setFirstResult(0);
            query.setMaxResults(4);
            List<Customer> customers = query.list();
            for(Customer c : customers) {
                System.out.println(c);
            }
            tx.commit();
            session.close();    
        }
        
        //聚合查询
        @Test
        public void test6() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Query query = session.createQuery("select count(*) from Customer");
            Long count = (Long) query.uniqueResult();
            System.out.println(count);
//          List<Customer> customers = query.list();
//          for(Customer c : customers) {
//              System.out.println(c);
//          }
            tx.commit();
            session.close();    
        }
        
        //投影查询
        @Test
        public void test7() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Query query = session.createQuery("select name from Customer");
            List<Object[]> customers = query.list();
            for(Object c : customers) {
                System.out.println(c);
            }
            tx.commit();
            session.close();    
        }

}

Criteria演示:

package doTest;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.junit.jupiter.api.Test;
import Util.HibernateUtil;
import caixiaohao.entiy.Customer;


public class CriteriaTest {
    //全表查询
    @Test
    public void test1() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
    
        Criteria ce = session.createCriteria(Customer.class);
        List<Customer> list = ce.list();
        for (Customer customer : list) {
            System.out.println(customer);
        }
        tx.commit();
        session.close();
    }
    //条件查询
        @Test
        public void test2() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
        
            Criteria ce = session.createCriteria(Customer.class);
            ce.add(Restrictions.like("name", "%胖%"));
            List<Customer> list = ce.list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
            tx.commit();
            session.close();
        }
        //分页查询
        @Test
        public void test3() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
        
            Criteria ce = session.createCriteria(Customer.class);
            ce.setFirstResult(2);
            ce.setMaxResults(3);
            List<Customer> list = ce.list();
            for (Customer customer : list) {
                System.out.println(customer);
            }
            tx.commit();
            session.close();
        }
        
        //聚合查询
        @Test
        public void test4() {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
        
            Criteria ce = session.createCriteria(Customer.class);
            ce.setProjection(Projections.count("id"));
            Integer count = (Integer)ce.uniqueResult();
            System.out.println(count);
//          List<Customer> list = ce.list();
//          for (Customer customer : list) {
//              System.out.println(customer);
//          }
            tx.commit();
            session.close();
        }
        
        //投影查询
                @Test
                public void test5() {
                    Session session = HibernateUtil.getSession();
                    Transaction tx = session.beginTransaction();
                
                    Criteria ce = session.createCriteria(Customer.class);
                    ProjectionList plist = Projections.projectionList();
                    plist.add(Property.forName("id"));
                    plist.add(Property.forName("name"));
                    ce.setProjection(plist);
                    
                    List<Object[]> list = ce.list();
                    for(Object[] objects : list) {
                        for(Object object : objects ) {
                            System.out.println(object);
                        }
                    }
                    
                    tx.commit();
                    session.close();
                }
}

Sql方式的演示:

package doTest;

import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.jupiter.api.Test;

import Util.HibernateUtil;

public class SqlTest {

    @Test
    public void test1() {
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();

        SQLQuery sqlQuery = session.createSQLQuery("select * from t_order");
        List<Object[]> list = sqlQuery.list();
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.print(object + "\t");
            }
            System.out.println();
        }

        tx.commit();
        session.close();
    }
}

PART_THREE
Hibernate整合C3P0:
1.在下好的Hibernate的jar中有C3P0的依赖jar


image.png

2.在hibernat.cfg.xml加入C3P0的配置

<!-- Hibernate整合c3p0 -->
        <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
        <!-- c3p0详细配置 -->
        <property name="c3p0.min_size">10</property>
        <property name="c3p0.max_size">20</property>

3.测试C3P0

package doTest;

import java.sql.Connection;
import java.sql.SQLException;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.jdbc.Work;

import Util.HibernateUtil;
import caixiaohao.entiy.Customer;
import caixiaohao.entiy.Order;

public class test {
    
    public static void main(String[] args) {
Session session = HibernateUtil.getSession();
        
        session.doWork(new Work(){

            @Override
            public void execute(Connection connection) throws SQLException {
                System.out.println(connection);
            }

            
        });
        
        
        session.close();
    }

}

结果


image.png

PART_FOUR
hibernate的配置就到此,它还有相关概念需要自行去深入了解,例如一级缓存,二级缓存,快照,session的瞬时态,持久态,脱管态,lazy加载还有其注释的方式去进行配置等等。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容

  • 目录 1. Hibernate框架的概述 1.1 Hibernate简介 1.2 为什么要学习Hibernate ...
    深海鱼Q阅读 1,019评论 0 14
  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 1,965评论 0 27
  • 本文包括: 1、CRM 项目的整体介绍 2、Hibernate 框架概述 3、Hibernate 快速入门 4、H...
    廖少少阅读 3,472评论 9 66
  • 文/阡陌三三 -01- 参加工作半年不到,小杨就因为工作表现出色,破格提拔成了他所在部门的负责人。这在他们单位历史...
    阡陌三三阅读 650评论 2 2
  • 今天看了陆川的电影《我们出生在中国》,感触良多。我觉得雪豹达娃的故事是要告诉我们这个世界有许多我们不得不面对的残...
    梦醒之间阅读 174评论 0 0