hibernate知识点回顾

    xiaoxiao2021-03-25  110

    终于轮到写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

    转载请注明原文地址: https://ju.6miu.com/read-19911.html

    最新回复(0)