Hibernatel框架基础使用
Hibernatel框架基础使用
1.简介
1.1.Hibernate框架由来
Struts:基于MVC模式的应用层框架技术
Hibernate:基于持久层的框架(数据访问层使用)!
Spring:创建对象处理对象的依赖关系以及框架整合
对于数据访问层(Dao)的代码,有好几种方式可以实现:
操作xml数据
使用JDBC技术。
- 原始的jdbc技术,使用Connection/Statement/ResultSet对象
- 自定义一个持久层框架,封装了dao的通用方法
- DBUtils组件,轻量级的dao组件‘
- Hibernate技术(Hibernate最终执行的也是JDBC代码)
1.2.ORM和Hibernate概念
ORM:Object Realation Mapping对象关系映射。
ORM解决什么问题?
存储:能否把对象的数据直接保存到数据库
获取:能够直接从数据库拿到一个对象
Hibernate与ORM的关系?
Hibernate是ORM的实现!
Hibernate:
- 一个开源大代码的对象关系映射框架
- 对JDBC进行了非常轻量级的对象封装
- 对JavaBean对象和数据库的表建立对应关系
2.Hibernate第一个案例实现
搭建一个Hibernate环境,开发步骤:
1.下载源码
版本:hibernate-distribution-3.6.0.Final
2.引入jar文件
下载源码解压之后有jar文件
解压后根目录的hibernate3.jar : Hibernate核心包,必须引入
lib目录下的required文件中的6个也必须引入
lib目录下的jpa文件中的hibernate-jpa-2.0-api-1.0.0.Final.jar包(事务处理包)
数据库驱动包
总计要引入1+6+1+1=9个包
3.写对象以及对象的映射
- Employee.java 对象
- Employee.hbm.xml 对象的映射(映射文件)
4.src/hibernate.cfg.xml主配置文件
- 数据库连接配置
- 加载所用的映射(*.hbm.xml)
代码示例:
Employee.java 对象
//一、 对象
public class Employee {
private int empId;
private String empName;
private Date workDate;
}
Employee.hbm.xml 对象的映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="a_hello">
<class name="Employee" table="employee">
<!-- 主键 ,映射-->
<id name="empId" column="id">
<generator class="native"/>
</id>
<!-- 非主键,映射 -->
<property name="empName" column="empName"></property>
<property name="workDate" column="workDate"></property>
</class>
</hibernate-mapping>
hibernate.cfg.xml 主配置文件
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--数据库连接配置-->
<property name="connection.url">jdbc:mysql:///db</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--数据库方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- DB schema will be updated if needed -->
<!-- <property name="hbm2ddl.auto">update</property> -->
<!--加载所有映射-->
<mapping resource="a_hello/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
App.java 测试类
public class App {
@Test
public void testHello() throws Exception {
// 对象
Employee emp = new Employee();
emp.setEmpName("班长");
emp.setWorkDate(new Date());
// 获取加载配置文件的管理类对象
Configuration config = new Configuration();
config.configure(); // 默认加载src/hibenrate.cfg.xml文件
// 创建session的工厂对象
SessionFactory sf = config.buildSessionFactory();
// 创建session (代表一个会话,与数据库连接的会话)
Session session = sf.openSession();
// 开启事务
Transaction tx = session.beginTransaction();
//保存-数据库
session.save(emp);
// 提交事务
tx.commit();
// 关闭
session.close();
sf.close();
}
}
3.Hibernate API学习
Hibernate写javad代码中常用的类有三种,一个是配置管理类Configuration。一个是SessionFactory,是Session的工厂,代表hibernate.cfg.xml配置文件,还有一个是Session对象,是数据库的连接对象
Configuration 配置管理类对象
- config.configure(); 加载主配置文件的方法(hibernate.cfg.xml),默认加载src/hibernate.cfg.xml
- config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文件
- config.buildSessionFactory(); 创建session的工厂对象
|-- SessionFactory session的工厂(或者说代表了整个hibernate.cfg.xml配置文件)
- sf.openSession(); 创建一个sesison对象
sf.getCurrentSession(); 创建session或取出session对象
|--Session session对象维护了一个连接(Connection), 代表了与数据库连接的会话。Hibernate最重要的对象,只要使用Hibernate与数据库操作,都用到这个对象。
- session.beginTransaction();开启一个事务。hibernate要求所有与数据库的操作都要有事务环境,否则报错
- session.save(emp);保存一个对象
- session.update(emp);更新一个对象,更新对象的时候,对象一定要有主键
- session.saveOrUpdate(emp);保存或者更新的方法
没有设置主键,执行保存;有设置主键,执行更新操作;如果设置主键不存在报错!- session.get(Employee.class, 1); 主键查询
- session.load(Employee.class, 1); 主键查询 (支持懒加载)
|-- Transaction hibernate事务对象
代码示例:
public class App2 {
@Test
public void testHello() throws Exception {
//对象
Employee emp = new Employee();
emp.setEmpId(1);
emp.setEmpName("Rocco2");
emp.setWorkDate(new Date());
//Configuration类
//1.创建配置管理类对象
Configuration config = new Configuration();
//加载配置文件,默认加载src/hibernate.cfg.xml
config.configure();//可以用参数指定要加载的配置文件名
//2.根据加载的配置管理类对象,创建SessionFactory对象
SessionFactory sf = config.buildSessionFactory();
//3.根据Session的工厂,创建session对象
Session session = sf.openSession();
//开启事务
Transaction tx = session.beginTransaction();
//执行操作
session.save(emp);//保存一个对象
//更新,更新对象的时候一定要有主键
session.update(emp);
//查询
Object o = session.get(Employee.class, 1);
System.out.println(o);
//提交事务,关闭
tx.commit();
session.close();
sf.close();
}
}
4.Hibernate提供的查询方式
HQL查询:
HQL查询与SQL查询区别:
SQL:(结构化查询语句)查询的是表以及字段;不区分大小写
HQL:Hibernate query language即Hibernate提供的面向对象的查询语言。查询的是对象以及对象的属性。区分大小写
Criteria查询:
完全面向对象的查询,也叫QBC,query by criteria
本地SQL查询:
复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询。此种方法有一个缺点:不能跨数据库平台使用!
代码示例:
package a_hello;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;
import java.util.List;
/**
* Hibernate提供的三种数据库查询方式
*/
public class App03 {
private static SessionFactory sf;
static {
//创建SessionFactory对象
sf = new Configuration().configure().buildSessionFactory();
}
//HQL查询【适合有数据库基础】
@Test
public void testQuery() throws Exception{
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//主键查询
Employee emp = (Employee) session.get(Employee.class, 1);
System.out.println(emp);
//HQL查询,查询全部
Query q = session.createQuery("from Employee where empId=1");
List<Employee> list = q.list();
System.out.println(list);
//关闭
tx.commit();
session.close();
}
//QBC查询,criteria查询
@Test
public void testQuery02() throws Exception{
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Employee.class);
//条件
criteria.add(Restrictions.eq("empId", 1));
//查询全部
List<Employee> list = criteria.list();
System.out.println(list);
//关闭
tx.commit();
session.close();
}
//本地SQL查询
@Test
public void testQuery03() throws Exception{
Session session = sf.openSession();
Transaction tx = session.beginTransaction();
//把每一行记录封装为对象数组,再添加到list集合
// SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM employee");
//把每一行记录封装为指定的对象类型
SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM employee").addEntity(Employee.class);
List list = sqlQuery.list();
System.out.println(list);
//关闭
tx.commit();
session.close();
}
}
5.常用的api
保存
void save();
更新
void update();
根据主键查询
findById();
查询全部
getAll();
6.Hibernate.cfg.xml主配置
Hibernate.cfg.xml是主配置文件,主要配置数据库连接信息,其他参数,映射信息三个地方。
常用的配置查询源码:hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
配置文件示例代码:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--通常,一个Session-Factory节点代表一个数据库-->
<session-factory>
<!--1.数据库连接配置-->
<property name="connection.url">jdbc:mysql:///db</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--2.其他相关配置-->
<!--2.1.必须有。数据库方言,就是指不同的数据库产品。Hibernate在运行的时候,会根据不同的数据库产品生成不同的sql语句-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--2.2.显示Hibernate在运行的时候执行的sql语句-->
<property name="hibernate.show_sql">true</property>
<!--2.3.格式化sql-->
<property name="hibernate.format_sql">true</property>
<!--2.4.自动建表-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--3.加载所有映射-->
<mapping resource="a_hello/Employee.hbm.xml"/>
</session-factory>
</hibernate-configuration>
自动建表参数解释:
<property name="hibernate.hbm2ddl.auto">update</property>
自动建表可以选择4个参数:
hibernate.hbm2ddl.auto create-drop
每次在创建SessionFactory时候执行创建表;当调用SessionFactory的close方法的时候,删除表
hibernate.hbm2ddl.auto create
每次都重新建表,如果表已经存在就删除再创建。
hibernate.hbm2ddl.auto update
如果表不存在就创建,表存在就不创建
hibernate.hbm2ddl.auto validate
(生产环境时候)执行验证,当映射文件的内容与数据库表结构不一样的时候就报错!
代码自动建表“
public class App_ddl {
// 自动建表
@Test
public void testCreate() throws Exception {
// 创建配置管理类对象
Configuration config = new Configuration();
// 加载主配置文件
config.configure();
// 创建工具类对象
SchemaExport export = new SchemaExport(config);
// 建表
// 第一个参数: 是否在控制台打印建表语句
// 第二个参数: 是否执行脚本
export.create(true, true);
}
}
上面两种方式一般在测试阶段用xml配置方式。项目中我们希望在项目启动的时候数据库已经建立好了
7.映射配置
映射配置里有普通字段映射和主键映射。其中,主键映射可以分为:单列主键映射和多列作为主键映射。
映射配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!--映射文件:映射一个实体类对象,或描述一个对象,最终实现可以直接保存对象数据到数据库中。-->
<!--package:要映射的对象所在的包(可选,如果不指定,则下面所有的类都要指定全路径)
auto-import:默认为true,在写sql的时候自动导入包名,
如果指定为false,则在java中写sql的时候必须要写类的全名-->
<hibernate-mapping package="a_hello" auto-import="true">
<!--class 映射某一个对象(一般情况,一个对象写一个映射文件,即一个class节点)
name: 指定要映射的对象的类型
table:指定对象对应的表,如果没有指定表名,默认与对象名一样
-->
<class name="Employee" table="employee">
<!-- 主键 ,映射-->
<id name="empId" column="id">
<!--
主键的生成策略
identity:自增长(mysql,db2)
sequence:自增长(序列),oracle中自增长是以序列方法实现
native:自增长(会根据底层数据库自增长的方式选择identity或sequence)
如果是mysql数据库,采用自增长方式是identity,
如果是oracle数据库,使用sequence序列的方式实现自增长
increment:自增长(会有并发访问的问题,一般在服务器集群环境下使用会存在问题)
assigned:指定主键生成策略为手动指定主键的值
uuid:指定uuid随机生成的唯一的值
foreign:外键的方式,one-to-one中介绍
-->
<generator class="native"/>
</id>
<!--
非主键,普通字段的映射
property
name:指定对象的属性名称
column:指定对象属性对应的表的字段名称,如果不写默认与对象的属性一致
length:指定字符的长度(只能字符类型使用),如果不指定,默认为255
type:指定表的字段类型,如果不指定会匹配属性的类型,指定类型有两种,
如果是java类型必须写全名,如果是Hibernate类型,直接写类名,都是小写
-->
<property name="empName" column="empName" length="125" type="java.lang.String"/>
<property name="workDate" column="workDate" length="125"/>
<!--如果列名称为数据库关键字,需要用反引号或改列名。-->
<property name="desc" column="`desc`"/>
</class>
</hibernate-mapping>
复合主键映射:
如果找不到合适的列作为主键,除了用id列以外,我们一般用联合主键,即多列的值作为一个主键,从而确保记录的唯一性
复合主键类对象:
// 复合主键类
public class CompositeKeys implements Serializable{
private String userName;
private String address;
// .. get/set
}
public class User {
// 名字跟地址,不会重复
private CompositeKeys keys;
private int age;
}
复合主键映射方法:
<class name="User">
<!-- 复合主键映射 -->
<composite-id name="keys">
<key-property name="userName" type="string"></key-property>
<key-property name="address" type="string"></key-property>
</composite-id>
<property name="age" type="int"></property>
</class>
Hibernatel框架基础使用的更多相关文章
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- Struts2框架基础
Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...
- .NET面试题系列[1] - .NET框架基础知识(1)
很明显,CLS是CTS的一个子集,而且是最小的子集. - 张子阳 .NET框架基础知识(1) 参考资料: http://www.tracefact.net/CLR-and-Framework/DotN ...
- 框架基础之Hibernate简介
框架基础之Hibernate简介 1.什么是Hibernate? Hibernate是一个开发源代码的对象关系映射框架,它对JDBC进行非常轻量级的对象封装,使得程序员可以随心所欲地使用对象编程思维来 ...
- ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
- Python云端系统开发入门——框架基础
Django框架基础 这是我学习北京理工大学嵩天老师的<Python云端系统开发入门>课程的笔记,在此我特别感谢老师的精彩讲解和对我的引导. 1.Django简介与安装 Django是一个 ...
- 如何基于Winform开发框架或混合框架基础上进行项目的快速开发
在开发项目的时候,我们为了提高速度和质量,往往不是白手起家,需要基于一定的基础上进行项目的快速开发,这样可以利用整个框架的生态基础模块,以及成熟统一的开发方式,可以极大提高我们开发的效率.本篇随笔就是 ...
- PHP面试(二):程序设计、框架基础知识、算法与数据结构、高并发解决方案类
一.程序设计 1.设计功能系统——数据表设计.数据表创建语句.连接数据库的方式.编码能力 二.框架基础知识 1.MVC框架基本原理——原理.常见框架.单一入口的工作原理.模板引擎的理解 2.常见框架的 ...
- 6月13 ThinkPHP框架基础
ThinkPHP 一.php框架基础介绍 真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维 ...
随机推荐
- less学习
// 1.变量:颜色可做+- // from @nice-blue: #5B83AD; @light-blue: @nice-blue + #111; #header { color: @light- ...
- 微信应用号(小程序)开发IDE配置(第一篇)
2016年9月22日凌晨,微信宣布“小程序”问世,当然只是开始内测了,微信公众平台对200个服务号发送了小程序内测邀请.那么什么是“小程序”呢,来看微信之父怎么说 看完之后,相信大家大概都有些明白了吧 ...
- SQLSERVER走起 APP隆重推出
SQLSERVER走起 APP隆重推出 为方便大家查看本微信公众以前推送的文章,QQ群里面的某位SQLSERVER重度爱好者开发了<SQLSERVER走起>的APP 以供大家一起交流 网页 ...
- ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
前言: 为了赶进度,周末也写文了! 前几篇讲完查询框和工具栏,这节讲表格数据相关的操作. 先看一下列表: 接下来我们有很多事情可以做. 1:格式化 - 键值的翻译 对于“启用”列,已经配置了格式化 # ...
- 随手记_C#验证码
前言 最近在网上偶然看见一个验证码,觉得很有意思,于是搜了下,是使用第三方实现的,先看效果: 总体来说效果还是可以的,官方提供的SDK也比较详细,可配置性很高.在这里在简单啰嗦几句使用方式: 使用步骤 ...
- [APUE]文件和目录(下)
一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(69)-微信公众平台开发-功能概述
系列目录 为什么要先发这个文章? 因为接下来的文章是关于微信开发的系列,心中一定要有一个概念,知道自己接下来要做什么功能. 而且微信到处都是坑,我首先要把微信与本地跑通起来才敢发布,否则中间出现坑导致 ...
- CSS样式重置(转)
body,h1,h2,h3,h4,h5,h6,dl,dt,dd,ul,ol,li,th,td,p,blockquote,pre,form,fieldset,legend,input,button,te ...
- 灵魂宝石 bzoj 2663
灵魂宝石(1s 128MB)soulgem [问题描述] "作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形" 我们知道,魔法少女的生命被存放于一个称为灵魂宝 ...
- 电信计费业务:预后融合OCS到底应该实扣还是虚扣?
引入OCS的初衷之一是为了让计费系统能够参与到用户的通讯控制中来,也就是所谓的实时信控.用户在没有余额时,通讯就会被停止,不会造成"天价欠费 ",一方面保障用户的利益,一方面也保障 ...