Hibernate 初体验
为什么会产生 Hibernate Mybatis 这类的dao层框架
传统的jdbc 虽然执行速度很快,但是开发效率很低,随着面向对象开发的设计思想,在面向对象编程中 将对象 进行持久化,存入关系型的数据库时,由于关系型数据库的设计思想是数学思维,在持久化时,必须要对象拆分各个属性值,才可存入数据库;传统的jdbc 持久化时 对象持久化时 ,取出对象的一个一个属性,过去繁琐,并且不便于维护,而市场上的面向对象的数据库还并不成熟,所以为了调节面向对象设计的开发思想与落后的关系型数据库之间持久化时繁琐的问题,产生了一种新的设计规范
ORM (Object Relation Mapping)

package hibernateDemo; import java.util.Date; /**
* 持久化的bean类
* 注意:
* 1: id唯一标识 建议 使用封装类型
* 2:这个类不能final修饰
* 3:需要给这个类提供一个无参数的构造器,
* 4:给所有的属性提供get set方法;
* 5: 如果有设计集合数据的操作,集合类型 要使用接口类型 list 不允许实现类的类型 arrylist;
* 创建对象的时候 是用 new 构造器方法
* @author Administrator
*
*/
public class Person {
public Person(){ }
private Integer id;
private String name;
private int passWord;
private Date birthday; 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 int getPassWord() {
return passWord;
}
public void setPassWord(int passWord) {
this.passWord = passWord;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", passWord=" + passWord + ", birthday=" + birthday + "]";
}
}
第三部:创建相应的映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping SYSTEM "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<!-- 映射文件 java对象Dao关系数据库的映射配置文件 -->
<hibernate-mapping package = "hibernateDemo">
<!-- class配置 类 对应表的映射
对应的实体类就是 package+class的name
table 表示关系数据库的表名
-->
<class name="Person" table="t_person">
<!-- id 指定 实体类中哪一个属性为 唯一标识ID -->
<id name="id" >
<!-- 自动生成id策略 -->
<generator class="native"/>
</id>
<!-- 实体类的其他属性配置
name:对应实体类的属性 column:对应表的字段名(若不指定 将默认使用类的属性名) -->
<property name="name" column="t_name"/>
<property name="passWord" column="t_passWord"/>
<property name="birthday"/> </class>
</hibernate-mapping>
第四步 主配置文件 放在src目录下 官方的api上会默认去src下查hibernate.cfg.xml这个文件 还有其他方式下面介绍
<!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>
<!-- 显示执行的SQL语句 -->
<property name="show_sql">true</property>
<!-- 驱动 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<!-- 数据库url-->
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/medicine?useUnicode=true&characterEncoding=utf-8</property>
<!-- 访问数据库用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 访问数据库密码 -->
<property name="hibernate.connection.password">root</property>
<!-- 如果使用的mysql数据版本在5.5之后的话,方言通常建议使用MySQL5InnoDBDialect
MySQLDialect 不支持事务
MySQLInnoDBDialect 支持事务
为了更好的操作各种数据库,所以为每个数据库 准备了不同的方言
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- 自动创建表结构配置
create-drop 在程序启动的时候创建对应数据库表结构,当SessionFatory关闭的时候会将创建的表结构删除
create 在每次程序启动的时候先删除上次创建的数据库表结构,然后再创建对应新数据库表结构。
update 在每次启动的时候会追加修改的表结构,但是不会影响原来的数据 (通常用这个)
validate 在每次启动的时候会验证并修改的表结构。
-->
<property name="hibernate.hbm2ddl.auto">update</property> <!-- 告诉映射文件的位置 引入需要对应的配置文件-->
<mapping resource="hibernateDemo/Person.hbm.xml"/> </session-factory>
</hibernate-configuration>
最后一步测试代码了
package test; import java.util.Date; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration; import hibernateDemo.Person; public class test {
public static void main(String[] args) {
//加载 主配置文件的方式 还有一种读取properties文件的方式
//创建Configuration读取配置文件的 对象 可传参数,并加载配置文件hibernate.cfg.xml
Configuration conf = new Configuration().configure();
//通过配置文件中的配置信息 获取数据库连接
//这种写法是hibernate4之前的写法
//sessionFactory是与应用程序生命周期一致的,多线程共享的
SessionFactory factory = conf.buildSessionFactory();
//相当于一次数据库的交互 代表一次操作 只为一次线程使用 线程结束 声明 over
Session session = factory.openSession();
/**
* 增删改 是需要 事务
*/
Transaction tx = session.beginTransaction();
Person entity = new Person();
entity.setName("tom");
entity.setPassWord(123456);
entity.setBirthday(new Date());
//面向对象的方式 持久化
session.persist(entity);
/**
* 提交事务
*/
tx.commit();
session.close(); }
}
数据库的显示

/**
* get方式返回的是一个持久化类的实例 一执行就立即查询 执行查询语句立即查询
*
*/ public static void get(){
Configuration conf = new Configuration().configure();
/**
* 推荐使用的获取factory 高效安全
*/
ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory factory = conf.buildSessionFactory(sb);
Session session = factory.openSession();
//根据id查询数据
Person o = (Person)session.get(Person.class, 2);
System.out.println(o);
session.close();
factory.close(); }
查询 2 load延迟查询
/**
* load 返回的是一个持久化类的代理,当正真访问除了id以外的属性时,才去发起sql查询;
* 延迟查询 ,第一次查询只不过是给你一个代理 不是真的查询。真正的查询是你在调用这个实例的某一个属性才会具体查询;
* 当给定的id不存在时,什么时候调用什么时候抛出错误异常;不调用不会报错;
* 可通过 映射文件上的class标签内的 lazy="false" 改成立即执行
*/
public static void load(){
Configuration conf = new Configuration().configure();
/**
* 推荐使用的获取factory 高效安全
*/
ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory factory = conf.buildSessionFactory(sb);
Session session = factory.openSession();
//根据id查询数据
Person o = (Person)session.load(Person.class, 10);
System.out.println(o);
session.close();
factory.close();
}
更新 引进session的持久化对象概念
当获取到 session管理的对象时(get load merge 等等获取到的对象),你可以完全不用update 或merge 方法 去再次修改
 对于session管理的对象,在session的连接断开的时候,会自动同步被管理的对象与数据库中的数据,若相同则不改变,若不相同,会以管理的对象为主更新数据库中的数据;
/**
* 修改通过get方法获得持久化对象
* 更新了全部字段 更改的加上未更改的全部更新了仪表
* 真正的执行sql语句是在session关闭的时候
*/
public static void update1(){
Configuration conf = new Configuration().configure();
/**
* 推荐使用的获取factory 高效安全
*/
ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory factory = conf.buildSessionFactory(sb);
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Person o = (Person) session.get(Person.class, 1);
System.out.println(o.getName());
o.setName("Json");
session.update(o);
tx.commit();
session.close();
factory.close(); }
/**
* 修改通过自己创建的的对象
* 更新了全部字段 更改的加上未更改的全部更新了表
* 若只设置一个属性值 其他值全部被覆盖为空
* 真正的执行sql语句是在session关闭的时候
* 1:id必须有 ,并且必须对应数据库里某一条记录。
*/
public static void update2(){
Configuration conf = new Configuration().configure();
/**
* 推荐使用的获取factory 高效安全
*/
ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory factory = conf.buildSessionFactory(sb);
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Person o = new Person();
o.setId(2);
o.setName("高效");
session.merge(o);
tx.commit();
session.close();
factory.close(); }
/**
*
* 引进持久化状态
* 当获取到 session管理的对象时(get load merge 等等获取到的对象),你可以完全不用update 或merge 方法 去再次修改
* 对于session管理的对象,在session的连接断开的时候,会自动把被管理的对象去数据库比对,若相同则不改变,若不相同,会以管理的对象为主更新数据库中的数据;
*/
public static void merge(){
Configuration conf = new Configuration().configure();
/**
* 推荐使用的获取factory 高效安全
*/
ServiceRegistry sb = new ServiceRegistryBuilder().applySettings(conf.getProperties()).buildServiceRegistry();
SessionFactory factory = conf.buildSessionFactory(sb);
Session session = factory.openSession();
Transaction tx = session.beginTransaction();
Person o = new Person();
o.setId(2);
o.setName("高效2");
Person p = (Person) session.merge(o);
System.out.println("修改后o"+o);
System.out.println("修改后p"+p);
o.setName("高效33");
p.setName("高效pp");
System.out.println("再次修改后o"+o);
System.out.println("再次修改后p"+p);
tx.commit();
session.close();
factory.close(); }
Hibernate 初体验的更多相关文章
- hibernate初体验
		
简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...
 - Hibernate初体验及简单错误排除
		
Hibernate是什么,有多少好处,想必查找这类博文的都知道,所以就不多说了.下面是我对Hibernate简单使用的一个小小的总结.与君(主要是刚入门的)共勉吧! 创建的顺序 创建Hibernate ...
 - hibernate初使用
		
准备工作,安装及配置Hibernate http://zhoualine.iteye.com/blog/1190141 在产生数据库表映射 Java 对象时,我增加了数据库中的两张表分别为Chatlo ...
 - Spring之初体验
		
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
 - hibernate--CRUD初体验
		
hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.per ...
 - SSH初体验系列--Hibernate--2--crud操作
		
Ok,今天比较详细的学习一下hibernate的C(create).R(read).U(update).D(delete) 相关api... 前言 Session: 是Hibernate持久化操作的基 ...
 - .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
		
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
 - Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
		
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
 - Xamarin.iOS开发初体验
		
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
 
随机推荐
- Linux任务计划及周期性任务执行:at、crontab命令
			
一.概述 未来的某时间点执行一次某任务:at, batch 周期性运行某任务:crontab 这两个任务的执行结果:会通过邮件发送给用户 (本地终端用户之间的邮件通知) centos 5,6,7默认开 ...
 - [VIJOS2053][SDOI2019]世界地图:最小生成树+虚树
			
分析 可以发现第一列和最后一列永远不会被删除,于是我们可以想到维护前后缀最小生成树,但是直接维护的话显然时间空间两爆炸.(通过上网找题解)可以发现我们关心的只是最左边和最右边两列,而不关心内部的连边情 ...
 - 导数与微分简单总结(updated)
			
只讲一些导数在OI中的简单应用,特别基础的东西,不会很详细也不会很全面. 导数的定义 设函数\(y=f(x)\)在点\(x_0\)的某个邻域内有定义,当自变量\(x\)在\(x_0\)处有增量\(Δx ...
 - 原生Js_制作简易日历
			
javascript制作简易日历,月份信息已经放在一个数组中,在<script>...</script>中编写代码实现其功能 实现步骤 a) 获取需要操作的dom对象 b) 在 ...
 - dependencies和devDependencies的区别?
			
当我们项目需要下载一个模块的时候,我们安装npm包(在项目目录下面npm install module_name)的时候,很多时候我们会在后面加上–save-dev 或 –save.这两个参数代表什么 ...
 - ES6 字符串的扩展(待细读)
			
1.确定字符串中是否含有某个字符串 indexof(value,num):可返回某个指定的字符串值在字符串中首次出现的位置.ES5方法,num范围(0~length-1) includes(value ...
 - 如何解决Struts2和Servlet共存问题
			
我之前用Servlet写过二维码扫描登录,结果把它整合到ssh框架中,发现Servlet和Struts存在共存问题,这是因为当我们在页面在请求应用时,struts2将会截获所有请求,对于servlet ...
 - 2.进行model和log的路径创建
			
第一步:使用datetime.strftime(datetime.now(), '%Y%m%d-%H%M%S') 用于生成当前时间 第二步: 使用os.path.join() 将文件的路径与subdi ...
 - 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
			
目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...
 - MySQL MGR 5.7.22 on centos 6.3 单主/多主搭建测试
			
搭建Mysql Group Replication本次搭建采用3个实例,三个服务器,同一个网段,MGR的参数配置在配置文件中添加.注意通讯端口号的配置,它用于组成员之间的通讯使用请确定当前MySQL版 ...