Hibernate介绍以及配置

1. 基本概念

Hibernate就是基于JAVA语言开发的,处于数据访问层的一套ORM开源框架,基本可以替代JDBC而存在,可以跨数据库平台,并且大大的减少了代码量。
Hibernate的本质就是封装了JDBC和SQL(用HQL替换SQL,自动分析数据库平台,生成对应的SQL)。
ORM就是把Object类型的数据映射到关系型数据库中,这样我们可以通过操作JAVA对象来达到操作数据库的目的。
[ORM:(Object Relation Mapping)对象关系映射]

JAVA对象(Object)Mapping 关系型数据库(Relation)
表名
属性字段
数据类型数据类型
对象表行

2.创建Hibernate
Hibernate下载地址:http://hibernate.org/orm/downloads/

2.1 创建实体类
创建一个简单的javabean来和表中的数据一一对应,必须提供一个默认构造器,必须对属性进行私有化封装(private+set/get),且最好使用包装类型替代基本数据类型(默认值影响体验)。

package com.xhh.pojo;
public class Member implements{
	private Long member_id;
	private String memberName;
	public Long getMember_id() {
		return member_id;
	}
	public void setMember_id(Long member_id) {
		this.member_id = member_id;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	@Override
	public String toString() {
		return "Menber [member_id=" + member_id + ", memberName=" + memberName + "]";
	}
	public Member() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Member(Long member_id, String memberName) {
		super();
		this.member_id = member_id;
		this.memberName = memberName;
	}
}

2.2 配置映射HBM

Member.hbm.xml映射文件负责将Member.java和数据库表连接映射起来,类名对应表名,属性名对应字段名头信息在手册[1.1.3. The mapping file]中查找。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN">
<hibernate-mapping>
	<class table="t_Member" name="com.xhh.pojo.Member"><!--配置类名和表名-->	
			<!--配置主键,name对应类中的属性,column对应数据库中的主键列名-->
			<id name="member_id">
				<generator class="native"/><!--MYSQL使用native,智能自增-->
			</id>
		<property name="memberName"/>
	</class>
</hibernate-mapping>

[属性详解]

标签名说明
name类中的属性
column表中的字段,如果column和name相同可以省略
type指定数据库列的数据类型,如integer、string等但是实际开发中不常用,因为hibernate可以根据pojo自动识别具体类型可以在手册中[5.2.2. Basic value types]中查询
ength=“10”指定数据库列的大小
not-null=“true”指定数据库列不能为空
unique-key=“username”指定数据库列唯一

[属性详解]

关键字生成机制备注
assigned手动代码来设置ID字段实际开发不会使用
increment先获取当前ID最大值 ,然后在最大值上加1,只当ID为数字类型时有效实际开发不会使用,有并发问题
identity自增生成,只当ID为数字类型时有效不适用于ORACLE,没有并发问题(有锁机制)
sequence序列,适用于ORACLE,需要事先创建序列。默认名hibernate_sequence
native智能自增,根据方言,自动分析选择对应数据库的自增生成机制。
uuid.hex自动生成一个36位随机不重复字符串,ID需要指定为字符串类型实际开发中常用,没有并发问题

2.3 配置全局CFG

新建工程,在classpath下创建hibernate.cfg.xml文件(hibernate.cfg.xml的命名和位置在原则上可以随便,但是没有hibernate.cfg.xml规范,且hibernate.cfg.xml是默认值)来统一管理数据库配置、可选配置、HBM注册、缓存配置等模块。

先在手册里找到xml配置文件头:
[hibernate-release-4.3.11.Final/documentation/manual/en-US/html/index.html]
[1.1.4 Hibernate configuration]

<?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>
        <!-- oracle连库信息-->
        <!-- oracle.jdbc.driver.OracleDriver-->
        <!-- jdbc:oracle:thin:@localhost:1521:ORCLJOE-->
        <!-- mysql连库信息-->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://127.0.0.1:3306/xhh</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <!-- 不同数据库的SQL都是有点差异的-->
        <!-- Hibernate可以根据数据库方言来自动调控这种差异-->
        <!-- 方言可以去手册中[3.4.1 SQL Dialects]中查找-->
        <!-- Oracle10g方言:org.hibernate.dialect.Oracle10gDialect-->
        <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
        
        <!-- 在控制台展示sql -->
        <property name="show_sql">true</property>
        <property name="format_sql">true</property>
        
        <!-- 匹配hbm文件 -->
        <mapping resource="Member.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

第三方连接池C3P0
hibernate给我们提供了一个内置的连接池,但是效果没有第三方连接池c3p0好。

<property name="c3p0.min_size">10</property><!-- 最小连接数 -->
<property name="c3p0.max_size">100</property><!-- 最大连接数 -->
<property name="c3p0.timeout">3000</property><!-- 3s钟仍未连接成功则直接失败 -->

配置自动DDL操作

<property name="hbm2ddl.auto">update</property>

有4种值可以替换update。

说明
none不执行任何操作
create每次执行hibernate时都删表建表
create-drop每次执行hibernate时都删表建表,sessionFactroy关闭的时候就删表。
validate每次执行hibernate时都验证数据库的表和mapping的关系是否正确。

tips:这个功能没什么太大用处,实际开发中就默认为none或者根本就不配置它。

2.4 JAVA造表

首先要创建一个hibernate/hibernate的帐号,然后利用JAVA代码来自动建表,hibernate的思想是JAVA完全控制,最好能通过JAVA代码来实现数据库的操作,包括创建表,但实际项目开发中,大部分公司仍习惯手动造表。

hibernate4.3.11Final造表

Configuration cfg = new Configuration().configure("/hibernate.cfg.xml");// 创建Configuration对象,绑定cfg文件
SchemaExport export = new SchemaExport(cfg);// 指定SchemaExport对象,负责导出数据库表(需要绑定Configuration对象)
export.create(true,true);// 创建数据库表,p1:是否在控制台显示,p2:是否要导出

2.5 Junit测试

// 创建Configuration对象,读取hibernate.cfg.xml文件 
// configure()中可以指定读取路径,如果不写,默认在classpath下寻找hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
// 创建ServiceRegistry对象,注册hibernate属性信息,属于hibernate4新特性
ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()).build();
// SessionFactory :是一个重量级对象,线程安全,负责创建session对象
// openSession():负责开启一个session连接
// session:是一次和数据库的会话,但不一定是一次连接,可能是多次
// 操作的是对象,影响的是数据库
Session session = cfg.buildSessionFactory(sr).openSession();
// beginTransaction():开启事物保护
Transaction transaction = session.beginTransaction();
// 准备数据
Event theEvent = new Event();
theEvent.setTitle("my title");
theEvent.setDate(new Date());
session.save(theEvent);
transaction.commit();// 提交事物
session.close();// 关闭session,节省资源

2.6 Hibernate测试工具类封装

工具类HibernateUtil.java源码

public class HibernateUtil {
	private static final SessionFactory sessionFactory = buildSessionFactory();
	private static SessionFactory buildSessionFactory() {
		Configuration configure = new Configuration().configure();// 绑定资源文件
		Properties properties = configure.getProperties();// 获取资源文件中的属性
		StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder();// 服务注册对象
		ServiceRegistry serviceRegistry = ssrb.applySettings(properties).build();// 注册
		return configure.buildSessionFactory(serviceRegistry);// 制造sessionFactory
	}
	/**
	 * 从classpath下的hibernate.cfg.xml文件中读取信息,然后创建一个SessionFactory
	 * @return SessionFactory
	 */
	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}
}

Junit测试

Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
Member member = new Member();
member.setTitle("xhh");
session.save(member);
transaction.commit();// 提交事物
session.close();// 关闭session,节省资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值