一篇文章让你马上入门Hibernate
在前面我们学完了Struts2,接下来我们就要去学习第二个框架Hibernate。
那什么是Hibernate?
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的ORM框架,Hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲地使用对象编程思维来操纵数据库,Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用。
顺带介绍一下什么是ORM。
ORM:对象关系映射,是一种程序技术,简单来说就是把我们程序中的实体类和数据库表建立起来对应关系。
那为什么要有对象关系映射呢?
假设一下,当你开发一个应用程序的时候,你可能会写不少数据访问层的代码,用来从数据库保存、删除、读取对象信息等等。你在DAO中写了很多的方法来读取对象数据,改变状态对象等等任务,而这些代码很多都是重复的。
对象映射关系赋予了程序一种强大的能力,让开发者仅仅掌握面向对象的思维来操作数据库,即在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
HelloWorld
关于Hibernate的一些基本知识了解完之后,我们来编写一个Hibernate的入门项目。
首先我们得编写hibernate的配置文件,在src目录下新建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="connection.username">root</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///test</property>
<!-- 配置hibernate的基本信息 -->
<property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 执行操作时是否在控制台打印sql -->
<property name="show_sql">true</property>
<!-- 是否对sql进行格式化 -->
<property name="format_sql">true</property>
<!-- 指定自动生成数据表的策略 -->
<property name="hbm2ddl.auto">update</property>
<!-- 指定关联的.hbm.xml文件 -->
<mapping
resource="com/itcast/hibernate/helloworld/Account.hbm.xml" />
</session-factory>
</hibernate-configuration>
这里面就是配置一些相关的信息。
然后我们创建一个Bean类Account:
package com.itcast.hibernate.helloworld;
public class Account {
private Integer id;
private String name;
private double money;
public Account() {
}
public Account(String name, double money) {
this.name = name;
this.money = money;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", money=" + money + "]";
}
}
接下来我们需要创建对象关系映射的配置文件,在与该类同级的目录下新建Account.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>
<!-- 使Account类对应数据表ACCOUNT -->
<class name="com.itcast.hibernate.helloworld.Account" table="ACCOUNT">
<!-- id标签中的name为类中的属性名;colum标签中的name为数据表中的列名 -->
<id name="id" type="java.lang.Integer">
<column name="ID" />
<!-- 指定主键的生成方式 native:使用数据库本地的方式-->
<generator class="native" />
</id>
<!-- property表示非id的其它列 -->
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="money" type="double">
<column name="MONEY" />
</property>
</class>
</hibernate-mapping>
简单地配置一下,该配置文件目的是使类和表进行一个映射。
然后我们编写一下测试代码:
// 1、创建一个SessionFactory对象
SessionFactory sessionFactory = null;
// 1)、创建Configuration对象:对应hibernate的基本配置信息和对象关系映射信息
// 默认关联的是hibernate.hbm.xml文件,如果你的配置文件名是hibernate.hbm.xml,使用无参构造即可
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
// 2、创建一个Session对象
Session session = sessionFactory.openSession();
// 3、开启事务
Transaction transaction = session.beginTransaction();
// 4、执行保存操作
Account account = new Account("张三",1000);
session.save(account);
// 5、提交事务
transaction.commit();
// 6、关闭Session
session.close();
// 7、关闭SessionFactory
sessionFactory.close();
然后运行测试代码,hibernate就会把数据保存到数据库,如果你没有这张表,hibernate会自动帮我们创建好表然后插入数据。
因为hibernate版本的问题,所以这里面会有很多的坑,具体报了什么错大家可以自己百度解决。我这里的hibernate版本是5.X的。
+----+------+-------+
| ID | NAME | MONEY |
+----+------+-------+
| 1 | 张三 | 1000 |
+----+------+-------+
1 row in set (0.00 sec)
那么在创建持久化类的时候需要注意下面几个问题:
- 必须提供一个无参的构造器
因为Hibernate需要使用Constructor.newInstance()来实例化持久化类 - 提供一个标识属性
通常映射为数据表的主键字段,如果没有该属性,一些功能将不起作用 - 为类的持久化类字段声明访问方法
- 使用非final类
在运行时生成代理是Hibernate的一个重要的功能,如果持久化类没有实现任何接口,Hibernate将使用CGLIB生成代理,如果使用的是final类,则无法生成CGLIB代理 - 重写equals和hashCode方法
如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法
入门案例我们就编写完了, 相信两个配置文件的配置信息大家都能明白,注释也写得很清楚,那么关于测试代码的一些类API,这里分别介绍一下。
- Configuration:
Configuration类负责管理Hibernate的配置信息,包括如下内容:
Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect、数据库连接池等(对应hibernate.cfg.xml文件)
创建Configuration的两种方式:
属性文件(hibernate.properties):
Configuration cfg = new Configuration();
Xml文件(hibernate.cfg.xml)
Configuration cfg = new Configuration().configure();
Configuration的configure方法还支持带参访问:
File file = new File("文件名");
Configuration cfg = new Configuration().configure(file); - SessionFactory:
针对单个数据库映射关系经过编译后的内存镜像,是线程安全的
SessionFactory对象一旦构造完毕,即被赋予特定的配置信息
SessionFactory是生产Session的工厂
构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象 - Session:
Session是应用程序与数据库之间交互操作的一个而单线程对象,是Hibernate运作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的生命周期很短。Session对象有一个一级缓存,显式执行flush之前,所有的持久化层操作的数据都缓存在session对象处,相当于JDBC中的Connection - Transaction:
事务,学过数据库的应该都明白,不重复说
更新
上面说到了插入数据,那么这里说一下如何使用hibernate完成更新操作。
- session.save(obj); 【保存一个对象】
- session.update(obj); 【更新一个对象】
- session.saveOrUpdate(obj); 【保存或者更新的方法】
没有设置主键,执行保存;
有设置主键,执行更新操作;
如果设置主键不存在报错!
SessionFactory sessionFactory = null;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Account account = session.get(Account.class, 1);
account.setMoney(2000);
session.update(account);
transaction.commit();
session.close();
sessionFactory.close();
运行然后查询数据库:
+----+------+-------+
| ID | NAME | MONEY |
+----+------+-------+
| 1 | 张三 | 2000 |
+----+------+-------+
1 row in set (0.00 sec)
查询
接下来是查询。
SessionFactory sessionFactory = null;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Account account = session.load(Account.class, 1);
System.out.println(account);
transaction.commit();
session.close();
sessionFactory.close();
运行结果:
删除
最后是删除。
SessionFactory sessionFactory = null;
Configuration configuration = new Configuration().configure();
sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Account account = session.get(Account.class, 1);
session.delete(account);
transaction.commit();
session.close();
sessionFactory.close();
运行结果:
mysql> select * from account;
Empty set (0.00 sec)
总结
关于增删改查的操作是非常简单的,只要会一个,其它的就都能会,因为道理是一样的。当然关于hibernate的使用远不止这么点功能,但本篇文章只是为了让你尽快入门,所以一些更高级的功能我打算写在进阶里。
一篇文章让你马上入门Hibernate的更多相关文章
- 一篇文章带你快速入门createjs
开始用createjs这个框架的时候,发现网上的相关教程还是挺少的,所以写一篇文章,方便日后查看. createjs简介 官网:http://www.createjs.cc/ createjs中包 ...
- 一篇文章让你快速入门 学懂Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...
- 一篇文章带你了解网页框架——Vue简单入门
一篇文章带你了解网页框架--Vue简单入门 这篇文章将会介绍我们前端入门级别的框架--Vue的简单使用 如果你以后想从事后端程序员,又想要稍微了解前端框架知识,那么这篇文章或许可以给你带来帮助 温馨提 ...
- 一篇文章带你了解服务器操作系统——Linux简单入门
一篇文章带你了解服务器操作系统--Linux简单入门 Linux作为服务器的常用操作系统,身为工作人员自然是要有所了解的 在本篇中我们会简单介绍Linux的特点,安装,相关指令使用以及内部程序的安装等 ...
- 一篇文章带你了解NoSql数据库——Redis简单入门
一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...
- 一篇文章带你了解轻量级Web服务器——Nginx简单入门
一篇文章带你了解轻量级Web服务器--Nginx简单入门 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 在本篇中我们会简单介绍Nginx的特点,安装,相关指令使用以及配置信 ...
- 真的,Kafka 入门一篇文章就够了
初识 Kafka 什么是 Kafka Kafka 是由 Linkedin 公司开发的,它是一个分布式的,支持多分区.多副本,基于 Zookeeper 的分布式消息流平台,它同时也是一款开源的基于发布订 ...
- 一篇文章带你掌握主流基础框架——Spring
一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...
- Android:学习AIDL,这一篇文章就够了(下)
前言 上一篇博文介绍了关于AIDL是什么,为什么我们需要AIDL,AIDL的语法以及如何使用AIDL等方面的知识,这一篇博文将顺着上一篇的思路往下走,接着介绍关于AIDL的一些更加深入的知识.强烈建议 ...
随机推荐
- UVA816 Abbott的复仇 Abbott's Revenge
以此纪念一道用四天时间完结的题 敲了好几次代码的出错点:(以下均为正确做法) memset初始化 真正的出发位置必须找出. 转换东西南北的数组要从0开始. bfs没有初始化第一个d 是否到达要在刚刚取 ...
- Python登录豆瓣并爬取影评
上一篇我们讲过Cookie相关的知识,了解到Cookie是为了交互式web而诞生的,它主要用于以下三个方面: 会话状态管理(如用户登录状态.购物车.游戏分数或其它需要记录的信息) 个性化设置(如用户自 ...
- 关于java爬虫以及一些实例
首先是工具介绍 Jsoup jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法 ...
- Java并发-CopyOnWriteArrayList
前言 今天我们一起学习下java.util.concurrent并发包里的CopyOnWriteArrayList工具类.当有多个线程可能同时遍历.修改某个公共数组时候,如果不希望因使用synchro ...
- CF392BTower of Hanoi(记忆化搜索)
CF392B 记搜好题 预处理 题目给出了将一个盘从x移到y的代价(代码中为a[][]),当我们知道这并不是最优的 就像最短路floyd一样松弛操作预处理得到两柱之间最优值b[][] for(int ...
- Java中使用 foreach 操作数组
foreach 并不是 Java 中的关键字,是 for 语句的特殊简化版本,在遍历数组.集合时, foreach 更简单便捷.从英文字面意思理解 foreach 也就是" for 每一个& ...
- .NET Core 3.0之深入源码理解HttpClientFactory(二)
写在前面 上一篇文章讨论了通过在ConfigureServices中调用services.AddHttpClient()方法,并基于此进一步探讨了DefaultHttpClientFactory是 ...
- springBoot综合开发
作者:纯洁的微笑出处:www.ityouknow.com 版权所有,欢迎保留原文链接进行转载:) 上篇文章介绍了Spring boot初级教程:spring boot(一):入门篇,方便大家快速入门. ...
- Hadoop自学系列集(四) ---- Hadoop集群
久等了,近期公司比较忙,学习的时间都没有啊,到今日才有时间呢!!!好了,下面就跟着笔者开始配置Hadoop集群吧. hosts文件和SSH免密码登录配置好了之后,现在进入Hadoop安装目录,修改一些 ...
- Wireshark着色规则
wireshark抓包蓝色和红色 在默认情况下 蓝色适合红色相反的方向 绿色背景的是HTTP包灰色背景的是TCP包.黑色背景的是TCP错误包或者校验和错误的包 有时候wireshark抓的包还有颜色区 ...