6.lazy属性
延迟加载,即是否把主控方属性及关联对象一次性加载到内存中,lazy=false,不立即加载,等到用时再去数据库加载关联对象,lazy=true,立即加载关联对象
7.session关闭后再去加载关联对象,会报异常
课下学习Hibernate 集合映射章节。*****
任务:课堂示例自己写一遍,总结。
8.查询
Criteriac=session.createCriteria(User.class);
c.add(Expression.eq(“userName”,”zz”));
c.add(Expression.eq(“userAge”,21));
Criteria本身只是个查询容器
1:// 创建Criteria对象
Criteria criteria = session.createCriteria(GuestBook.class);
/*当为Object.class时,查出的是所有的数据*/
// 通过查询返回一个集合
List<GuestBook> guestBooks = criteria.list();
2:// 创建Criteria对象
Criteria criteria = session.createCriteria(GuestBook.class);
/ 创建查询条件对象
Criterion criterion =Restrictions.eq("ip","192.168.1.168");
// 添加条件
criteria.add(criterion);
// 再添加筛选条件Expression
criteria.add(Restrictions.like("title", "学习H%"));
// 通过查询返回一个集合
List<GuestBook> guestBooks = criteria.list();
分页:
Criteria.setFirstResult(100);
Criteria.setMaxResults(20);
// 创建Criteria对象
Criteria criteria = session.createCriteria(GuestBook.class);
int pageSize = 5;// 每页的记录数
int pageIndex = 3;// 页码
// 设置每页记录的起始索引 从0开始
criteria.setFirstResult((pageIndex-1)*pageSize);
// 设置每页显示的记录数
criteria.setMaxResults(pageSize);
//添加排序表达式:根据时间子程序
criteria.addOrder(Order.desc("createTime"));
// 通过查询返回该页的数据集合
List<GuestBook> guestBooks = criteria.list();
排序:
Criteria.addOrder(Order.asc(“”));
Criteria.addOrder(Order.desc(“”));
Projections Class进行封装分组、统计表达式。
Projections.groupProperty(“age”);
Projections.avg();
Projections.count();
Projections.max();
Projections.min();
……
1、String hql=“from User”;
2、hql=“from com.oracle.entity.User”;
Query q=session.createQuery(hql);
List userList=q.list();
查询对象存在继承关系时查询
String hql=“from Account”;
查询数据库中所有库表记录
String hql=“from java.lang.Object”;
String hql=“from User as uwhere u.userName like ‘z%’ ”;
as/where
1://返回一个List集合
String hql = "from GuestBook whereip='192.168.1.168'";
//创建查询对象
Query query = session.createQuery(hql);
//执行返回集合
List<GuestBook> guestBooks =query.list();
2:查询实体中的一列返回的是一个Object数组
String hql = "select title from GuestBook";
//创建查询对象
Query query = session.createQuery(hql);
//执行返回集合
List<Object> titles = query.list();
3:查询实体中的两列 返回一个Object数组集合
Stringhql = "select title,ip from GuestBook";
//创建查询对象
Queryquery = session.createQuery(hql);
//执行返回集合
List<Object[]>objs = query.list();
4:查询返回map集合
String hql ="select new Map(title,ip) from GuestBook";
//创建查询对象
Queryquery = session.createQuery(hql);
//返回集合
List<Map<String,Object>>list = query.list();
for(Map<String,Object>map : list){
System.out.println(map.get("0")+":"+map.get("1"));
}
String hql ="select new Map(title as title ,ip as ip) from GuestBook";
map.get("title")+":"+map.get("ip")
5:查询返回对象:必须存在此构造方法
Stringhql = "select new GuestBook(id,title,ip) from GuestBook";
//创建查询对象
Queryquery = session.createQuery(hql);
//执行返回集合
List<GuestBook>guestBooks = query.list();
6://查询返回唯一对象
Stringhql = "from GuestBook where id=1";
//创建查询对象
Queryquery = session.createQuery(hql);
//执行查询返回唯一对象
GuestBookgb = (GuestBook)query.uniqueResult();
7://查询实现排序功能
Stringhql = "from GuestBook order by createTime desc";
8://分组查询
//查询同一IP地址发布至少2条留言的IP地址信息
String hql="select count(*),ipfrom GuestBook group by ip having count(ip)>1";
9:分页
//创建hql语句 from 类名
String hql = "from GuestBook";
//创建查询对象
Query query = session.createQuery(hql);
//每页显示的记录数
int pageSize = 5;
//页码
int pageIndex = 1;
//设置每页的第一条记录的起始位置,从0开始
query.setFirstResult((pageIndex-1)*pageSize);
//设置每页的记录数
query.setMaxResults(pageSize);
10://创建hql语句 带参数(占位符)
String hql = "from GuestBook where titlelike ?";
//创建查询对象
Queryquery = session.createQuery(hql);
//设置参数的值
query.setString(0,"学习%");
String hql = "from GuestBook where titlelike :title";
query.setString("title","学习%");
11://使用封装参数的方式
String hql = "from GuestBook wheretitle like :title and ip=:ip";
//创建查询对象
Query query = session.createQuery(hql);
//创建查询参数的JavaBean对象 GBQueryProperty类必须存在
GBQueryProperty queryProperty = newGBQueryProperty();
queryProperty.setTitle("学习%");
queryProperty.setIp("192.168.1.168");
//设置查询参数Bean
query.setProperties(queryProperty);
//执行返回集合
List<GuestBook> guestBooks =query.list();
Oracle数据库分页的SQL语句:
Select * from
( select row_.*, rownum rownum_ from
( select
this_.id as id1_0_0_,
this_.title as title2_0_0_,
this_.content as content3_0_0_,
this_.author as author4_0_0_,
this_.createTime ascreateTi5_0_0_,
this_.ip as ip6_0_0_
From Tab_GuestBooks this_ )row_ where rownum <= ?
) where rownum_ > ?
9:Hibernate对象生命周期:
l 对象生命周期:一个对象从被创建开始,到不再使用,被垃圾回收期回收为止。
一个持久化类的实例可能处于三种不同状态中的某一种。这三种状态的定义则与所谓的 持久化上下文(persistencecontext)有关:Hibernate的Session对象就是这个所谓的 持久化上下文
l
瞬时状态(Transient):未与Hibernate Session 关联的对象,不会被持久化到数据库中, 也不会被赋予持久化标识(identifier),如果瞬时(Transient)对象在程序中没有被引 用,它会被垃圾回收器(garbage collector)销毁。使用Hibernate Session可以将其 变为持久(Persistent)状态
l 持久状态(Persistent):在数据库中有对应的记录,并拥有一个持久化标识(identifier)
l 脱管状态(Detached) :脱管(Detached)对象不在持久化管理之内,但对脱管对象的引用依然有效,对象可继续被修改。Detached状态的对象可以再次与某个Session实例相关联而成为Persistent对象
只更新那些被修改的列,可以通过修改配置dynamic-update=”true”来实现
10:Load方法与get方法区别:
load()方法可能抛出无法恢复的异常(unrecoverable exception),如果你不确定是否有匹配的行存在,应该使用get()方法,它会立刻访问数据库,如果没有对应的记录,会返回null
11:Hibernate支持包含值 类型的实例:
l Set: 无序且无法包含重复元素
private Set images;
<set name="images"table="T_IMAGE">
<key column="id" />
<element type="string"column="path" />
</set>
l Bag: 无序且允许包含重复元素
private List images;
<bag name="images"table="T_IMAGE">
<key column="id" />
<element type="string"column="path" />
</bag>
<idbag name="images"table="T_IMAGE">
<collection-id type="integer"column="img_id">
<generator class="native" />
</collection-id>
<key column="id" />
<element type="string"column="path" />
</idbag>
l List: 有序且允许包含重复元素
private List images;
<list name="images"table="T_IMAGE">
<key column="id"></key>
<indexcolumn="pos"></index>
<element type="string"column="path"></element>
</list>
l Map: 包含键和值
private Map words;
<map name="words"table="T_WORDS">
<key column="dic_id" />
<map-key type="string" column="word"/>
<element type="string"column="description" />
</map>
基本步骤如下:
1:通过配置文件得到SessionFactory:
SessionFactory sessionFactory=newConfiguration().configure().buildSessionFactory();
2:通过SessionFactory 得到一个Session
Session session=sessionFactory.openSession();
3:通过session进行插入,删除,修改以及查询.
插入例子:(1)声明一个事务;(2)Session执行save()操作;(3)事务提交;(4)关闭Session,可选.
public void insert(Person p){
Transaction tran=session.beginTransaction();
session.save(p);
tran.commit();
// session.close();
}
修改例子:(1)声明一个事务;(2)Session执行update()操作;(3)事务提交;(4)关闭Session,可选.
public void update(Person p){
Transaction tran=session.beginTransaction();
session.update(p);
tran.commit();
// session.close();
}
删除例子(主键删除,推荐使用):(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;(4)执行Query的executeUpdate()操作;(5)Session事务提交
public void delete(int id){
String hql="delete Person as p where p.id=?";
Query query=session.createQuery(hql);
query.setInteger(0,id);
query.executeUpdate();
session.beginTransaction().commit();
}
删除例子(对象删除):(1)声明一个事务;(2)Session执行delete()操作;(3)事务提交;(4)关闭Session,可选.
public void delete(Person p){
Transaction tran = session.beginTransaction();
session.delete(p);
tran.commit();
session.close();
}
查询例子:(跟删除差不多) 查询语句不需要事务提交
(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;
public Persion queryById(int id){
String hql="from Person as p where p.id=?";
Query query=session.createQuery();
query.setInteger(0,id);
ListrsList=query.list();
iterator it=rsList.iterator();
Person person=null;
while(it.haseNext()){
person=(Person)it.next();
}
returnperson;
}
基本步骤如下:
1:通过配置文件得到SessionFactory:
SessionFactory sessionFactory=newConfiguration().configure().buildSessionFactory();
2:通过SessionFactory 得到一个Session
Session session=sessionFactory.openSession();
3:通过session进行插入,删除,修改以及查询.
插入例子:(1)声明一个事务;(2)Session执行save()操作;(3)事务提交;(4)关闭Session,可选.
public void insert(Person p){
Transaction tran=session.beginTransaction();
session.save(p);
tran.commit();
// session.close();
}
修改例子:(1)声明一个事务;(2)Session执行update()操作;(3)事务提交;(4)关闭Session,可选.
public void update(Person p){
Transaction tran=session.beginTransaction();
session.update(p);
tran.commit();
// session.close();
}
删除例子(主键删除,推荐使用):(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;(4)执行Query的executeUpdate()操作;(5)Session事务提交
public void delete(int id){
String hql="delete Person as p where p.id=?";
Query query=session.createQuery(hql);
query.setInteger(0,id);
query.executeUpdate();
session.beginTransaction().commit();
}
删除例子(对象删除):(1)声明一个事务;(2)Session执行delete()操作;(3)事务提交;(4)关闭Session,可选.
public void delete(Person p){
Transaction tran = session.beginTransaction();
session.delete(p);
tran.commit();
session.close();
}
查询例子:(跟删除差不多) 查询语句不需要事务提交
(1) 声明删除的SQl语句;(2)创建session的Query对象;(3)设置Query对象的参数;
public Persion queryById(int id){
String hql="from Person as p where p.id=?";
Query query=session.createQuery();
query.setInteger(0,id);
ListrsList=query.list();
iterator it=rsList.iterator();
Person person=null;
while(it.haseNext()){
person=(Person)it.next();
}
return person;
}