文档库 最新最全的文档下载
当前位置:文档库 › java中的hibernate

java中的hibernate

1.1

1、持久化层 :是应用程序的分层体系结构发展到今天的产物。

2、软件层特征 :层与层之间存在自上而下的依赖关系,上层的组件会访问下层组件的API,而下层组件不应该依赖上层组件/ 每个层对上层公开API,但具体的实现细节对外透明。

3、软件分层的优点:伸缩性 / 可维护性 / 可扩展性 / 课重用性 / 可管理性

4、“持久化”:(狭义)指把内存中的对象存储到关系型数据库中
5、“持久化”:(广义)包括和数据库相关的各种操作,保存、更新、删除、加载、查询

6、对象--关系数据:对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。

7、JDBC编程缺点:义务逻辑和关系数据绑定,增加维护难度、在程序代码中嵌入面向关系的SQL语句,使开发人员不能完全运用面向对象的思维练编写程序、如果程序代码中的SQL语句包含语法错误,在编译时不能检查这种错误,在运行时才能发现这种错误,增加了调试的难度

8、Hibernate是什么? Hibernate是连接Java应用程序和关系型数据库的框架,能够建立对象模型和关系数据模型之间的映射,是一种自动ORM框架,是对JDBC API的封装,是JDBC轻量级框架

9、Hibernate是对JDBC的封装,增加了代码的重用性,简化了代码,提高了编程的效率。Hibernate是对JDBC的轻量级封装,必要时Java程序员可以绕过Hibernate直接方位JDBC API

10、Hibernate之父: Gavin King

1.2:
掌握如何创建Hibernate项目
掌握Hibernate API
Hibernate访问持久化类的属性的原理
Hibernate实体映射技巧
Hibernate控制insert、update

1、Hibernate配置文件两种方式:
hibernate.properties Configuration cfg = new Configuration();
hebernate.cfg.xml Configuration cfg = new Configuration().configure();

2、(Hibernate.cfg.xml)

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"https://www.wendangku.net/doc/6f16669244.html,/hibernate-configuration-3.0.dtd">



com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/hibernate
root

utf8
2
org.hibernate.dialect.MySQLDialect
true



3、 Hibernate 实体关系映射文件:(class文件中包含一个id子元素以及多个property子元素)

version='1.0' encoding='UTF-8'?>
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"https://www.wendangku.net/doc/6f16669244.html,/hibernate-mapping-3.0.dtd">
//声明DTD文档对xml的语法和格式做了定义




………
//id和property元素不能颠倒位置

…..



4、id 子元素设定持久化类的OID和表的主键的映射-- 元素制定OID的生成器
property子元素设定类的属性和表的字段的映射--:对应类的属性名称 / :指定属性的类型 / :指定表字段的名称 / :指定属性是否允许为空。

5、Configuration的作用:负责管理Hibernate的配置信息/ 负责创建SessionFactory对象
SessionFactoty的作用:缓存Hibernate配置信息和映射元素数据信息/负责创建Session实例
SessionFactoty的创建:configuration.buildSessionFactory();

6、Session的创建:Session session = sessionFactory.openSession();

1.3
1、Hibernate采用对象标示符(OID)区分对象:
OID是关键数据库中主键(通常是代理主键)在JAVA对象模型中的等价物

2、Hibernate自带的标示符生成器:(OID必须为short int long型)
increment



identity



Hilo

hl
next_value
100



seqhilo

hi_value
100


单个业务主键映射:(没有ID,而是以name作为业务主键)




2.1
Hibernate实体粒度细分:(面向设计)
public class Tusers{
private Integer id;
private Name name;
private Contact contact;
}
public class Name{
private String firstname;
private String lastname;
}
public class Contact{
private String address;
private String email;
private String telephone;
}

相应的映射配置:



="native">













Hibernate实体粒度细分(面向性能)--提高系统的能耗比
public class StudentInfo{
private Integer id;
private String firstname;
prevate String lastname;
}
public class StudentProfile extends StudentInfo{
private Blob image;
}
父类中的直接映射实体:









子类中的直接映射实体:


 










/.one to one./ :























//**
** session实现缓存:
**//
Session session = SessionFactory.openSession();

Transaction tx = session.beginTransaction();

Users u = new Users(“Tom”);
session.save(u);//假设分配u的OID=3
https://www.wendangku.net/doc/6f16669244.html,mit(); // 提交事务
u= null;
Users u2= session.load(Users.class ,new Integer(3));
u= session.load(Users.class,new Integer(2));
session.close();//session关闭
u2 = null;
u = null;


/**
**Session缓存的作用:
**/
1.减少数

据库访问次数,提高数据方位效率。
2.保证缓存中的对象与数据库中相关的记录同步。
3.档缓存总的持久化对象存在循环关联关系时,Session会保证不出现死循环,以及由死循环引起的堆栈溢出异常。

/**
**实体对象(objects)的3中状态:
**/
1.Transient(临时状态):刚刚被NEW关键字创建,还没有被持久化,不在session的缓存中。
2.Peesistent(持久状态):已经被持久化,并加入到session缓存中。
3.Detached(游离状态):已经被持久化,但不在处理session缓存中。

Hibernate数据检索分类:
1.OID检索:session.get()/session.load()
2.HQL:使用面向对象的HQL语言进行查询。
3.QBC封装了基于字符串形式的查询语句,提供更加面向对象的借口。
4.本地SQL检索:使用本地数据库的SQL查询语言进行查询。


HQL实体查询:
where语句:String hql="from Tuser where firstname = 'xiao'";
Query query = session.creatQuery(hql);
List userList = query.list();

as 关键字制定类的别名:
Query query = session.creatQuery("from Tuser where firstname = 'xiao'");
Query query = session.creatQuery("from Tuser as u where u.firstname = 'xiao'");
Query query = session.creatQuery("from Tuser u where u.firstname = 'xiao'");

HQL支持多态查询: 查询出当前类以及所有子类的实例。
Query query = session.creatQuery("from https://www.wendangku.net/doc/6f16669244.html,ng.Object");
List list = query.list();

HQL查询返回结果方法:
list():返回List类型的查询结果,返回所有满足条件的对象。
uniqueResult():返回单个对象。
Query query = session.creatQuery("from Tuser u where u.id = 1");
Tuser u = (Tuser)query.uniqueResult();

HQL参数绑定:
1.按参数位置绑定:
String hql = "from Tusers as user where https://www.wendangku.net/doc/6f16669244.html,=?and user.age=?";
Query query = session.creatQuery(hql);
query.setString(0,"xiao");
Query.setInteger(1,21);

2.按参数名称绑定:
String hql="from Tuser as user where https://www.wendangku.net/doc/6f16669244.html,=:name and user.age=:age";
Query query = session.creatQuery(hql);
query.setString("name","xiao");
Query.setInteger("age",21);


HQL实体更新:
1.Transaction tx = session.beginTransaction();
String hql = "update Tuser set address='石家庄'";
Query query = session.creatQuery(hql);
int ret = query.executeUpdate();
https://www.wendangku.net/doc/6f16669244.html,mit();
HQL实体删除:
2.Transaction tx = session.beginTransaction();
String hql = "delete Tuser where address='河北石家庄'";
Query query = session.creatQuery(hql);
int ret = query.executeUpdate();
https://www.wendangku.net/doc/6f16669244.html,mit();

HQL联合查询:
1.内连接:select * from users inner join address on users.'id'='address'.userid;
2.左连接:select * from users left inner join address on users.'id'='address'.userid;
3.右连接:select * from users right inner join address on users.'id'='address'.userid;

QBC检索方式:
1.检索姓名为xiaohao的所有

用户。
Criteria cirteria = session.creatCriteria(Tuser.class);
Criterion c1 = Expression.eq("name","xiaohao");
criteria.add(c1);
List result = criteria.list();
步骤:1、调用session的creatCriteria()创建Criteria实例。
2、通过Expression设定查询条件(或者Restrictions)
3、调用Criteria实例的list()方法执行查询。

Expression 提供了SQL查询限定机制:
Expression.eq 等于
Expression.not(Expression.eq()) 不等于
Expression.gt 大于
Expression.ge 大于等于
Expression.lt 小于
Expression.le 小于等于
Expression.isNull 空值
Expression.isNotNull 非空

QBE:
Criteria criteria = session.creatCriteria(Tuser.class);
Tusers tusers = new Tusers();
Tusers.setName("xiao");
Criterio c1 = Example.creat(tusers);
c1.excludeNone();
criteria.add(c1);
List result = criteria.list();
等价于:
Criteria criteria = session.createCriteria(Tuser.class);
criteria.add(Expression.eq("name","xiao"));
注:Criteria 同HQL相同也支持多态查询(可以查询出连同子类的所有对象)同时也支持联合查询(内连接,做外连接,迫切做外连接)

DetachedCriteria:
Criteria 的生命周期位于其宿主session生命周期之内,限制了Criteria的重用
DetachedCriteria可以脱离session实例独立存在
我们可以将某些通用的Criteria查询条件进行抽离,使用时再与当前session示例绑定

实例:
DetachedCriteria deCritecia = DetachedCriteria.forClass(Tuser.class);
deCriteria.add(Expression.eq("name","xiao"));
deCariteria.add(Expression.eq("sex",new Integer(1)));
//绑定一个session
Criteria criteria = deCriteria.getExecutableCriteria(session);
List list = critecia.list();

本地SQL语句查询:
String sql = "select * from tusers";
SQLQuery query = session.creatSQLQuery(sql).addEntity(Tusers.class);

List list = query.list();

调用session.creatSQLQuery()创建SQLQuery实例
调用SQLQuery实例的addEntity方法绑定实体类
调用SQLQuery实例的list()方法执行查询(如果查询单个对象使用uniqueResult():
Tuser u = (Tuser)query.uniqueResult();


SQL联合查询:
内连接:
String sql = "select {usr.*},{order.*}from users as usr inner join orders as order on usr.id=https://www.wendangku.net/doc/6f16669244.html,erid";
SQLQuery query = session.creatSQLQuery(sql).addEntity("usr".Users.class).addEntity("orde".Address.class);

List list = query.list();

Hibernate 检索策略:立即检索/延迟检索/迫切做外连接检索


Hibernate类级别可选的检索策略:
立即加载:
延迟加载:



























相关文档
相关文档 最新文档