ORM框架Hibernate (一) 对DAO封装和抽象
- 说明
- 前面已经给大家介绍了Struts这个框架,Struts是对Web项目的表示层进行了封装,而Hibernate是对Web项目中DAO层进行封装,也即是.NET中我们常用到的D层封装,即对访问数据库的一层进行的封装。
- 在D层中尽管我们引入了一个SQLHlper类,在执行CRUD操作中的一些共同的部分抽象出来了,但是远远不够的还要进行更深层次的封装,Hibernate这个框架封装的比较彻底,使用了这个框架后。
- 不用我们自己写SQL语句
- 甚至连表都不用自己建立
- 使用了Hibernate可以不用自己建表,我们只关心实体,关心面向对象的部分,而不用关心关系型数据库。
- 它对面向对象与关系型模式之间解耦了,在一定程度上让我们只关心面向对象部分。
- 体现了OOA、OOD、OOP的编程思想
- Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式来操作关系数据库。
- 特点
- 优点
- 轻量级
- 是相对于重量级而言,不依赖于容器,易于配置
- 比如Struts是一个重量级,它需要容器支持Tomcat
- 没有侵略性API,支持透明持久化
- 即在写持久化层时,不用实现或继承任何Hibernate的类,对其它类的依赖性小,我们知道Struts,在使用ActionForm、Action等类时,必须实现或者继承是Struts父类才可以,Hibernate不用继承。
- POJO
- POJO是Plain Old Java Objects的缩写,即简单的Java对象,不但任任何角色对象。
- 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为 VO(value -object)或 dto(Data Transform Object)来使用。
- 用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不担当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。
- POJO
- 即在写持久化层时,不用实现或继承任何Hibernate的类,对其它类的依赖性小,我们知道Struts,在使用ActionForm、Action等类时,必须实现或者继承是Struts父类才可以,Hibernate不用继承。
- 独立性好
- 易于测试,它不像Struts那样即使测试一个小小几行代码的Java类,也需要启动很大的Tomcat或Jboss等,一般启动还要等半天的功夫,在Hibernate中在类中加入Main方法就可以进行测试,很方便。
- 是相对于重量级而言,不依赖于容器,易于配置
- 它没有侵入性和测试非常简单 这是它流行的一个原因。
- 轻量级
- 缺点
- 优点和缺点是相对的,正式由于它的优点也成为了它的缺点,因为它封装性好,这样对数据库如果进行一些特殊操作不好实现。
- 大量的更新或者统计查询操作会不方便。
- 优点
- 环境搭建
- Hibernate不仅仅支持Web程序,Java项目等也支持,这一点要比Struts应用范围广,毕竟它属于轻量级,扩展性能好。
- 搭建框架同Struts类似,只需把Hibernate包引入即可,多了一个实体配置文件,是这里不细说,看一下搭建好的截图。
- 搭建好截图
- 图
- 文件
- 建立实体和简单操作
- 建立一个实体类,看一下它是如何不用建表而自己对应数据库的,以User表为例:
- User表
import java.util.Date; public class User { private String id;
private String name;
private String password;
private Date createTime;
private Date expireTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getExpireTime() {
return expireTime;
}
public void setExpireTime(Date expireTime) {
this.expireTime = expireTime;
} }
- User.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 >
<class name="com.bjpowernode.hibernate.User">
<id name="id">
<generator class="uuid"></generator>
</id>
<property name="name"></property>
<property name="password"></property>
<property name="createTime"></property>
<property name="expireTime"></property>
</class> </hibernate-mapping>
- 该文件是用于实体对数据库表的映射,可以自定义表名或者字段名
- Hibernate.cfg.xml系统配置
<!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.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property> <mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 这属于系统级别文件,指明表映射文件,以及数据库配置信息。
- MySql 效果
- User表
- 如何不用写SQL语句,像表里插入数据?
- Test类
import java.util.Date; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class Test { /**
* @param args
*/
public static void main(String[] args) {
//读取hibernate.hbm.xml文件
Configuration cfg=new Configuration().configure();
//建立SessionFactory相当于数据库的一个镜像
SessionFactory factory=cfg.buildSessionFactory();
//取得Session
Session session=null;
try {
session=factory.openSession();
//开启事务
session.beginTransaction();
User user=new User();
user.setName("李龙生");
user.setPassword("123456");
user.setCreateTime(new Date());
user.setExpireTime(new Date()); //保存User对象
session.save(user);
//提交事务
session.getTransaction().commit(); } catch (Exception e) {
e.printStackTrace();
//回滚事务
session.getTransaction().rollback(); }finally{
//关闭Session
if (session!=null) {
if (session.isOpen()) {
session.close();
}
} } } }
- 这里面涉及到了SessionFatory/Session等对象,专用于操作数据库。
- 从下面可以看到,执行后,数据库中多了一条数据
- Test类
- 建立一个实体类,看一下它是如何不用建表而自己对应数据库的,以User表为例:
- 从对数据库的操作可以看出,省去了很多代码的编写,方便了我们也提高了开发效率,框架带来的好处很多,建议大家多多使用。
ORM框架Hibernate (一) 对DAO封装和抽象的更多相关文章
- 学习ORM框架—hibernate(三):跟踪持久化对象状态,掌握对象持久化
准备工作 在上篇博客中学习ORM框架—hibernate(一):初识hibernate,通过简单的实例说明O和R的映射过程.本篇博客将要介绍hibernate中持久化对象的状态,并使用hibernat ...
- 持久化ORM框架——Hibernate与mybatis
最初SUN公司推出了JavaEE服务器端组件模型(EJB),但是由于EJB配置复杂,且适用范围较小,于是很快就被淘汰了.与EJB的失败伴随而来的是另外一个框架的应运而生.他就是至今也比较流行的Hibe ...
- ORM框架 EF - code first 的封装
Code first 是Microsoft Entity Framework中的一种模式,CodeFirst不会有可视化的界面来进行拖动编辑DataBase-Entity,但会以一个类来进行对数据表关 ...
- ORM框架Hibernate (四) 一对一单向、双向关联映射
简介 在上一篇博客说了一下多对一映射,这里再说一下一对一关联映射,这种例子在生活中很常见,比如一个人的信息和他的身份证是一对一.又如一夫一妻制等等. 记得在Java编程思想上第一句话是“一切皆对象”, ...
- ORM框架 EF - code first 的封装 优化一
上一节我们讲到对EF(EntityFramework)的初步封装,任何事情都不可能一蹴而就,通过大量的实际项目的实战,也发现了其中的各种问题.在这一章中,我们对上一章的EF_Helper_DG进行优化 ...
- ORM框架 Mybatis、Hibernate、Spring Data JPA之到底该用谁,谁更牛*
在持久层框架中无可厚非的就是mybatis了,但是也会经常被人问到为啥要用mybatis,为啥不用hibernate,jpa.很多人各级都是地铁爷爷看手机的表情,似乎从来没想过这个问题.“公司叫用我就 ...
- 封装JDBC:实现简单ORM框架lfdb
作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.简介 框架就是一组可重用的构件,LZ自己写的姑且就叫微型小框架:lfdb.LZ也对其他的ORM框架没有什么了解,现 ...
- 5 -- Hibernate的基本用法 --1 3 流行的ORM框架简介
⊙ JPA : JPA本身只是一种ORM规范,并不是ORM产品.它是Java EE规范制定者向开源世界学习的结果.JPA实体与Hibernate PO十分相似,甚至JPA实体完全可作为Hibernat ...
- atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity
atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity 1. addEntity 对原生SQL查询运行的控制是通过SQLQuery接口进 ...
随机推荐
- Apache POI组件操作Excel,制作报表(二)
本文接上一篇继续探究POI组件的使用. 现在来看看Excel的基本设置问题,以2007为例,先从工作簿来说,设置列宽,因为生成表格列应该固定,而行是遍历生成的,所以可以在工作簿级别来设置列宽, ...
- Java / Android H基于ttp多线程下载的实现
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26994463 有个朋友须要个多线程如今的样例,就帮忙实现了.在此分享下~ 先说下 ...
- table-cell完成左侧定宽,右侧定宽及左右定宽等布局
使用table-cell完成以下几种布局(ie8及以上兼容) 1.左侧定宽-右侧自适应 .left{ width: 300px; height: 500px; border: 1px solid; f ...
- FlexSlider是一个非常出色的jQuery滑动切换插件
FlexSlider是一个非常出色的jQuery滑动切换插件,它支持所有主流浏览器,并有淡入淡出效果.适合所有初级和高级网页设计师使用.不过很多人都只是使用默认的参数,今天来说说具体的参数来给大家看看 ...
- asp.net 追加文本(追加写入记事本)
代码: string path = Server.MapPath("/Log/Log.txt"); if (File.Exists(path)) { using (StreamWr ...
- SQL 用中文的拼音和笔画排序
SQL 用中文的拼音和笔画排序 城市按拼音排序: SELECT chineseName FROM [表名] order by chinesename collate Chinese_PRC_CS_ ...
- hdu120118岁生日
Problem Description Gardon的18岁生日就要到了,他当然很开心,可是他突然想到一个问题,是不是每个人从出生开始,到达18岁生日时所经过的天数都是一样的呢?似乎并不全都是这样,所 ...
- Unity-资源
模型.材质.动画 Unity的默认系统单位为"米" 三维软件 三维软件内部米制尺寸/m 默认设置导入Unity中的尺寸/m 与Unity单位的比例关系 Maya 1 100 1:1 ...
- C++服务器设计(四):超时管理机制设计
前四章介绍了系统层的设计,从这一章开始进入服务层的设计. 连接断开 在常见的服务器场景中,客户端断开连接的方式为被动关闭.即作为客户端请求完服务器的服务后,选择主动关闭同服务器的连接.在服务器的角度看 ...
- (原+转)ubuntu16中莫名死机及重新安装显卡驱动
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5992693.html 参考网址: http://blog.csdn.net/u012581999/ar ...