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 ...
随机推荐
- JIRA描述默认值设置
JIRA描述默认值设置 Setting a Default Value in the Description Field 转自https://confluence.atlassian.com/jira ...
- doubango(3)--协议栈的启动过程
协议栈启动的上层接口 对于Doubango中得sip协议栈,是通过SipStack类粘合上层代码与底层代码的,该类定义在SipStack.h中,实现在SipStack.cxx中.当构造好一个SipSt ...
- 开箱即用 - jwt 无状态分布式授权
基于JWT(Json Web Token)的授权方式 JWT 是JSON风格轻量级的授权和身份认证规范,可实现无状态.分布式的Web应用授权: 从客户端请求服务器获取token, 用该token 去访 ...
- 如何用CSS快速布局(一)—— 布局元素详细
要快速进行网页排版布局,则必须对布局的元素有清晰的了解,才不会总是在细节处出错.这一篇先详解有关布局的因素作为布局基础:块级元素and内联元素.盒模型.准确定位.元素对齐.样式继承.下一篇则重点描述快 ...
- IOS开发,遇到的第一个bug
经过几天的得瑟,今天终于开始实践IOS开发了.由于没有苹果的电脑,现在先用虚拟机凑合着. 第一个开发的东西就是苹果官方向导里的helloworld了.最后在运行的时候有一个异常,导致程序会闪退,错误信 ...
- Spark工作机制简述
Spark工作机制 主要模块 调度与任务分配 I/O模块 通信控制模块 容错模块 Shuffle模块 调度层次 应用 作业 Stage Task 调度算法 FIFO FAIR(公平调度) Spark应 ...
- Code forces 719A Vitya in the Countryside
A. Vitya in the Countryside time limit per test:1 second memory limit per test:256 megabytes input:s ...
- java集合框架02——Collection架构与源码分析
Collection是一个接口,它主要的两个分支是List和Set.如下图所示: List和Set都是接口,它们继承与Collection.List是有序的队列,可以用重复的元素:而Set是数学概念中 ...
- [Hadoop] - SSH免密码登录
在安装hadoop之前需要进行ssh免密码登录,ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Redhat为例. 我这里只采用一台机器A(10. ...
- 用phpcms如何将静态页面制作成企业网站(中)
上篇博客中讲到了该修改网页的中间部分 中间的内容是这样的,有标题和内容,里面的内容被代码替代,运行起来就这样的 里面的内容就可以在后台管理那里添加 再来看代码部分 <div class=&quo ...