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有缓存,全部查询出对数据库的压力也不大。