Hibernate(一)来源与配置

一、什么是Hibernate
  Hibernate是一种ORM框架,全称为Object Relational Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!(MVC中的数据持久层->编写Dao层)
  ORM思想:
在这里插入图片描述
二、Hibernate的作用:
  通过配置文件(xml)或注解,使POJO和数据表中的字段存在映射关系,让Hibernate框架自动生成SQL语句
POJO:Plain Ordinary Java Object,简单的Java对象,有一些private的参数作为对象的属性。然后针对每个参数定义了get和set方法作为访问的接口

三、导入Hibernate的jar
  使用maven导入jar包(如果hibernate的jar包含了连接数据库的驱动包,则不需要外引)
在这里插入图片描述
  通过hibernate官网下载:http://hibernate.org/orm/releases/ 下载hibernate.final文件,hibernate.cfg.xml也在该文件里
四、实现POJO类到数据库表的映射关系
mvnproject结构:

在这里插入图片描述

1、通过xx.hbm.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<hibernate-mapping>
	<class name="test.User" table="hbn_user" ><!---映射对应的类,设定其在数据库中的表名->
		<id name="id" type="java.lang.Integer" >
			<!--主键生成策略-->
			<generator class="native"></generator>
		</id>		
<!--name是POJO类的属性名,column是数据库表中的字段名,默认和属性名一致,hibernate会补全type-->
		<property name="name" type="java.lang.String" column="name" length="10"/>
		<!--表的属性排列顺序受当前声明顺序影响-->
	</class>
</hibernate-mapping>

test.User.java

package test;

public class User {
	private int id;
	private String name;
	
	
	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;
	}
	
}

主键生成策略:

  1. increment:代理主键自增,由hibernate框架完成 , 原理 select max(id) , +1 作为新插入记录的id
    优点: 跨数据库 ,与数据库无关
    缺点: 存在线程问题
    注:生成数据表,内部没有对 id 自增,自增完全由Hibernate框架实现,如果数据库也设立了主键自增就会发生冲突
  2. identity:由底层数据库来管理生成,不由hibernate管理,
    注:mysql 和sql server可以,oracle不可以
  3. sequence:使用底层数据库序列机制,不由hibernate管理
    注:mysql不支持序列, oracle支持
  4. native:由底层数据库自己来决定使用什么策略,不由hibernate管理
    注:mysql — identity , oracle — sequence
  5. uuid ,采用随机32位字符串作为数据表主键值
  6. assigned 自然主键,需要在程序指定设置主键的列的值
    复合主键 (联合主键), 是一种特殊的自然主键, 定义Person 类数据 由 firstname和secondname 共同作为主键
    注:使用复合主键,PO类必须实现 java.io.Serializable 接口

主键分自然主键和代理主键

  1. 自然主键:在业务中有具体意义的主键,最后一种
  2. 代理主键,上面的前6个都属,没有具体意义,只是标识主键是唯一的。

2、通过注解annotation

package test;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Table
@Entity(name="hbn_book")
public class Book {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)	//主键自增策略
	//@GenericGenerator(name="myGenerator",strategy="uuid")		//主键生成器
	//@GeneratedValue(generator="myGenerator")	//使用生成器
	private int id;
	
	@Column(unique=true,length=20)
	private String name;

	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;
	}
	
	
}

@GeneratedValue指定了标识符的生成策略。JPA提供了4种标准用法。
  (1)AUTO:根据不同的数据库选择不同的策略。
  (2)TABLE:使用表保存id值。
  (3)INDENTITY:使用数据库自动生成主键(主要是自动增长类型,如MySql、SQLServer)
  (4)SEQUENCE:使用序列创建主键(如Oracle)生成表后数据库会多一张SEQUENCE表。

五、hibernate的配置,hibernate.cfg.xml(放置位置很重要/src/main/resources)
  有了xx.hbm.xml这个映射文件还不够,因为hibernate需要连接数据库,hibernate.cfg.xml就是这种公共的配置文件,加载数据库连接的信息,和将各种映射文件加载进来,因为有很多映射文件,每个映射文件都需要连接数据库等操作,所以就将共同的操作提取出来形成了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><!-- jdbcurl必须设置时区serverTimezone=GMT%2B8 -->
		<!-- 连接数据库及hibernate的方言配置 -->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/testconn?serverTimezone=GMT%2B8</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property><!-- 在该包下还有其他的Dialect -->
		<!-- 连接池的信息,非必要 -->
		<!-- hibernate的其他配置 -->
		<property name="hibernate.show_sql">true</property><!--在控制台中打印sql语句 -->
		<property name="hibernate.format_sql">true</property><!-- 打印前格式化sql一句 -->
		<!-- ddl策略 -->
		<property name="hibernate.hbm2ddl.auto">update</property>
		<!-- 设置是否自动提交事务 -->
		<property name="hibernate.connection.autoconmmit">false</property>
		<!-- 导入映射文件xml -->
		<mapping resource="test/User_hbm.xml"/>
		<!-- 注解@通过包下的类寻找注解 -->
		<mapping class="test.Book"/>
	</session-factory>


</hibernate-configuration>

hbm2ddl.auto: 生成表结构的策略配置

  • update(最常用的取值): 如果当前数据库中不存在表结构,那么自动创建表结构. 如果存在表结构,并且表结构与实体一致,那么不做修改,如果存在表结构,并且表结构与实体不一致,那么会修改表结构.会保留原有列.
  • create(很少):无论是否存在表结构.每次启动Hibernate都会重新创建表结构.(数据会丢失)
  • create-drop(极少): 无论是否存在表结构.每次启动Hibernate都会重新创建表结构.每次Hibernate运行结束时,删除表结构.
  • validate(很少):不会自动创建表结构.也不会自动维护表结构.Hibernate只校验表结构. 如果表结构不一致将会抛出异常.

六、使用hibernate的功能

package testall;

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

import test.Book;
import test.User;

public class testcfg {

	public static void main(String[] args) {
		//1、加载classpath下的hibernate.cfg.xml配置文件
		Configuration configure = new Configuration().configure();
		//2、创建会话连接工厂
		SessionFactory sessionFactory = configure.buildSessionFactory();
		//3、创建session
		Session session = sessionFactory.openSession();
		//4、开启事务
		Transaction transaction = session.beginTransaction();
		
		User user = new User();
		user.setName("Waylon");
		
		Book book = new Book();
		book.setName("Test");
		
		session.save(user);
		session.save(book);
		//5、提交事务
		transaction.commit();
		//6、关闭连接
		session.close();
		sessionFactory.close();
	}

}

Console部分截图:
在这里插入图片描述
通过Navicat查看数据库的变化
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值