hibernate知识点回顾
来源:互联网 发布:如何解决网络劫持 编辑:程序博客网 时间:2024/05/16 09:04
终于轮到写Hibernate了,我心理感慨万千,没有人知道当时刚接触这个对我来说有多么的为难,几个月时间我什么都看不懂,但是不知道怎么搞得,最近我忽然间开窍了,什么都能看的懂了。
Hibernate知识点总结:
1.Hibernate是一个O/R映射框架,O是object面向对象,R是relationship关系型数据库,数据库里面一整个表映射为java的一个类,表中的一行映射为java的一个对象。因为以前JDBC的年代和数据库连接是一个很鸡肋的事,有用的代码只有一行,打开关闭连接处理异常占大篇幅,Hibernate就诞生了
2.HQL 本意为hibernate query language ,我是这样记住的hibernate query list.查询出来的结果用query来装。
String hql="select sid,sname from Student"
Query query=session.createQuery(hql)
List list=query.list() 把query里的结果转化为list,然后用增强for(....)循环进行遍历,也可以把list.iterator,用while(.....)循环来遍历Iterator
hql的语句有多种写法,
############## from users
##############select new Student(sid,sname) from Student
##############from Student where sname=? 使用占位符形式的HQL
##############form Student where sname=:sname 使用命名参数 http://www.cnblogs.com/shiyangxt/archive/2009/01/13/1375151.html
hql语句不带select的,返回的结果位于session缓存中,属于持久化对象。带select的不占用session缓存。报表那种处理大量数据,只涉及读操作,就使用select。
3.Criteria方法
与HQL不同的是,Criteria不需要会SQL语句,适合那种基础比较薄弱的人员。
Criteria criteria=session.createCriteria(Login.class)
List list=criteria.list()
###########Criteria条件:
Criteria本身只是查询条件的容器,如果想要设定查询条件,使用Criteria的add()方法加入"条件实例",条件实例是由Restrictions的各个静态方法返回的,返回的每一个都代表一个条件:
Criteria criteria=session.createCriteria(Login.class)
criteria.add(Restrictions.eq("username","Tom")) 等价于 select * from login where username='Tom'
// criteria.add(Restrictions.between("age",21,22)) 等价于select * from login where age between 21 and 22
// criteria.add(Restrictions.le("age",22))
// criteria.add(Restrictions.ge("age",21))
result=criteria.list()
##########Criteria排序:
使用order关键字对Criteria查询结果进行排序,在sql中实现排序的是asc(升序)和desc(降序),order中也是asc()和desc(),加入order条件使用的是addOrder(),而不是add():
criteria.addOrder(order.desc("age"))
##########Criteria投影,达到统计的效果:
在Criteria中使用投影org.hibernate.criterion.Projections来实现SQL语句中的聚合函数的功能,通过Projections的projectionList()能实现一次查询调用多个聚合查询
Criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("username"))
.add(Projections.rowCount())
.add(Projections.avg("age"))
.add(Projections.max("age"))
);
###############Criteria分页:
setFirstResult() 第一条记录的位置
setMaxResult() 每一页的条数
Criteria criteria =ession.createCriteria(Login.class)
criteria.setFirstResult(1);
criteria.setMaxResult(2);
result=criteria.list();
4.DetachedCriteria方法
detachedCriteria与criteria的唯一区别是detachedCriteria创建时不需要session,其他地方都一模一样
DetachedCriteria dc = DetachedCriteria.forClass(Student.class)
http://www.blogjava.net/caixuetao/articles/60631.html
5.本地SQL查询,也就是原生的sql
String sql="select {1.*} form login 1 where 1.username='Tom' "
SQLQuery query=session.createSQLQuery(sql).addEntity('1',Login.class)
本地SQL不再使用Query接口,改为使用SQLQuery接口,使用createSQLQuery()需要传入相关的实体类,就用addEntity把他们联系起来
6.命名HQL查询,也就是配置文件中写SQL,这样的好处是代码中不会出现任意一个sql语句
http://www.360doc.com/content/14/0615/22/8072791_387007207.shtml 人家已经写得很好了
命名SQL写在配置文件xxx.hbm.xml中,并且写在<hibernate-mapping>里面,程序中使用session对象的getNamedQuery()方法获得在映射配置文件中添加的查询语句
<query name="loginUser">
<![CDATA[
from Login login where login.username=:username and login.password=:password
]]>
</query>
Query query =session.getNamedQuery("loginUser");
Login login=new Login(); 实例化一个对象,把有用的信息保存到该对象中
login.setUsername("Tom");
login.setPassword("123456");
query.setProperties(login); 将对象作为条件组合到HQL中
List list=query.list();
7.命名SQL,与命名HQL写法基本一样,具体的到时候再百度
8.定制SQL,也和命名HQL写法差不多,到时候百度
9.存储过程
http://blog.csdn.net/lanbosan/article/details/2429917
存储过程运行在数据库中,代码里只需要调用存储过程的方法就可以了,调用存储过程的方法很多,具体到时候再说吧
http://blog.csdn.net/zhuyi412546724/article/details/6058270?locationNum=8&fps=1
使用CallableStatement调用存储过程
- Connection con = session.connection();
- String procedure = "{call updateUser(?, ?, ?)}";
- CallableStatement cstmt = con.prepareCall(procedure);
- cstmt.setString(1, "陈xx");
- cstmt.setString(2, "http://www.blogjava<a href="http://lib.csdn.net/base/dotnet" class='replace_word' title=".NET知识库" target='_blank' style='color:#df3434; font-weight:bold;'>.NET</a>/sterningChen");
- cstmt.setString(3, "sterning");
- cstmt.executeUpdate();
- tx.commit();
8.sessionFactory,我是这样理解的,启动的时候自动去寻找配置文件,也可以手动寻找hibernate的配置文件,根据配置文件能生成一个sessionFactory,所以这个东西只能有一个,每换一个数据库生成一个新的sessionFactory。好比是JDBC当中的DriverManager,用来生成连接的。
http://www.cnblogs.com/hibernate3-example/archive/2012/05/17/2506935.html
9.缓存
一级缓存:别名叫"session缓存",生命周期对应着一次数据库事务
二级缓存
查询缓存
http://blog.csdn.net/switzerland/article/details/3343348
10.乐观锁和悲观锁
悲观锁,正如其名,他是对数据库而言的,数据库悲观了,他感觉每一个对他操作的程序都有可能产生并发
http://blog.csdn.net/csh624366188/article/details/7654996
- hibernate知识点回顾
- hibernate知识点回顾
- 知识点回顾
- 知识点回顾
- 知识点回顾
- 知识点回顾
- Hibernate回顾
- 面试知识点回顾
- 汇编语言 知识点回顾
- java 知识点回顾
- c++知识点回顾
- java 知识点回顾2
- C++ 基本知识点回顾
- servlet知识点回顾
- Java知识点回顾一
- Android知识点回顾
- web知识点回顾
- java 知识点回顾
- 解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 转自:http://cooler1217.iteye.c
- Python使用difflib对比两个文件操作实例
- 一个简单的登录,POST表单提交时报错,403 bad or missing token!
- Ubuntu中Vmware Tools的安装与卸载 <一>
- JavaScript写出,用户输入一个三位数,求出各个数位的和。
- hibernate知识点回顾
- PHP 获取当前时间以及解决PHP通过date()函数取得时间错误问题
- ios中反向传值得几种方法
- java xsd 校验工具类
- Effective Java读书笔记——第六章 枚举和注解
- android webview加载https网站
- 碰到的一些IOS兼容性问题
- java 正则表达式去除标点符号
- android开发之蓝牙配对连接的方法