---恢复内容开始---

1、JavaEE的三层结构

WEB层--Service层--DAO层

2、Hibernate版本

Hibernate3.x  4.x  5.x

4版本是过渡版本 不使用  5.x推荐

3.ORM(Object Relation Mapping,对象关系映射)

Hibernate使用了ORM思想

javabean在Hibernate中被称为实体类

做法:①实体类与数据库的表一一对应(实体类与数据库的表进行对应【有User类就有User表】,实体类的属性和数据库表的字段进行对应)

②不需要操作数据库,操作表对应的实体类

Hibernate将JDBC的功能封装进了Session类里面,不用写重复的代码。

4.搭建Hibernate环境、

1.Jar包:required里面和JPA里面的需要有,以及Log4j和common两个日志输出jar包(我的hibernate版本里面没有jap文件夹,貌似也可以正常运行)

2.配置文件:实体映射文件 hibernate核心配置文件

实体映射文件官方建议的命名格式是:实体名.hbm.xml  位置没有要求,一般与实体类放在同一个包

hibernate核心配置文件 位置必须是src下,名称必须为hibernate.cfg.xml

3.实体类  就是一个javabean

package tech.youngs.entity;

public class User {
/*Hibernate要求有一个属性是唯一的 --> 对应的主键*/
private int uid;
private String username;
private String password;
private String address;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}

4.映射配置文件:命名为User.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入XML dtd 约束 -->
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- hibernate mapping是根标签 -->
<hibernate-mapping>
<!-- class 配置类和表的映射关系
@param name ※实体类的全路径
@param table 实体类对应的表的名称
-->
<class name="tech.youngs.entity.User" table="t_user">
<!-- 属性字段对应 -->
<!-- 实体类id与表的id对应 pk -->
<!-- @param name 实体类唯一属性的属性名
@param column 表中对应的唯一属性的字段名[主键]
-->
<id name="uid" column="uid">
<!-- 设置数据库表内id的生成策略 [自增][主键]
@param class
- native 主键且自增长
-->
<generator class="native"></generator>
</id> <!-- 配置其他属性和表的字段对应 -->
<!-- @param name 实体类的属性名称
@param column 实体类对应的字段的名称 [可以省略,创建的字段名默认和name属性值一样]
[@param type 设置实体类的字段类型,Hibernate会自动生成对应的类型]
-->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>

5.hibernate核心配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入约束 -->
<!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标签里面 -->
<session-factory>
<!-- ① 配置数据库信息 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_demo1</property>
<property name="connection.username">root</property>
<property name="connection.password">996225</property> <!-- ② 配置hibernate信息 [可选] --> <!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property> <!-- format SQL -->
<property name="format_sql">true</property> <!-- Drop and re-create the database schema on startup -->
<!-- 值有很多 create update delete
最常用的是update 有表更新 无表创建
-->
<property name="hbm2ddl.auto">update</property> <!-- SQL dialect -->
<!-- 每个数据库 都有自己的SQL标准 比如分页在mysql中用limit,oracle用rownum
让hibernate识别特有的语句[SQL标准之外的]
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- ③ 引入映射文件 -->
<mapping resource="tech/youngs/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>

6.测试类

package tech.youngs.hibernatetest;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test; import tech.youngs.entity.User; public class HibenateDemo { @Test
public void add()
{
/*第一步 加载Hibernate核心核心配置文件*/ /* 详解Configuration
* 作用:去src下找hibernate.cfg.xml,加载核心配置文件
* */
Configuration cfg = new Configuration();
/*会找hibernate.cfg.xml的文件 加载进来*/
cfg.configure(); /*第二步 创建SessionFactory对象*/
/*会根据引入的映射文件 在数据库中生成表*/ /* 详解SessionFactory
* 作用:
* 在创建过程中:根据数据库配置和映射文件配置生成表【非常耗费资源】
* 一般的时候会一个项目只创建一个SessionFactory对象
* ->创建一个工具类,使用静态代码块(类加载时只执行一次)
* SessionFatory sessionFactory = HibernateUtil.getSessionFactory();
*
* */
SessionFactory sessionFactory = cfg.buildSessionFactory(); /*第三步 创建session*/
/* 详解Session
* 作用 CURD操作
* 常用方法:save[添加] update[修改] delete[删除] get[根据id查数据]
* 特点:单线程对象[只能自身使用,无法共用]
* */
/*类似于JDBC的Connection*/
Session session = sessionFactory.openSession(); /*第四步 开启事务*/
/*详解 Transaction
* 提交事务:commit
* 回滚事务:rollback -> 回到操作之前的状态
* 事务
* 特性:原子性[要么都成功,要么都失败]
* 一致性[数据要前后要一致,一个账户钱减少了,另一个就要多,不能说这边少了那边没有多,账户的总数就不一致]
* 隔离性[事务与事务之间不受影响]
* 持久性 [数据库提交,数据持久化了]
* */
Transaction tx = session.beginTransaction(); /*第五步 CURD操作*/
User user = new User();
user.setUsername("小明");
user.setPassword("123456");
user.setAddress("Xianyang"); /*使用session中的save添加*/
session.save(user); /*第六步 提交事务*/
tx.commit(); /*第七步 关闭资源*/
session.close();
sessionFactory.close(); }
}

上面需要注意得一个问题就是SessionFactory创建过程中会根据映射文件创建表,这是一个非常耗费资源的过程,如果每一次访问都要创建资源的话,不仅用户体验不好而且服务器也很耗费资源,所以在开发过程中一般会单独的创建一个Util类,在类中的静态代码块中完成Configuration和SessionFactory的创建,并声明一个返回SessionFactory的方法即可。由于静态代码块在类创建的时候就执行而且只执行一次,所以这样一定程度上解决了问题。下面是Util的代码:

package tech.youngs.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtil {
private static Configuration cfg = null;
private static SessionFactory sessionFactory = null;
static{
//加载配置文件
cfg = new Configuration().configure();
sessionFactory = cfg.buildSessionFactory();
} public SessionFactory getSessionFactory()
{
return sessionFactory;
}
}

---恢复内容结束---

Hibernate学习笔记①的更多相关文章

  1. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  2. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  3. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  4. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  5. Hibernate学习笔记

    一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...

  6. Hibernate学习笔记(四)

    我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...

  7. Hibernate学习笔记(三)

    我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...

  8. HIbernate学习笔记(一) 了解hibernate并搭建环境建立第一个hello world程序

    Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装,Java程序员可以使用面向对象的编程思维来操纵数据库,它通过对象属性和数据库表字段之间的映射关系,将对象 ...

  9. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  10. Hibernate学习笔记(1)Hibernate构造

    一 准备工作 首先,我们将创建一个简单的基于控制台(console-based)Hibernate应用. 我们所做的第一件事就是创建我们的开发文件夹.并把所有需要用到的Java件放进去.解压缩从Hib ...

随机推荐

  1. DELPHI删除记录文件

    http://blog.itpub.net/729024/viewspace-564890/ DBGrid1.SelectedRows.Delete;

  2. Intent的属性及Intent-filter配置——指定Action、Category调用系统Activity

    Intent代表了启动某个程序组件的“意图”,实际上Intent对象不仅可以启动本应用内程序组件,也可启动Android系统的其他应用的程序组件,包括系统自带的程序组件——只要权限允许. 实际上And ...

  3. HTML5常用标签分类

    1.行级元素标签:a.span.sup.sub.em.b.big.i.strong 2.块元素标签:div.p.h1~h6.ul.ol.li.table.form.article.footer.hea ...

  4. 如何在项目中引入MetaQ消息收发机制

    当需要异步发送和接收大量消息时,需要在Crystal项目中引入MetaQ消息收发机制. 关于MetaQ使用的官方例子可参考:https://github.com/killme2008/Metamorp ...

  5. HDU4127(IDA*)

    Flood-it! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. 没有苹果电脑打包iOS平台的 Ionic 2程序——《Ionic 2 实例开发》更新内容

    没有苹果电脑打包iOS平台的 Ionic 2程序--<Ionic 2 实例开发>更新内容春节刚过,祝各位新的一年里万事如意,一帆风顺.<Ionic 2 实例开发>在这段时间里更 ...

  7. 蓝桥网试题 java 入门训练 圆的面积

    ---------------------------------------------------------------------------------------------------- ...

  8. pwnable.kr-collision -Writeup

    bof html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...

  9. C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)

    树 利用顺序存储和链式存储的特点,可以实现树的存储结构的表示,具体表示法有很多种. 1)双亲表示法:在每个结点中,附设一个指示器指示其双亲结点在数组中的位置. 2)孩子表示法:把每个结点的孩子排列起来 ...

  10. 微信jsSDK公众号开发时网页提示 invalid signature错误的解决方法

    微信公众号开发jsSDK,链接地址不能加?参数,可以通过#传递参数. 不然.页面wx.ready()时就会报错,用 wx.error(function (res) { alert("接口验证 ...