爱玺玺

爱玺玺的生活日记本。wx:lb87626

hibernate的HQL零碎

hql(hibernate query language)

删除

session delete(对象)->批量删除

添加 

session save session persist

修改

session update(对象)


查询 对象 obj

obj.setxxx();


load或get可以查询


query接口

executeUpdate() update or delete


HQL对象名区分大小写

HQL查询的是对象,不是表

Query q=session.createQuery(hql)


HQL的查询语句可以删除

注意 查询的是对象,不要被语法结构迷惑。


Criteria 是更加的面向对象查询


检索类的全部属性


逆向工程


procedures


create sequence studourse_seq

start with 1

increment by 1

nocahce

nocycle

minvalue 1

maxvalue 99999


hibernate创建表强烈要有主键且不含业务逻辑。没有业务逻辑就可以不被修改,从而很稳定。


第一范式也要求有主键,避免重复记录。


hibernate推荐设计的表的时候应当每张表都有一个主键,而且这个主键尽量不含业务逻辑。比方说,假设有个系统有个产品的编号。

比如产品编号,用户的登录账号等都不要使用主键,看来玫瑰公馆的登录user系统需要改进,不用修改,用户名是唯一的。


java可以用个uuid类生成唯一的。

php用什么生成?


那么引出来了,对象的属性尽量不要使用主键。


高低位算法,时分秒生成唯一数。



逆向工程自动生成domain对象和映射文件。

DB Browser

Oracle里面使用方案

数据库-》方案-》数据对象-》表


有主外键关联的表先映射主表再映射从表。


不使用hibernate生成的factory


hibernate是搭建数据库和domain的桥梁,通过映射。

courses 课程表

studcourse 选课表

student表


映射成了一个集合,一对多,多对多。


Student domain的

studcoures=new hashSet(0);//映射成了一个集合。


一个学生可以选择多个课程。


选课表

课程表

学生表


学生选课 通过课程表


那么选课表里面应该是学生表和课程表的关系对应


选课domino的属性直接变成了一个对象。



studCourse两个外键一个指向学生,一个指向课程。

对象的表和对象的表,然后就是外键引用整合对象表关系的表。


关系模型通过外键反应关系,关系对象。通过外键指向另外的对象。




一个学生可以选多门课程,那么就有多门课程和它对应。


一门课程可以被多个学生选。通过集合实现,隐约有为什么选择集合的理由。


多对一和一对多的关系。


many-to-one 

one-to-many


castcade


工具类view层


检索类的全部属性


Session session=null;

Transaction tx=null;

try{

session=HibernateUtil.getCurrentSession;

tx=session.beginTransaction();

//检索所有学生信息,返回的直接是对象

List<Student> list=session.createQuery("from Student").list();

//使用iterator取出对象

Iterator<Student> iterator=list.iterator();

while(iterator.hasNext){

  Student s=iterator.next();

}

//使用for增强

for(Student s:list){

  System.out.println(s.getSname);

}

//检索类的部分属性

tx.commit();

}catch(Exception e){

……


}


xml配置文件add properties增加属性显示sql语句



jdbc最好不要用select * from ,最好不要用*。

但是在hibernate可以不遵循这个规则。hibernate建议把所有对象属性查询出来。hibernate要把表转换成对象。到时候直接使用是对象。


但是hibernate还是可以只取出部分属性,单独查询在hibernate很少用。


List list=session.createQuery("select sname,sdept from student").list();

因为这里没有查询完整所以这里不能写成

List<Student> list=


//返回了一个对象数组,但不是Student对象

for(int i=0;i<list.size();i++){

  //获取对象数组,这个数组内容对应表的字段

  Object[] objs=(Object[])list.get(i);

  //那么objs就是个数组,这里的对象属性就对应了数组的内容了

  syso(objs[0].toString);

}


因此可以看出只查出部分字段在hibernate中很麻烦。



通过List来查询


session.createQuery("from student").list



返回一个集合,就可以知道该学生选择了哪些课程。



核心:session.createQuery(sql).list();


返回的是一个集合对象,注意是集合。集合和需要遍历。


Set<Studcourse> set=s.getStudcourses();

返回的是set集合,set设置的意思,返回设置的集合。


for(Studcourse sc: set){

  syso(sc.getSname());

}



总之hibernate的查询最好都写在seesion关闭前,session关闭也就是回话关闭就查询不到了。

hibernate有缓存,全部查询出对数据库的压力也不大。


发表评论:

Powered By Z-BlogPHP 1.4 Deeplue Build 150101

Copyright Your WebSite.Some Rights Reserved.

蜀ICP备11021721号-5