Hibernate的学习

一.HIbernate框架介绍

什么是Hibernate:

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
什么是ORM:
对象关系映射(英语:Object Relation Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言不同类型系统的数据之间的转换。
对象-关系映射,是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
为什么使用Hibernate框架:
1.Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度简化了dao层编码工作。
总结:HIbernate是企业级开发中的主流框架,映射的灵活性很出色,它支持很多关系型数据库。
Hibernate框架的学习目标:

  • 创建项目,搭建Hibernate开发环境
  • 掌握Hibernate常用API,即如何使用Hibernate框架进行开发
  • 掌握Hibernate关系映射,即如何解决表与表之间的关系问题,有一对一,一对多等各种关系
  • 掌握Hibernate的查询
  • 提高Hibernate的效率

二.Hibernate的开发

1.创建持久化类
2.创建对象-关系映射文件
3.创建Hibernate配置文件
4.通过Hibernate API编写访问数据库的代码

三.Hibernate的第一个小程序

下载Hibernate的JAR包:


Hibernate-JAR.png

创建实体类:

package com.ljf.pojo;
public class Product {
    private Integer id;    //产品id
    private String name;   //产品名称
    private Integer price; //产品价格
    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 Integer getPrice() {
        return price;
    }
    public void setPrice(Integer price) {
        this.price = price;
    }
}

配置Product.hbm.xml:
在com.ljf.pojo下新建一个Product.hbm.xml,用于映射Product类对应数据库中的Product表
注:文件名Product.hbm.xml中P一定要大写,要和类保持一致





    
        
            

            
        
        
        
    


配置hibernate.cfg.xml:
在src目录下创建 hibernate.cfg.xml
配置访问数据库要用到的驱动,url,账号密码等等
其他配置及含义:

org.hibernate.dialect.MySQLDialect
这告诉hibernate底层用的是什么数据库。
thread
这是hibernate事务管理方式,即每个线程一个事务
true
这表示是否在控制台显示执行的sql语句
update
这表示是否会自动更新数据库的表结构,有这句话,其实是不需要创建表的,因为hibernate会自动创建表结构

这表示hibernate会去识别Product这个实体类






    
        
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/testtwo?characterEncoding=UTF-8
        utf-8
        root
        123456
        
        org.hibernate.dialect.MySQLDialect

        
        thread
        
        true

        
        update

        
        
        
    


三、测试类TestHibernate

创建一个Product对象,并通过hibernate把这个对象,插入到数据库中
hibernate的基本步骤是:
1.获取SessionFactory
2.通过SessionFactory获取一个session
3.在Session基础上开启一个事务
4.通过Session的save方法把对象保存到数据库
5.提交事务
6.关闭Session
7.关系SessionFactory
代码如下:

package com.ljf.test;

import com.ljf.pojo.Category;
import com.ljf.pojo.Product;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;

import java.util.List;


public class TestHibernate {

    public static void main(String[] args) {

        //标准配置,配置hibernate的session
        SessionFactory sf = new Configuration().configure().buildSessionFactory();
        Session s = sf.openSession();
        s.beginTransaction();


       //用for循环完成数据的多条插入
        /*
        for (int i = 1; i < 7; i++) {
            Product p = new Product();
            p.setName("iphone7"+i);
            p.setPrice(7000+i);
            s.save(p);
        }
        */

        //获取第6条的数据,并将数据显示出来
        /*
        Product p =(Product) s.get(Product.class,6);
        System.out.println("id为6的产品名称是:"+p.getName()+"\n价格为:"+p.getPrice());
        */


        //实体对象在Hibernate中有三种状态,分别是瞬时,持久,脱管
        //瞬时:指的是没有和HIbernate发生任何关系,在数据库中也没有对应的记录,一但JVM结束,这个对象也就消失了
        //持久:指的是一个对象和Hibernate发生联系,有对应的session,并且在数据库中有对应的一条记录
        //脱管:指的是一个对象虽然在数据库中有对应的一条记录,但是它所对应的session已经关闭了
        /*
        Product p = new Product();
        p.setName("p1");
        System.out.println("此时p是瞬时状态");
        s.save(p);
        System.out.println("此时p是持久状态");
        s.getTransaction().commit();
        s.close();
        System.out.println("此时p是托管状态");
        sf.close();
        */

     

        //读取第5条的数据,并实现删除
        /*
        Product p = (Product)s.get(Product.class,5);
        s.delete(p);
        System.out.println("第5条数据删除成功");
        */

        //修改第三条的数据
        /*
        Product p =(Product)s.get(Product.class,3);
        System.out.println("修改前的名字:"+p.getName());
        p.setName("hhahhahahha");
        s.update(p);
        */

        /*HQL(Hibernate Query Language)是Hibernate
        专门用于查询数据的语句,有别于SQL,HQL更加接近面向对象的思维方式
        比如使用类的名字Product,而非表格的名字product
        String name = "iphone";
        Query q =s.createQuery("from Product p where p.name like ?");
        q.setString(0,"%"+name+"%");
        List products = q.list();
        int i=0;
        for (Product p : products){
            i = i + 1;
            System.out.println(p.getName());
        }
        System.out.println("总共有"+i+"条记录");
        */

        /*
        使用Criteria进行数据查询,与HQL和SQL的区别是
        Criteria完全是面向对象的方式在进行数据查询,将不再看到sql语句的痕迹
        使用Criteria查询数据
        1.通过session的createCriteria创建一个Criteria对象
        2.Criteria.add增加约束。在本例中增加一个对name的模糊查询(like)
        3.调用list()方法返回查询结果的集合
        除此之外,Criteria还可以很方便的进行分页查询和获取总数

        String name = "iphone";
        Criteria c = s.createCriteria(Product.class);
        c.add(Restrictions.like("name","%"+name+"%"));
        List ps = c.list();
        int i=0;
        for (Product p : ps) {
            i = i + 1;
            System.out.println(p.getName());
        }
        System.out.println("总共有"+i+"条记录");
        */

        /*通过标准SQL语句进行查询
        * HIbernate依然保留对标准SQL语句的支持,在一些场合,比如多表联合查询,并且有分组统计函数的
        * 情况下,标准sql语句依然是效率较高的一种选择

        //为什么会报错,不明白
        String name = "iphone";
        String sql = "select * from product p where p.name like '%"+name+"%'";
        Query q = s.createQuery(sql);
        List list = q.list();
        for (Product ps : list){
            for (Object filed : os){
                System.out.println(filed+"\t");
            }
            System.out.println();
        }

        //正确的语句
        String name = "iphone";
        String sql = "select * from product p where p.name like '%"+name+"%'";
        Query q= s.createSQLQuery(sql);
        List list= q.list();
        for (Object[] os : list) {
            for (Object filed: os) {
                System.out.print(filed+"\t");
            }
            System.out.println();
        }
        */

        /*一个Product对应一个Category
        * 一个Product对应多个Product
        * 所以Product和Category是多对一的关系*/
        Category c = new Category();
        c.setName("测试");
        s.save(c);
        Product p = (Product) s.get(Product.class,8);
        p.setCategory(c);
        s.update(p);

        s.getTransaction().commit();
        s.close();
        sf.close();
    }
}

四、基本原理图

应用程序通过Hibernate把一个Product对象插入到数据库的product表中
hibernate.cfg.xml配置文件提供数据库的基本信息
Product.hbm.xml提供对象与表的映射关系
对应哪个表?什么属性,对应什么字段


image.png

你可能感兴趣的:(Hibernate的学习)