传智播客hibernate教程(精)
- 格式:doc
- 大小:4.40 MB
- 文档页数:25
Hibernate教程---看这⼀篇就够了1 Hibernate概述1.1什么是hibernate框架(重点)1 hibernate框架应⽤在javaee三层结构中 dao层框架2 在dao层⾥⾯做对数据库crud操作,使⽤hibernate实现crud操作,hibernate底层代码就是jdbc,hibernate对jdbc进⾏封装,使⽤hibernate好处,不需要写复杂jdbc代码了,不需要写sql语句实现3 hibernate开源的轻量级的框架4 hibernate版本Hibernate3.xHibernate4.xHibernate5.x(学习)1.2 什么是orm思想(重点)1 hibernate使⽤orm思想对数据库进⾏crud操作2 在web阶段学习 javabean,更正确的叫法实体类3 orm:object relational mapping,对象关系映射⽂字描述:(1)让实体类和数据库表进⾏⼀⼀对应关系让实体类⾸先和数据库表对应让实体类属性和表⾥⾯字段对应(2)不需要直接操作数据库表,⽽操作表对应实体类对象画图描述2 Hibernate⼊门2.1 搭建hibernate环境(重点)第⼀步导⼊hibernate的jar包因为使⽤hibernate时候,有⽇志信息输出,hibernate本⾝没有⽇志输出的jar包,导⼊其他⽇志的jar包不要忘记还有mysql驱动的jar包第⼆步创建实体类package cn.itcast.entity;public class User {/*hibernate要求实体类有⼀个属性唯⼀的*/// private int uid;private String 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 String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public void setUsername(String username) {ername = 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;}}(1)使⽤hibernate时候,不需要⾃⼰⼿动创建表,hibernate帮把表创建第三步配置实体类和数据库表⼀⼀对应关系(映射关系)使⽤配置⽂件实现映射关系(1)创建xml格式的配置⽂件- 映射配置⽂件名称和位置没有固定要求- 建议:在实体类所在包⾥⾯创建,实体类名称.hbm.xml(2)配置是是xml格式,在配置⽂件中⾸先引⼊xml约束- 学过约束dtd、schema,在hibernate⾥⾯引⼊的约束dtd约束(3)配置映射关系<hibernate-mapping><!-- 1 配置类和表对应class标签name属性:实体类全路径table属性:数据库表名称--><class name="er" table="t_user"><!-- 2 配置实体类id和表id对应hibernate要求实体类有⼀个属性唯⼀值hibernate要求表有字段作为唯⼀值--><!-- id标签name属性:实体类⾥⾯id属性名称column属性:⽣成的表字段名称--><id name="uid" column="uid"><!-- 设置数据库表id增长策略native:⽣成表id值就是主键⾃动增长--><generator class="native"></generator></id><!-- 配置其他属性和表字段对应name属性:实体类属性名称column属性:⽣成表字段名称--><property name="username" column="username"></property><property name="password" column="password"></property><property name="address" column="address"></property></class></hibernate-mapping>第四步创建hibernate的核⼼配置⽂件(1)核⼼配置⽂件格式xml,但是核⼼配置⽂件名称和位置固定的- 位置:必须src下⾯- 名称:必须hibernate.cfg.xml(2)引⼊dtd约束(3)hibernate操作过程中,只会加载核⼼配置⽂件,其他配置⽂件不会加载第⼀部分:配置数据库信息必须的第⼆部分:配置hibernate信息可选的第三部分:把映射⽂件放到核⼼配置⽂件中<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 第⼀部分:配置数据库信息必须的 --><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property> <property name="ername">root</property><property name="hibernate.connection.password">root</property><!-- 第⼆部分:配置hibernate信息可选的--><!-- 输出底层sql语句 --><property name="hibernate.show_sql">true</property><!-- 输出底层sql语句格式 --><property name="hibernate.format_sql">true</property><!-- hibernate帮创建表,需要配置之后update: 如果已经有表,更新,如果没有,创建--><property name="hibernate.hbm2ddl.auto">update</property><!-- 配置数据库⽅⾔在mysql⾥⾯实现分页关键字 limit,只能使⽤mysql⾥⾯在oracle数据库,实现分页rownum让hibernate框架识别不同数据库的⾃⼰特有的语句--><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><!-- 第三部分:把映射⽂件放到核⼼配置⽂件中必须的--><mapping resource="cn/itcast/entity/User.hbm.xml"/></session-factory></hibernate-configuration>2.2 实现添加操作第⼀步加载hibernate核⼼配置⽂件第⼆步创建SessionFactory对象第三步使⽤SessionFactory创建session对象第四步开启事务第五步写具体逻辑 crud操作第六步提交事务第七步关闭资源@Testpublic void testAdd() {// 第⼀步加载hibernate核⼼配置⽂件// 到src下⾯找到名称是hibernate.cfg.xml//在hibernate⾥⾯封装对象Configuration cfg = new Configuration();cfg.configure();// 第⼆步创建SessionFactory对象//读取hibernate核⼼配置⽂件内容,创建sessionFactory//在过程中,根据映射关系,在配置数据库⾥⾯把表创建SessionFactory sessionFactory = cfg.buildSessionFactory(); // 第三步使⽤SessionFactory创建session对象// 类似于连接Session session = sessionFactory.openSession();// 第四步开启事务Transaction tx = session.beginTransaction();// 第五步写具体逻辑 crud操作//添加功能User user = new User();user.setUsername("⼩王");user.setPassword("250");user.setAddress("⽇本");//调⽤session的⽅法实现添加session.save(user);// 第六步提交事务mit();// 第七步关闭资源session.close();sessionFactory.close();}3 内容⽬录1 实体类编写规则2 hibernate主键⽣成策略(1)native(2)uuid3 实体类操作(1)crud操作(2)实体类对象状态4 hibernate的⼀级缓存5 hibernate的事务操作(1)事务代码规范写法6 hibernate其他的api(查询)(1)Query(2)Criteria(3)SQLQuery3.1 实体类编写规则1 实体类⾥⾯属性私有的2 私有属性使⽤公开的set和get⽅法操作3 要求实体类有属性作为唯⼀值(⼀般使⽤id值)4 实体类属性建议不使⽤基本数据类型,使⽤基本数据类型对应的包装类(1)⼋个基本数据类型对应的包装类- int – Integer- char—Character、- 其他的都是⾸字母⼤写⽐如 double – Double(2)⽐如表⽰学⽣的分数,假如 int score;- ⽐如学⽣得了0分,int score = 0;- 如果表⽰学⽣没有参加考试,int score = 0;不能准确表⽰学⽣是否参加考试l 解决:使⽤包装类可以了, Integer score = 0,表⽰学⽣得了0分,表⽰学⽣没有参加考试,Integer score = null;3.2 Hibernate主键⽣成策略1 hibernate要求实体类⾥⾯有⼀个属性作为唯⼀值,对应表主键,主键可以不同⽣成策略2 hibernate主键⽣成策略有很多的值3 在class属性⾥⾯有很多值(1)native:根据使⽤的数据库帮选择哪个值(2)uuid:之前web阶段写代码⽣成uuid值,hibernate帮我们⽣成uuid值3.3 实体类操作对实体类crud操作添加操作1 调⽤session⾥⾯的save⽅法实现根据id查询1 调⽤session⾥⾯的get⽅法实现修改操作1 ⾸先查询,修改值(1)根据id查询,返回对象删除操作1 调⽤session⾥⾯delete⽅法实现3.4 实体类对象状态(概念)1 实体类状态有三种(1)瞬时态:对象⾥⾯没有id值,对象与session没有关联(2)持久态:对象⾥⾯有id值,对象与session关联(3)托管态:对象有id值,对象与session没有关联2 演⽰操作实体类对象的⽅法(1)saveOrUpdate⽅法:实现添加、实现修改3.5 Hibernate的⼀级缓存什么是缓存1 数据存到数据库⾥⾯,数据库本⾝是⽂件系统,使⽤流⽅式操作⽂件效率不是很⾼。
hibernate菜鸟教程
Hibernate是一个开源的对象关系映射框架,它提供了将Java
对象映射到关系数据库中的功能,并支持数据库的CRUD操作。
通过Hibernate,开发人员可以摆脱传统的JDBC编程,
简化了数据持久化层的开发工作。
Hibernate的主要特点包括:
1. 对象关系映射:Hibernate的核心功能就是将Java对象和关
系数据库之间进行映射,开发人员不需要编写繁琐的SQL语
句来进行数据的持久化操作,只需要操作Java对象即可。
2. 高度可定制化:Hibernate提供了丰富的配置选项,可以根
据项目的需求进行灵活的配置。
开发人员可以使用XML文件
或者注解来定义映射关系。
3. 数据库无关性:Hibernate可以适用于多种关系数据库,开
发人员不需要关心不同数据库的SQL差异,只需要根据Hibernate的API进行开发即可,从而提高了开发的效率。
4. 缓存机制:Hibernate内置了一级缓存和二级缓存的支持,
可以提高数据的访问效率。
一级缓存是在Session级别的缓存,而二级缓存是在SessionFactory级别的缓存。
5. 延迟加载:Hibernate支持延迟加载机制,可以在需要访问
关联对象时再进行查询,提高了性能。
总之,Hibernate是一个非常强大且灵活的对象关系映射框架,能够极大地简化数据持久化层的开发工作,提高开发效率。
它已经成为了Java开发中非常重要的框架之一。
Hibernate使⽤详解(⼀)⼀、前⾔ 这些天都在为公司框架重构做准备,浏览了⼀下代码,挑了⼏个不熟或者没接触过的知识点进⾏攻坚,hibernate是其中之⼀。
其实接触hibernate是在⼤学期间,应该是在2012年,已经2017-2012=5年时间了,当初给我的印象就是hibernate难学(特别是关联关系的配置这块内容),没学好,很多概念当时理解不了,于是我经⼿的项⽬基本都是使⽤mybatis,不再去碰这个“⿇烦”(所以,给⼈的第⼀印象很重要,平时要注意⼀下形象了)。
但是呢,我发现,编程的世界就是这么⼩,兜兜转转最后还是需要照⾯,于是乎,我决定,啃下这块⾻头~我翻出了2012年的⼤学课件,也在⽹上搜索了⼀⼤堆的博⽂,算是理清了hibernate关联关系配置这块内容,果真是“会当凌绝顶,⼀览众⼭⼩”,现在回头想想,hibernate并没有第⼀印象那么难,只是有些细节需要注意~ 本篇博⽂持续更新,主要是记录⼀些hibernate使⽤细节、难点,知识点顺序不分难易,想到哪记到哪⼉,有需要⾃⾏全⽂搜索,如有错误之处,还望斧正~ 本⽂运⾏环境: jdk1.8.0_131 Eclipse Mars.2 Release (4.5.2) Hibernate-release-5.2.11.final Mysql 5.6.14⼆、正⽂ 写这篇博⽂的起因是研究hibernate的关联关系配置过程中,发现很多细节问题,对于新⼿或者⼀知半解的⼈来说,理解起来很困难,作为“过来⼈”,我希望能⽤通俗⼀点的描述加上⾃⼰写的实例代码解决同⾏的疑惑,所以这边就先记录⼀下“关联关系”配置过程中的问题~ 数据库中表与表之间的关系分为三种:⼀对⼀,⼀对多,多对多。
数据表是如何体现这种关系的呢?对于⼀对⼀和⼀对多,会在其中⼀张表增加⼀个外键字段(有可能和这张表的主键同⼀字段),关联另外⼀张表的主键,多对多则会建⽴⼀张中间表,存储了两张关系表的主键,hibernate中的关联关系是建⽴在数据库中表的这层关系之上。
传智播客-jpa与hibernate(1)-实体和主键生成-那一抹云-CSDN博客传智播客-jpa与hibernate(1)-实体和主键生成收藏jpa全称是Java Persistence API,是sun公司出台的面向数据持久化层的规范,即面向接口编程,以达到“平台”无关性(这个“平台”是指jpa产品,例如hibernate,toplink,openjpa等)。
hibernate是符合jpa规范的产品之一。
说到数据持久化,先说一下以下几点:1、对于数据持久化的思想而言,内存只是一个交换数据的地方,这意味着如果断电或者进程被杀,数据就会丢失。
2、为了防止数据丢失,所以需要将数据保存到外层(硬盘,U盘或其他存储设备等)。
3、能够实现数据持久化保存的技术就称之为数据持久化。
除了jpa,还有jdbc、io等都是。
4、应用系统里的数据持久化层是从业务逻辑层分离出来的。
关于实体:1、在jpa规范里,被托管的对象都是实体,但是是用实体名来区分实体的,如果没有显示声明,默认的实体名即不包含全路径的类名,所以如果不同包下有相同类名,应该显示声明实体名予以区分,例如@Entity(name="XXX")。
2、在jpa规范出来前,hibernate等数据持久化层技术产品早已大行其道,鱼龙混杂,jpa的出现可以说对这个市场进行了规范。
hibernate在 jpa出来前是用配置文件注册托管实体的(还有一些辅助工具帮助实现实体和表模式的相互转换,可以参见《深入浅出Hibernate》),但是jpa只支持注解方式(jpa支持配置文件方式,只是很少有人这么用,就当它没有吧。
)。
所以hibernate有两种方式注册托管实体:xml配置文件和注解。
3、如果用的jpa产品是hibernate,则在persistence.xml配置文件中不用注册实体类名也能被hibernate识别,因为hibernate有扫描机制,但是其它jpa产品不一定有,所以为了提高程序的可移植性,还是在文件中加上比较好,而且这样写也比较规范。
Hibernate教程前言1、 java对象持久化技术1.1 、hibernate是什么1.2、软件模型1.2.1、概念模型1.2.2、关系数据模型1.2.3、域模型1.2.4、域对象1.2.5、域对象之间的关系1.2.6、域对象的持久化概念提示:1.3、数据库访问模式1.3.1、ORM模式1.3.2、主动域对象模式1.3.3、JDO模式1.3.4、CMP模式一、数据源层-O/R Mapping主要介绍三层架构,如何分层?(逻辑上的分层,二个原则)数据层技术的选择:直接使用1.1、SQL/JDBC:优点:很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。
此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。
缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL方言时。
这项工作通常会消耗很大一部分的开发努力。
此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。
1.2、序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据库中。
持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。
持久化的另一种用法是在机器集群中跨节点复制应用状态。
缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。
这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。
甚至不可能独立地访问或更新一个单独的对象或子图。
非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。
在特定的环境中它被作为桌面应用的适当的持久化机制。
1.3EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。
EJB规范的设计缺陷阻碍了Bean管理的持续性(BMP)实体Bean有效地执行。