欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Hibernate 【第一章 基础】

程序员文章站 2022-04-24 16:46:23
...

一、入门

1、创建数据库

create database test;

 

2、创建表

use test;
 
CREATE TABLE product_ (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(30) ,
  price float ,
  PRIMARY KEY (id)
) DEFAULT CHARSET=UTF8;

 

3、导入lib包

 

4、创建实体类,提供get/set

package com.cex.pojo;

public class Product {
    int id;
    String name;
    float price;
}

 

5、创建Product.hbm.xml文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.cex.pojo">
    <class name="Product" table="product_">
        <id name="id" column="id">
            <generator class="native">
            </generator>
        </id>
        <property name="name" />
        <property name="price" />
    </class>

</hibernate-mapping>

 

 

6、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>
        <!-- Database connection settings -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8</property>
        <property name="connection.username">root</property>
        <property name="connection.password">123456</property>
        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="current_session_context_class">thread</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <mapping resource="com/cex/pojo/Product.hbm.xml" />
    </session-factory>

</hibernate-configuration>

 

7、基本原理图

Hibernate 【第一章 基础】

 

hibernate.cfg.xml 配置文件提供链接数据库的基本信息

账号 密码 驱动 数据库ip 端口

Product.hbm.xml 提供对象与表的映射关系

对应哪个表? 什么属性对应什么字段

 

二、对象状态

实体类对象在Hibernate中有3种状态:分别是瞬时,持久和脱管

瞬时 指的是没有和hibernate发生任何关系,在数据库中也没有对应的记录,一旦JVM结束,这个对象也就消失了

持久 指得是一个对象和hibernate发生联系,有对应的session,并且在数据库中有对应的一条记录

脱管 指的是一个对象虽然在数据库中有对应的一条记录,但是它所对应的session已经关闭了

 

三、通过ID获取对象(get和load区别)

p

public class TestHibernate {
    public static void main(String[] args){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        Product product = (Product) session.get(Product.class,3);
        System.out.println("product的名字是:"+product.getName());

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

 

四、删除一条数据

public class TestHibernate {
    public static void main(String[] args){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        Product p = (Product) session.get(Product.class,2);
        session.delete(p);

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

 

五、更新一条对象

public class TestHibernate {
    public static void main(String[] args){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        Product p = (Product) session.get(Product.class,4);
        p.setName("iphone-modify");
        session.save(p);

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

 

六、使用HQL查询

public class TestHibernate {
    public static void main(String[] args){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        String name="iphone";
        Query q = session.createQuery("from Product p where p.name like ?");
        q.setString(0,"%"+name+"%");
        List<Product> list = q.list();
        for(Product p : list){
            System.out.println(p.getName());
        }
        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

 

Query 的 setString 方法 设置hql参数,使用类名,非表名

 

七、使用Criteria查询

使用Criteria进行数据查询。

与HQL和SQL的区别是Criteria 完全是 面向对象的方式在进行数据查询,将不再看到有sql语句的痕迹。

 

提供分页,从记录下标3开始,显示4条记录。

public class TestHibernate {
    public static void main(String[] args){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        String name="iphone";
        Criteria criteria = session.createCriteria(Product.class);
        criteria.add((Restrictions.like("name","%"+name+"%")));
        criteria.setFirstResult(3);
        criteria.setMaxResults(4);
        List<Product> list = criteria.list();
        for(Product p : list){
            System.out.println(p.getName());
        }

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}

 

 

八、使用标准sql查询

返回的集合里的每一个元素是一个对象数组。 然后再通过下标把这个对象数组中的数据取出来。

public class TestHibernate {
    public static void main(String[] args){
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();

        String name="iphone";
        String sql = "select * from Product_ p where p.name like '%"+name+"%'";
        Query q = session.createSQLQuery(sql);
        List<Object[]> list = q.list();
        for (Object[] os : list){
            for(Object o : os ){
                System.out.println(o);
            }
        }

        session.getTransaction().commit();
        session.close();
        sessionFactory.close();
    }
}