Hibernate框架入门(一)

Hibernate框架介绍

Hibernate是一个开源的对象关系映射(ORM)框架,对JDBC进行了非常轻量级的对象封装。将对象和数据库表建立映射关系,提供高性能的对象关系型持久化存储和查询的服务。

核心组件

HibernateAPI一共有6个,分别为:SessionSessionFactoryTransactionQueryCriteriaConfiguration。通过这些接口,可以对持久化对象进行存取、事务控制。

Session

Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。

SessionFactory

SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory

Transaction

Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移植。

Query

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

Criteria

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

Configuration

Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

代码实现

本篇Demo基于Hibernate5.3,mysql5.7;
Github地址:https://github.com/The-ProgramLife/Demo/tree/master/Hibernate

数据库的增删改查(CRUD)

创建数据库

create database test;

创建表

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

创建一个Java Maven Project


在pom.xml引入Hibernate和MySQL依赖
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>5.3.1.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.46</version>
		</dependency>

创建实体类
实体类 Product 用于映射数据库中的表product
package pojo;

import java.util.Set;

public class Product {

	private int id;
	private String name;
	private float price;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public float getPrice() {
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
	}

}

在同一个包中配置Product.hbm.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-5-30 16:02:52 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
	<class name="pojo.Product" table="PRODUCT">
		<id name="id" type="int">
			<column name="ID" />
			<generator class="native" />
		</id>
			<property name="name" type="java.lang.String">
			<column name="NAME" />
		</property>
		<property name="price" type="float">
			<column name="PRICE" />
		</property>

			</class>
</hibernate-mapping>

在src/main/java目录下配置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>
	
	    <!-- 数据库源 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.password">admin</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernatetest?characterEncoding=utf8&useSSL=true</property>
		<property name="hibernate.connection.username">root</property>
        
        <!-- 数据库方言 -->
		<property name="dialect">org.hibernate.dialect.MySQL57Dialect</property>
		<property name="show_sql">true</property>
		<property name="hbm2ddl.auto">update</property>

		
		<!-- 映射实体类配置文件 -->
		<mapping resource="pojo/Product.hbm.xml" />
			</session-factory>
</hibernate-configuration>

在主类中编写运行逻辑
基本步骤
1.获取SessionFactory
2.通过SessionFactory 获取一个Session
3.在Session基础上开启一个事务
4.通过调用Session的save方法把对象保存到数据库
5.提交事务
6.关闭Session
7.关闭SessionFactory
package Demo.Hibernate;

import pojo.Product;

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

		Product product1 = new Product();
		product1.setName("iphone7");
		product1.setPrice(7000);
		session.save(product1); // 插入数据

		Product product2 = (Product) session.get(Product.class, 0); // 获取数据
		System.out.println("id=1的产品名称是: " + product2.getName());

		Product product3 = (Product) session.get(Product.class, 0);
		session.delete(product3); // 删除数据

		Product product4 = (Product) session.get(Product.class, 0);
		product4.setName("iphone8");
		session.update(product4); // 更新數據   		
		
		session.getTransaction().commit();
		session.close();
		sessionFactory.close();
	}
}

对于查询操作Hibernate还提供了多种选择

1.使用HQL进行查询操作

HQL是Hibernate专门用于查询数据的语句,使用方法如下:

1.创建一个Query对象构建出HQL语句

2.设置参数

3.通过Query对象的getResultList()方法返回查询结果

Query<Product> query = session.createQuery("from Product p where p.name like ?0", Product.class); // 使用HQ进行模糊查询
		query.setParameter(0, "%iphone%");
		List<Product> products1 = query.getResultList();
		for (Product product : products1) {
			System.out.println(product.getName());
		}

2.使用Criteria进行查询操作

Criteria使用面向对象的方式进行数据查询,使用方法如下:

1.通过Session的createCriteria()方法创建一个Criteria对象

2.通过其add()方法添加约束

3.调用list()方法返回查询结果的集合

Criteria c= s.createCriteria(Product.class);
        c.add(Restrictions.like("name", "%"+name+"%"));
        List<Product> ps = c.list();
        for (Product p : ps) {
            System.out.println(p.getName());
        }

3.使用SQL语句进行查询操作

Hibernate依然保留对标准SQL语句的支持,使用方法如下:

1.通过Session的createSQLQuery()方法创建一个Query对象并构建出SQL语句

2.通过Query的list()方法返回查询结果集合

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

猜你喜欢

转载自blog.csdn.net/the_programlife/article/details/80548358