Hibernate学习笔记①
---恢复内容开始---
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学习笔记①的更多相关文章
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- Hibernate学习笔记
一.Hibernate基础 1.Hibernate简介 Hibernate是一种对象关系映射(ORM)框架,是实现持久化存储的一种解决方案.Java包括Java类到数据库表的映射和数据查询及获取的方法 ...
- Hibernate学习笔记(四)
我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...
- Hibernate学习笔记(三)
我是从b站视频上学习的hibernate框架,其中有很多和当前版本不符合之处,我在笔记中进行了修改以下是b站视频地址:https://www.bilibili.com/video/av14626440 ...
- HIbernate学习笔记(一) 了解hibernate并搭建环境建立第一个hello world程序
Hibernate是一个开放源代码的ORM(对象关系映射)框架,它对JDBC进行了轻量级的封装,Java程序员可以使用面向对象的编程思维来操纵数据库,它通过对象属性和数据库表字段之间的映射关系,将对象 ...
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
- Hibernate学习笔记(1)Hibernate构造
一 准备工作 首先,我们将创建一个简单的基于控制台(console-based)Hibernate应用. 我们所做的第一件事就是创建我们的开发文件夹.并把所有需要用到的Java件放进去.解压缩从Hib ...
随机推荐
- PHP生成短信验证码
简单版本 <?php function generate_code($length = 6) { $min = pow(10 , ($length - 1)); $max = pow(10, $ ...
- 微信小程序t填坑之旅一(接入)
一.小程序简介 小程序是什么? 首先"程序"这两个字我们不陌生.看看你手机上的各个软件,那就是程序.平时的程序是直接跑在我们原生的操作系统上面的.小程序是间接跑在原生系统上的.因为 ...
- Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
Oracle 12cR1 RAC 在VMware Workstation上安装(上)-OS环境配置 1.1 整体规划部分 1.1.1 所需软件介绍 Oracle RAC不支持异构平台.在同一个集群 ...
- Vmware 中安装 Ubuntu Server (或者ubuntu 以文本界面登陆时) 分辨率无法全屏问题
Vmware 中安装 Ubuntu Server/Ubuntu 分辨率,无法全屏问题 需要更改grub设置 在终端或者文本界面按下列步骤进行设置: 第一步: 输入命令 sudo vim /etc/de ...
- linux驱动的多种init函数及其调用顺序
在驱动设计时可以选用多种驱动初始化函数达到控制驱动初始化顺序控制,其中level(__define_initcall的第一个参数即优先级)越小优先级越高, #define pure_initcall( ...
- ArcGIS制图表达Representation-制图表达使用须知
ArcGIS制图表达Representation-制图表达使用须知 by 李远祥 前面章节也介绍了一些制图表达的适用范围和场景,如果有觉得需要使用制图表达去完成其工作的话,还需要注意制图表达的一些技术 ...
- PHP反射之类的反射
最近在琢磨如何用PHP实现站点的插件功能,需要用到反射,于是现学了一下,笔记如下: class Person { public $name = 'Lily'; public $gender = 'ma ...
- C#文本框允许使用ctrl+A
C#文本框中默认是不允许使用全选的.可以通过以下事件完成: private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.C ...
- shell脚本,符号
在shell中常用的特殊符号罗列如下: # ; ;; . , / \\ 'string'| ! $ ${} $? $$ $* \"string\"* ** ...
- 毕向东udp学习笔记3多线程聊天
项目功能: 实现了多线程下的发送接收,比较好 希望可以加入GUI,类似聊天软件一样,有一个消息输入框,捕获输入消息,作为发送线程 有一个显示消息框,接收消息并显示,作为接收线程 不知道的是,当在线程中 ...