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调用存储过程

  1.  Connection con = session.connection();   
  2.         String procedure = "{call updateUser(?, ?, ?)}";   
  3.         CallableStatement cstmt = con.prepareCall(procedure);   
  4.         cstmt.setString(1"陈xx");   
  5.         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");   
  6.         cstmt.setString(3"sterning");   
  7.         cstmt.executeUpdate();   
  8.         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

0 0