Hibernate 快速上手操作入门
本文主要是从技术操作角度去介绍hibernate,并且简单描述如何快速的上手操作hibernate,用于作为与数据库的连接的持久层。
简单讲述一下hibernate究竟是什么,它有什么作用,在理解它的作用之前,我们先想一想,在一个项目当中,我们需要将项目当中的数据存入数据库,或者从数据库中读取项目当中需要的数据进行操作,我们往常一般使用什么方法呢?首先想到的就是通过JDBC去对数据库进行手动的操作,编写一个连接数据库的模块,通过加载driver并且手动编写增删改查方法联通程序与数据库当中的数据,这种方式很繁琐,并且在对不同的表格操作的时候,还需要手动修改SQL语句,与我们面向对象编程的设计思想不符,于是提出了ORM。
所谓的ORM(Object ralational mapping)是一种为了解决面向对象与关系型数据库存在的互不匹配的现象的技术,简单说:ORM是通过使用描述对象和数据库之间映射的元数据,将Java程序中的对象自动持久化到关系数据中。即将数据库表当中的一行数据,转化到java当中的某个pojo类的实例,本质上就是将数据从一种形式转换到另外一种形式。
从图中的每层之间的关系也可以很直观的看出,本文所介绍的Hibernate主要就是用于做持久层,并且提供ORM的重要组件。
通过Hibernate,我们将对象转换存入数据库,或者反向将数据从数据库提取生成对象就无需再手动编写jdbc的增删改查并且向对象填入字段的代码模块,在建立好orm映射之后,我们只需要操作我们所定义的pojo类,并且使用Hibernate提供的方法即可将pojo对象存入对应的数据库当中,无需关注实现细节,便于简化编程。
在理解什么是orm,并且知道Hibernate在我们编程当中所扮演的角色以及所提供的作用之后,我们开始来了解如何使用Hibernate来实现我们的程序持久层,本文采用的是hibernate 5.1版本对mysql数据进行连接,进行demo演示,首先创建一个java project,并且将hibernate根目录下的 /lib/required 文件夹下的所有jar包引入工程,并且再将 /lib/java8 目录下的jar包引入工程当中,除此之外,因为要与mysql数据库进行连接,还需要提供mysql数据库连接的驱动jar包mysql-connector-java-5.1.26-bin.jar,将这些包都引入并且build the path之后,我们的工程环境就搭建完成。
在通过hibernate去进行ORM的时候,一般的设计流程为Domain Object ->mapping ->DB:
1.需要连接的pojo类对象的设计,这个部分的设计根据所需要实现的程序的功能去进行,比如需要做一个用户信息的统计程序,那么就肯定需要一个名为User的Pojo类,并且该Pojo类里头需要定义用户的属性,如:姓名,性别,年龄等。
2.需要配置的pojo.hbm.xml配置文件,作为类向关系型的映射,即提供pojo类到数据库某张表的对应映射信息。
3.在包外配置hibernate.cfg.xml配置文件,其中Sesson-factory作为连接数据库信息的配置。
如同上述的设计思路流程,首先我们先设计我们的pojo类,就以用户信息为例,代码如下:
package wellhold.hibernate.domain; import java.util.Date; public class User { private int id;
private String name;
private Date birthday; 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 Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", birthday=" + birthday
+ "]";
} }
在这里需要额外提示一下,根据笔者查阅的资料当中,大部分人都表示在hibernate因为反射机制的需求,所定义的pojo类需要有一个空白无参数的构造函数才能对对象进行反射,但是笔者在制作测试demo的时候,将这个空白的构造函数进行去除之后,程序还是没有任何问题,所以这个空白构造函数的必须性还有待商议。
在设计好pojo类之后,我们需要建立对象到数据库的映射关系,即hbm.xml配置文件的建立,如下:
<?xml version="1.0"?>
<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License:
GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the
lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <!-- --> <hibernate-mapping package="wellhold.hibernate.domain"> <class name="User">
<!-- 当类名和表明一样的时候,table="" 这个关键字不需要写 --> <id name="id">
<!-- name指的是属性名,即java类里头的属性 -->
<!-- 有一次属性名unsaved-value="-1" 指的是如果ID的值为-1的时候则表示这个对象未保存 --> <generator class="native" />
<!-- 主键产生的方式,其中native是主键生成器 --> </id> <property name="name" />
<property name="birthday" /> </class> </hibernate-mapping>
hibernate会根据我们提供的这个hbm.xml去建立User这个Pojo类与数据库当中User这张表的映射关系。
之后我们需要对全局的hibernate进行配置,通过.cfg.xml对hibernate进行配置,包括提供所需要连接的数据库信息,以及一些功能参数的设定,session-factory的设置,注意在hibernate当中,对数据库的所有操作都是通过SessionFactory进行的,所以SessionFactory是一个很重要的概念,可以理解成是一个对jdbc进行更上一层封装的对象。
<?xml version='1.0' encoding='utf-8'?>
<!-- ~ Hibernate, Relational Persistence for Idiomatic Java ~ ~ License:
GNU Lesser General Public License (LGPL), version 2.1 or later. ~ See the
lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. -->
<!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="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///testconnect</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 使用方言,用于在Sql语句的设计上是存在差异的 -->
<property name="hbm2ddl.auto">update</property>
<!-- 在不存在表格的情况,自动在数据库生成表格 -->
<property name="show_sql">false</property>
<!-- 显示Hibernate底层调用的SQL -->
<mapping resource="wellhold/hibernate/domain/User.hbm.xml" /> <!-- 在数据库当中自动生成表格 --> </session-factory> </hibernate-configuration>
至此,hibernate的映射环境就已经构建完成,接下来我们通过编写测试用例去进行测试我们所搭建的hibernate是否可以正常工作。
一般在使用Hibernate,我们可以先对原生的Hibernate提供的一些方法进行更高一层的封装,比如Hibernate的SessionFactory所提供的sava方法,update方法,delete方法,get方法,制作一个Hibernate的工具类,代码如下:
package wellhold.hibernate; import java.io.Serializable; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; public final class HibernateUtil { private static SessionFactory sessionFactory; static {
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
sessionFactory = cfg.buildSessionFactory();
} public static SessionFactory getSessionFactory() {
return sessionFactory;
} public static Session getSession() {
return sessionFactory.openSession();
} public static void add(Object entity) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.save(entity);
tx.commit();
} finally {
if (s != null)
s.close();
}
} public static void Update(Object entity) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.update(entity);
tx.commit();
} finally {
if (s != null)
s.close();
}
} public static void delete(Object entity) {
Session s = null;
Transaction tx = null;
try {
s = HibernateUtil.getSession();
tx = s.beginTransaction();
s.delete(entity);
tx.commit();
} finally {
if (s != null)
s.close();
}
} public static Object get(Serializable id) {
Session s = null; try {
s = HibernateUtil.getSession(); Object obj = s.get(User.class, id);
return obj; } finally {
if (s != null)
s.close();
}
} }
在HibernateUtil当中,通过一个static块去加载了hibernate.cfg.xml配置文件,并且获取到sessionfactory实例,之后是对增删改查的封装。这里简单的解释一下为什么使用的都是static的方法生命,因为在使用static的方法的时候,可以无需对HibernateUtil对象进行实例,就可以使用其静态的方法。
最后,我们只需要制作一个程序入口,即main函数,测试HibernateUtil当中的方法即可:
package wellhold.hibernate; import java.util.Date; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction; import wellhold.hibernate.domain.User; public class maintest { public static void main(String[] args) {
// TODO Auto-generated method stub User user = new User();
user.setBirthday(new Date());
user.setName("well"); HibernateUtil.add(user);
System.out.println("end");
System.out.println(HibernateUtil.get(1).toString());
} // }
查看效果:
至此,Hibernate快速入门demo完成。
Hibernate 快速上手操作入门的更多相关文章
- Hibernate快速上手
一. Hibernate介绍 1. Hibernate简介 Hibernate是一个开放源码的对象-关系映射(ORM)框架,他对JDBC进行了轻量级封装,开发人员可以使用面向对象的编程思想来进行持久层 ...
- Hibernate学习笔记(1)---hibernate快速上手与准备工作
持久层介绍 持久化:将内存中的数据保存在磁盘等存储设备中. 持久化对象:指已经存储在数据库护着磁盘的业务对象 经典的软件应用体系结构(三层结构) 在三层结构中,由于业务逻辑除了负责业务逻辑以外,还要负 ...
- [译]:Xamarin.Android开发入门——Hello,Android快速上手
返回索引目录 原文链接:Hello, Android_Quickstart. 译文链接:Xamarin.Android开发入门--Hello,Android快速上手 本部分介绍利用Xamarin开发A ...
- smarty半小时快速上手入门教程
http://www.jb51.net/article/56754.htm http://www.yiibai.com/smarty/smarty_functions.html http://www. ...
- Flask入门和快速上手
目录 Flask入门和快速上手 python三大主流框架对比 Flask安装 依赖 可选依赖 创建flask项目 flask最小应用--hello word 非法导入名称 调试模式 路由 唯一的 UR ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- 【opencv入门篇】 10个程序快速上手opencv【下】
导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) 上篇传送:http: ...
- (转)Hibernate快速入门
http://blog.csdn.net/yerenyuan_pku/article/details/64209343 Hibernate框架介绍 什么是Hibernate 我们可以从度娘上摘抄这样有 ...
- 入门python:《Python编程快速上手让繁琐工作自动化》中英文PDF+代码
入门推荐学习<python编程快速上手>前6章是python的基础知识,通俗易懂地讲解基础,初学者容易犯错的地方,都会指出来.从第三章开始,每章都有一个实践项目,用来巩固前面所学的知识. ...
随机推荐
- C/C++学习笔记--指针(Pointer)
定义指针 一般类型: type_name * var_name; 例如: int _var = 1555; int * _var_addr=&_var; 一般类型数组类:type_name ...
- CocosCreator设置模拟器默认横竖屏以及机型
之前好好的横屏,今天不知道为毛突然变成竖屏了,虽然可以在点击模拟器左上角进行设置, 但是 每次启动模拟器又变成竖屏了,折腾了很久,终于找到了设置的地方,记录下:
- [转载]python 变量命名规范
原文地址:python 变量命名规范作者:loveflying python源码和其他一些书籍,命名各种个性,没有一个比较统一的命名规范.于是自己总结了一些,可供参考. 模块名: 小写字母,单词之间用 ...
- python 读取数据库中文内容显示一堆问号
需要在连接数据库时 设置编码格式 def select_db(self,db_name): self.conn = MySQLdb.connect( host = self.ip, port = se ...
- 不吹不擂,你想要的Python面试都在这里了【315+道题】+精心整理的解答
Part01-Py基础篇(80) Part02-网络编程和并发(34) Part03-数据库和缓存(46) Part04-前端框架和其他(155) Part01-Py基础篇(80) 1.为什么学习Py ...
- [译]如何将docker日志重定向到单个文件里
原文来源: how-to-redirect-docker-logs-to-a-single-file 问题: 我想把某一个docker的log全部导出到一个文件里进行分析,我该怎么做? 其实不用那样操 ...
- Alpha 冲刺(5/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成了主界面的基本布局 ...
- jQuery选择器之id选择器
页面的任何操作都需要节点的支撑,开发者如果快速高效的找到指定的节点也是前端开发中的一个重点.jQuery提供了一系列的选择器帮助开发者达到这一目的,让开发者可以更少的处理复杂选择过程与性能优化,更多专 ...
- Python列表及元组操作
#列表(一组有序数据的组合就是列表) #创建列表 #空列表 var = list()#var = [] print(var,type(var)) #具有多个元素的列表 var = ['风','水',' ...
- VS2013下配置OpenCV 3.0.0 &&& VS2013下配置Opencv2.4.9
最近做图像需要用到Matlab和OpenCV,一些东西真的是要深入的研究进去才会有所发现,但Matlab和C++都不是我擅长的语言,所以要很加油很加油才行啊!! 步入正题. 1. 环境:Win7 6 ...