Hibernate相关知识点

Hibernate相关知识点

黄瑞生 0127

1.什么是hibernate?

Hibernate框架应用在Javaee三层结构中的dao层架构
在dao层里对数据库增删改查操作,使用hibernate实现增删改查操作,hibernate底层代码就是jdbc,hibernate对jdbc进行封装,使用hibernate的好处就是不需要写复杂的jdbc代码了。

2.什么是orm思想?

  1. hibernate使用orm思想对数据进行增删查改操作
  2. 在web阶段学习的javabean,更正确的叫法实体类
  3. Orm:objec relation mapping :对象关系映射
    让实体类和数据库表进行一一对应关系
    让实体类首先和数据库表对应
    再让实体类属性和表的字段对应
    不需要直接操作数据库表,而操作表对应实体类对象
    在这里插入图片描述
    类和表对应,类的属性和表对应,不需要操作表,操作对应的实体类对象就可以了,使用的是配置文件(xml)完成。

3. 使用hibernate的步骤:

1. 导入jar包
2. 创建实体类
3. 配置实体类和数据库表一一对应关系(映射关系)(建议在实体类中的包创建 叫做实体类名称.hbm.xml)
4. 在配置文件中首先引入xml约束
	<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
5. 创建hibernate核心配置文件

核心配置文件格式xml 核心配置文件名称和位置是固定的
位置必须在src下 名称必须为hibernate.cfg.xml
配置dtd约束
实现添加操作
第一步:加载hibernate核心配置文件

Configuration cfg=new Configuration();
			cfg.configure();

第二步:创建sessionfactory对象

SessionFactory sessionFactory = cfg.buildSessionFactory();

第三步:使用sessionfactory创建session对象

Session session =sessionFactory.openSession();

第四步:开启事务

Transaction tx=session.beginTransaction();

第五步:写具体的增删查改操作

User user=new User();
			user.setUsername("黄瑞生A");
			user.setPassword("345");
			user.setAddress("青秀");
session.save(user);

第六步:提交事务

tx.commit();

第七步:关闭资源

session.close();
			sessionFactory.close();	

4.hibernate API详解

Configuration:
Configuration cfg=new Configuration();
			cfg.configure();

(1)到src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面(加载核心配置文件)

SessionFactory:
SessionFactory sessionFactory = cfg.buildSessionFactory();
  1. 使用configuration对象创建sessionFactory对象
    (1) 创建sessionfcatory的时候会到数据库里根据映射关系把表创建
  2. 创建sessionFactory过程中非常耗资源所以在一个项目中一般创建一个sessionfactory对象
  3. 具体实现:
    (写一个工具类,写静态代码块实现)*静态代码块在类加载的时候执行,只执行一次
Session:
  1. 类似jdbc中的connection
  2. 调用session里面不同的方法实现增删查改操作
    (添加)save方法
    (修改)update方法
    (删除)delete方法
    (查询)根据id查询get方法
Transaction
  1. 事务对象
    Transaction tx=session.beginTransaction();
    2.事务提交和回滚
    Tx.commit();
    Tx.rollback();

5.Hibernate主键生成策略

1 hibernate要求实体类里面有一个属性作为唯一值,对应表主键,主键可以不同生成策略
2. hibernate主键生成策略有很多的值

<generator class=native></generator>

(1) native:根据使用的数据库帮选择用哪个值
(2) uuid:之前web阶段要我们写代码生成uuid值,配置了uuid以后hibernate帮我们生成一个uuid值

6.对实体类进行增删查改操作

添加操作
  1. 调用session里面的save方法实现
User user=new User();
		user.setUsername("黄瑞生B");
		user.setPassword("322");
		user.setAddress("北京");
		//调用session的方法实现添加
		session.save(user);	
根据id查询操作

1.调用session里面的get方法进行查询

	//第一个参数:实体类的class 第二个参数:id值
User user = session.get(User.class, "1");
	System.out.println(user);
根据id修改操作

1.调用session里面的update方法进行修改

//先查询出来再修改
		User user = session.get(User.class, 2);
		//向返回的user对象里面设置要修改的值
		user.setUsername("皮某人");
		//调用session的方法update进行修改
		session.update(user);
		System.out.println(user);
根据id删除操作

1.调用session的delete方法
//4.先查询出来再删除
//修改uid=2记录的username值
//先查询出来再删除

User user = session.get(User.class, 1);
session.delete(user);
System.out.println(user);

7.关于hibernate工具类hibernateUntils类

在创建sessionfactory的时候,如果此时数据库里没有表hibernate会帮我们在这时创建表,所以在创建sessionfactory的时候效率是非常低占资源非常大的,所以我们在一个项目中最好只创建一个sessionfactory,因此我们可以创建一个工具类hibernateuntils类,把创建sessionfatory的过程写在静态代码块static里,因为静态代码块在类进行加载的时候会执行并且只执行一次,然后提供getsessionfactory方法,以后需要使用就可以调用hibernateutils工具类的方法即可获得sessionfactory对象了

package com.hrs.utils;

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

public class HibernateUtils {//静态代码块实现
	static SessionFactory SessionFactory= null;
	static Configuration cfg=null;
	static {
		
		
		
		cfg=new Configuration();
		cfg.configure();
		 SessionFactory=cfg.buildSessionFactory();
	}
	
	//提供一个方法返回sessionfactory
	public static SessionFactory getSessionFactory() {
		return SessionFactory;
		
	}
	
}

8.多对多和一对多关系

一对多关系:

在这里插入图片描述
一对多关系映射配置:
第一步:创建实体类
客户实体类:

package com.hrs.entity;

import java.util.HashSet;
import java.util.Set;

public class Customer {
private Integer cid;
//客户名称
private String custName;
//客户级别
private String custLevel;
//客户来源
private String custSource;
//客户电话
private String custPhone;
//客户手机号
private String custMobile;
@Override
public String toString() {
	return "Customer [cid=" + cid + ", custName=" + custName + ", custLevel=" + custLevel + ", custSource=" + custSource
			+ ", custPhone=" + custPhone + ", custMobile=" + custMobile + ", setLinkman=" + setLinkman + "]";
}
//在客户实体类里面表示多个联系人,一个客户有多个联系人
//hibernate要求使用集合表示多的数据,使用set集合
private Set<Linkman> setLinkman=new HashSet<Linkman>();


public Set<Linkman> getSetLinkman() {
	return setLinkman;
}
public void setSetLinkman(Set<Linkman> setLinkman) {
	this.setLinkman = setLinkman;
}
public Integer getCid() {
	return cid;
}
public void setCid(Integer cid) {
	this.cid = cid;
}
public String getCustName() {
	return custName;
}
public void setCustName(String custName) {
	this.custName = custName;
}
public String getCustLevel() {
	return custLevel;
}
public void setCustLevel(String custLevel) {
	this.custLevel = custLevel;
}
public String getCustSource() {
	return custSource;
}
public void setCustSource(String custSource) {
	this.custSource = custSource;
}
public String getCustPhone() {
	return custPhone;
}
public void setCustPhone(String custPhone) {
	this.custPhone = custPhone;
}
public String getCustMobile() {
	return custMobile;
}
public void setCustMobile(String custMobile) {
	this.custMobile = custMobile;
}
}

Linkman实体类:

package com.hrs.entity;

public class Linkman {
private Integer lkm_id;//联系人编号(主键)
private String	lkm_name;//联系人姓名
private String	lkm_gender;//联系人性别
private String 	lkm_phone;//联系人电话
//在联系人实体类里面表示所属客户
private Customer customer;
public Customer getCustomer() {
	return customer;
}
public void setCustomer(Customer customer) {
	this.customer = customer;
}
public Integer getLkm_id() {
	return lkm_id;
}
public void setLkm_id(Integer lkm_id) {
	this.lkm_id = lkm_id;
}
public String getLkm_name() {
	return lkm_name;
}
public void setLkm_name(String lkm_name) {
	this.lkm_name = lkm_name;
}
public String getLkm_gender() {
	return lkm_gender;
}
public void setLkm_gender(String lkm_gender) {
	this.lkm_gender = lkm_gender;
}
@Override
public String toString() {
	return "Linkman [lkm_id=" + lkm_id + ", lkm_name=" + lkm_name + ", lkm_gender=" + lkm_gender + ", lkm_phone="
			+ lkm_phone + ", customer=" + customer + "]";
}
public String getLkm_phone() {
	return lkm_phone;
}
public void setLkm_phone(String lkm_phone) {
	this.lkm_phone = lkm_phone;
}

}

第二步:让两个实体类之间互相表示
在linkman表示customer:

private Customer customer;
public Customer getCustomer() {
	return customer;
}
public void setCustomer(Customer customer) {
	this.customer = customer;
}

在customer表示linkman:

private Set<Linkman> setLinkman=new HashSet<Linkman>();


public Set<Linkman> getSetLinkman() {
	return setLinkman;
}
public void setSetLinkman(Set<Linkman> setLinkman) {
	this.setLinkman = setLinkman;
}

第三步:配置实体类映射关系
customer映射配置:

<?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>
<!-- 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称 -->
<class name="com.hrs.entity.Customer" table="t_customer">
<id name="cid" column="cid" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="custName" column="custName" type="java.lang.String"></property>
<property name="custLevel" column="custLevel" type="java.lang.String"></property>
<property name="custSource" column="custSource" type="java.lang.String"></property>
<property name="custPhone" column="custPhone" type="java.lang.String"></property>
<property name="custMobile" column="custMobile" type="java.lang.String"></property>
<!-- 在客户映射文件中,表示所有联系人
使用set标签使用所有联系人,set标签里面有name属性,
属性值写在客户实体类里面表示联系人的set集合名称 -->
<set name="setLinkman">
<!-- 一对多建表有外键,hibernate机制:双向维护外键,在一和多的那一方都配置外键
column属性值:外键名称 -->
<key column="cid"></key>
<!-- 客户所有的联系人,class里面写联系人实体类全路径 -->
<one-to-many class="com.hrs.entity.Linkman"></one-to-many>
</set>
</class>
</hibernate-mapping>

customer实体类映射配置:

<?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>
<!-- 配置类和表对应
class标签
name属性:实体类全路径
table属性:数据库表名称 -->
<class name="com.hrs.entity.Linkman" table="t_linkman">
<id name="lkm_id" column="lkm_id" type="java.lang.Integer">
<generator class="native"></generator>
</id>
<property name="lkm_name" column="lkm_name" type="java.lang.String"></property>
<property name="lkm_gender" column="lkm_gender" type="java.lang.String"></property>
<property name="lkm_phone" column="lkm_phone" type="java.lang.String"></property>
<!-- 联系人所属的客户
	name属性:因为在联系人实体类使用customer对象表示,写customer名称
	class属性:customer全路径名
	column属性:外键名称
 -->
 <many-to-one name="customer" class="com.hrs.entity.Customer" column="cid"> </many-to-one>
</class>
</hibernate-mapping>

第四步:配置核心配置文件

	<mapping resource="com/hrs/entity/Customer.hbm.xml"></mapping>
		<mapping resource="com/hrs/entity/Linkman.hbm.xml"></mapping>

多对多关系:

在这里插入图片描述
第一步:创建实体类

第二步:让两个实体类之间互相表示
(1) 一个用户里面表示所有角色,使用set集合

private Set<Role> RoleSet =new HashSet<Role>();

(2) 一个角色里面表示所有用户,使用set集合

private Set<User> UserSet=new HashSet<User>();

第三步:配置映射关系
(1) 基本配置
(2) 配置多对多关系
Role.hbm.xml:

//name:另一方的集合 table:中间表名称
<set name="UserSet" table="user_role">
//column:本方外键名字
<key column="roleid"></key>
//class:另一方实体类全路径名 column:另一方外键名字
<many-to-many class="com.hrs.entity.User" column="useid"></many-to-many>
</set>

User.hbm.xml:

//name:另一方的集合 table:中间表名称
<set name="RoleSet" table="user_role" >
//column:本方外键名字
<key column="userid"></key>
//class:另一方实体类全路径名 column:另一方外键名字
<many-to-many class="com.hrs.entity.Role" column="roleid"></many-to-many>
</set>

第四步:在核心配置文件中引入映射文件

<mapping resource="com/hrs/entity/User.hbm.xml"></mapping>
	<mapping resource="com/hrs/entity/Role.hbm.xml"></mapping>

9.级联操作包括:all、save-update、none、delete

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值