Hibernate入门1 - Hibernate概述及第一个小例子
一、什么是ORM?
ORM,即Object Relational Mapping。我们知道,利用面向对象的思想编写的数据库应用程序最终都是把对象信息保存在关系型数据库中,于是需要编写与底层数据库相关的SQL语句,显然这与面向对象的思想格格不入。
编写大量底层SQL语句不好之处:
1.不同数据库使用的SQL语法略有不同。比如:PL/SQL与T-SQL。
2.程序过分依赖SQL对程序的移植与扩展,维护等带来很大的麻烦。
使用ORM框架技术就可以彻底抛弃SQL语句,使我们完全使用面向对象的思想开发软件。
二、Hibernate简介
Hibernate是Java领域一款开源的ORM框架。它对JDBC进行了非常轻量级的对象封装,也就说Hibernate最终还是通过JDBC进行数据库的操作。Hibernate在项目中扮演持久化层的角色,将业务逻辑层中的对象数据保存到数据库表中。
三、第一个Hibernate例子
使用Hibernate之前要准备好Hibernate相关jar包。Hibernate jar包
创建Hibernate项目主要步骤:
1.创建Hibernate配置文件
2.创建持久化类
3.创建对象-关系映射文件
4.通过Hibernate API编写访问数据库的代码
--------------------------------------------------------------------------------------------------------------------------------------------
下面开始编写第一个Hibernate例子。
① 创建项目HibernateDemo,并导入Hibernate相关jar包,mysql驱动jar包,Junit jar包。
② 在src下创建Hibernate配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库用户 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库密码 -->
<property name="hibernate.connection.password">botao521</property>
<!-- 数据库链接 -->
<property name="hibernate.connection.url">jdbc:mysql://localhost/hibernate_demo?user=root&password=botao521&unicode=true&characterEncodeing=utf-8</property>
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 在控制台中输出sql -->
<property name="show_sql">true</property>
<!-- 格式化控制台中的sql -->
<property name="format_sql">true</property> <!--
hbm2ddl.auto的作用为:自动创建/更新/验证数据库表结构
有以下值:
create: 表示启动的时候先drop,再create
create-drop: 也表示创建,只不过再系统关闭前执行一下drop
update: 这个操作启动的时候会去检查schema是否一致,如果不一致会做scheme更新
validate: 启动时验证现有schema与你配置的hibernate是否一致,如果不一致就抛出异常,并不做更新
-->
<property name="hbm2ddl.auto">create</property> <!-- 引入对象-关系映射文件 -->
<mapping resource="com/cbt/bean/Student.hbm.xml" />
</session-factory>
</hibernate-configuration>
③ 创建持久化类Student.java
package com.cbt.bean; import java.util.Date; /**
* 学生类
* @author caobotao
*/
public class Student {
private int sid; //学号
private String sname; //姓名
private String gender; //性别
private Date birthday; //出生日期
private String address;//地址 public Student(){}
public Student(int sid, String sname, String gender, Date birthday,
String address) {
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
} public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
④ 创建对象-关系映射文件Student.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">
<hibernate-mapping>
<!-- JavaBean与对应的表名 -->
<class name="com.cbt.bean.Student" table="STUDENT">
<!-- 主键 -->
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" />
</id>
<!-- 字段 -->
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<!-- 字段 -->
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<!-- 字段 -->
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<!-- 字段 -->
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
</class>
</hibernate-mapping>
⑤ 在hibernate.cfg.xml中引入Student.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory> ...... <!-- 引入对象-关系映射文件 -->
<mapping resource="com/cbt/bean/Student.hbm.xml" /> </session-factory>
</hibernate-configuration>
⑥ 在mysql中创建数据库 hibernate_demo
create database hibernate_demo;
⑦ 通过Hibernate API访问操作数据库
1> 创建配置对象
Configuration config = new Configuration().configure();
2> 创建服务注册对象
ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
3> 创建会话工厂对象
sessionFactory = config.buildSessionFactory(service);
4> 打开会话
session = sessionFactory.openSession();
5> 开启事务
transaction = session.beginTransaction();
使用Junit编写测试类StudentTest.java
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.cbt.bean.Student; @SuppressWarnings("deprecation")
public class StudentTest {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction; @Before
public void before(){
//创建配置对象
Configuration config = new Configuration().configure();
//创建服务注册对象
ServiceRegistry service = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
//创建会话工厂对象
sessionFactory = config.buildSessionFactory(service);
//创建会话对象
session = sessionFactory.openSession();
//开启事务
transaction = session.beginTransaction();
} @After
public void after(){
transaction.commit(); //提交事务
session.close(); //关闭会话
sessionFactory.close(); //关闭会话工厂
} @Test
public void testSaveStudent() {
//创建学生对象
Student s = new Student(1,"张三","男",new Date(),"武当山");
/*
* 由于hibernate.cfg.xml中配置的hbm2ddl.auto值为'Create',所以执行save
* 方法会检查数据库中是否有student表,没有的话会创建此表,并将s对象保存进去
*/
session.save(s);
} }
运行测试用例,会发现控制台打印出下列SQL语句,在数据库中有一个STUDENT表被创建,以及对应的一条学生记录被插入。
Hibernate:
drop table if exists STUDENT
Hibernate:
create table STUDENT (
SID integer not null,
SNAME varchar(255),
GENDER varchar(255),
BIRTHDAY datetime,
ADDRESS varchar(255),
primary key (SID)
) Hibernate:
insert
into
STUDENT
(SNAME, GENDER, BIRTHDAY, ADDRESS, SID)
values
(?, ?, ?, ?, ?)
至此第一个Hibernate例子结束。
源码下载:HibernateDemo.zip
四、Hibernate执行流程

1> 获取Configuration对象,目的是读取hibernate.cfg.xml配置文件
2> 获取SessionFactory对象,目的是读取hibernate.cfg.xml中配置的对象-关系配置文件
3> 获取Session对象,相当于获取一个Connection对象,可以持久化操作,需要先开启事务
4> 提交事务,完成持久化操作,然后关闭session
五、Session简介
Hibernate是对JDBC进行了封装,它不建议使用JDBC的Connection操作数据库,而是通过Session操作数据库。Session可以简单的理解为操作数据库的对象。Session与Connection是多对一的关系,一个Connection不同时刻可以供多个Session 使用。
使用Session进行持久化操作需要调用Session的各种方法,如:save(),update(),delete(),createQuery()等。
获取Session的方式:
① 使用SessionFactory的openSession()方法
② 使用SessionFactory的getCurrentSession()方法
使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(JDBC事务):
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务):
<property name="hibernate.current_session_context_class">jta</property>
openSession()与getCurrentSession()的区别:
① getCurrentSession()在事务提交或回滚后会自动关闭,而openSession()需要手动关闭,否则多次之后会造成连接池溢出。
② openSession()每次创建新的session对象,getCurrentSession()返回同一个session对象。
Hibernate入门1 - Hibernate概述及第一个小例子的更多相关文章
- Hibernate入门(1)-第一个Hibernate程序
Hibernate入门(1)-第一个Hibernate程序 Hibernate是最著名的ORM工具之一,本系列文章主要学习Hibernate的用法,不涉及Hibernate的原理.本文介绍第一个Hib ...
- Hibernate入门1. Hibernate基础知识入门
Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...
- Hibernate入门6.Hibernate检索方式
Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...
- scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld
scala 入门Eclipse环境搭建及第一个入门经典程序HelloWorld 学习了: http://blog.csdn.net/wangmuming/article/details/3407911 ...
- java连接mysql的一个小例子
想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...
- java操作xml的一个小例子
最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...
- MVVM模式的一个小例子
使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...
- 使用Trinity拼接以及分析差异表达一个小例子
使用Trinity拼接以及分析差异表达一个小例子 2017-06-12 09:42:47 293 0 0 Trinity 将测序数据分为许多独立的de Brujin grap ...
- Spring和Hibernate结合的一个小例子
1.新建一个SpringHibernate的maven项目 2.pom文件的依赖为 <dependency> <groupId>junit</groupId> &l ...
随机推荐
- 最新WordConut
一.代码地址:https://gitee.com/cainiaoY/WordCount 二.项目分析:代码根据实现的功能不同分为两个模块,一个wcFuctiong类,一个wcTest类,其中wcFuc ...
- springboot 整合 mybatis
spirngboot 整合mybatis有两种方式 第一种 无配置文件注解版,这一种符合springboot的风格 第二种 有配置文件xml版本,这一种就是传统的模式 无论哪一种,首先都需要加入MyS ...
- sqlserver truncate清空表时候,无法删除 'B表',因为该表正由一个 FOREIGN KEY 约束引用。
外键: 查询:select object_name(a.parent_object_id) 'tables' from sys.foreign_keys a where a.referenced_ ...
- djjango models表关系
*** detail表级联 student表,detail获取student的学生信息,自己做为扩展 一对一关系 models.OneToOneField student = models.OneTo ...
- hdoj2089(入门数位dp)
题目链接:https://vjudge.net/problem/HDU-2089 题意:给定一段区间求出该区间中不含4且不含连续的62的数的个数. 思路:这周开始做数位dp专题,给自己加油^_^,一直 ...
- Cocos2dx开发之屏幕适配
由于各种智能手机的屏幕大小都不一致,会出现同一张图片资源在不同的设备分辨率下显示不一样的问题.为避免这样的情况,需要Cocos引擎能提供多分辨率的支持,也就是说要求实现这样的效果 — 开发者不需要考虑 ...
- extern和include的作用
首先要搞清楚的是.h头文件中都是一些声明性的语句,是不分配内存的,所以头文件中有对函数的声明,有define语句,有没有实例化的结构体定义,但是没有对变量的定义(比如 int a),有的只是对外变量的 ...
- 742. Closest Leaf in a Binary Tree查找最近的叶子节点
[抄题]: Given a binary tree where every node has a unique value, and a target key k, find the value of ...
- eclipse装了springboot插件后yml文件没有自动提示问题
选择打开方式:spring yaml
- Entity Framework Core: A second operation started on this context before a previous operation completed
我这边报错是因为函数声明的是async void 而实现中有多个task任务,导致的线程不安全