默认情况下,hibernate的sql中都是以问号代表参数,并没有显示参数的真实值,但是也不是做不到,只需要两步配置就可以显示出参数的真实值了:
(1)spring的配置文件中增加:
<prop key="hibernate.show_sql">true</prop>
或者在hibernate的配置文件中增加:
<property name="show_sql">true</property>
(2)在log4j.properties中做如下配置:
log4j.appender.stdout.threshold=trace
log4j.category.org.hibernate.sql=trace
log4j.category.org.hibernate.type=trace
在方法开始前spring通过动态代理,利用aop的方式,为普通要调用的方法在方法开始处添加事务控制,如果在方法中要进行save操作,则进行getsession。
在调用getsession()方法时,拿到数据库连接,如果在一个循环中多次调用save方法,因为spring会控制在一个事务中只有同一个session,
所以跟数据库的连接也只有一次,所以如果循环保存一个list,在service层循环和在dao层循环都是一样的(spring事务是加在service层的情况)。
delete()方法用于从数据库中删除与java对象对应的记录。如果传入的参数是持久化对象,session就计划执行一个delete语句。
如果传入的参数是游离对象,先使游离对象被session关联,使它变为持久化对象,然后计划执行一个delete语句。
值得注意的是,session只有在清理缓存的时候的才执行delete语句。
此外,只有当调用session的close()方法时,才会从session的缓存中删除该对象。
例如以下代码先加载一个持久化对象,然后通过delete()方法将它删除:
1
2
3
4
5
6
7
<code>session session1 = sessionfactory.opensession();</code>
<code>transaction tx1 = session1.begintransaction();</code>
<code>// 先加载一个持久化对象</code>
<code>customer customer = (customer)session.get(customer.</code><code>class</code><code>, </code><code>new</code> <code>long(</code><code>1</code><code>));</code>
<code>session.delete(customer); </code><code>// 计划执行一个delete语句</code>
<code>txt1.commit(); </code><code>// 清理缓存,执行delete语句</code>
<code>session.close();子</code><code>// 从缓存中删除customer对象</code>
以下代码直接通过delete()方法删除一个游离对象:
<code>session session2 = sessionfactory.opensession();</code>
<code>transaction tx2 = session1.begintransaction();</code>
<code>// 假定customer是一个游离对象,先使它被session关联,使它变为持久化对象,</code>
<code>// 然后计划执行一个delete语句</code>
<code>session2.delete(customer);</code>
<code>tx2.commit(); </code><code>// 清理缓存,执行delete语句</code>
<code>session2.close(); </code><code>// 从缓存中删除customer对象 </code>
如果希望删除多个对象,可以使用另一种重载形式的delete()方法:
<code>session.delete(</code><code>"from customer as c where c.id>8"</code><code>);</code>
以上delete()方法的参数为hql查询语句,delete()方法将从数据库中删除所有满足查询条件的记录。
1. 使用hql语句
query q = session.createquery("select e from com.sun.demo.emp e");
2. 使用load方法(主键查询)
emp e = (emp)session.load(emp.class, 1141);
3. 使用get方法(主键查询)
emp e = (emp)session.get(emp.class, 1141);
4. 参数化查询(使用?通配符,或者命令通配符)
8
<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename=?"</code><code>);</code>
<code> </code><code>q.setparameter(</code><code>0</code><code>, </code><code>"smith"</code><code>);</code>
<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename like ?"</code><code>);</code>
<code> </code><code>q.setparameter(</code><code>0</code><code>, </code><code>"%m%"</code><code>);</code>
<code>query q = session.createquery(</code><code>"update userinfo set ename='aaa' where ename like :lkename"</code><code>);</code>
<code> </code><code>q.setparameter(</code><code>"lkename"</code><code>, </code><code>"%l%"</code><code>);</code>
5. 命名查询
<code><</code><code>query</code> <code>name="myquery"></code>
<code> </code><code><![cdata[ from com.sun.hibernate.employer where job = ?]]></code>
<code></</code><code>query</code><code>></code>
<code>query q = session.getnamedquery(</code><code>"myquery"</code><code>);</code>
<code>q.setparameter(</code><code>0</code><code>, </code><code>"manager"</code><code>);</code>
6. 属性查询
query q = session.createquery("select max(sal) from employer e where sal is not null");
query q = session.createquery("select distinct job from employer e");
7. 实例化查询
步骤如下:
1.编写你的hql语句
2.创建普通的java类 -------------------与pojo类不同,它与数据库没有任何关系
3.在该java类中你需要创建和查询结果对应的字段
4.在该java类中,你需要创建合适的构造函数
5.完善你的hql语句,使用实例化查询的方式进行包装
6.通过list.get(i)获取的结果就不再是一个数组,而是一个包装后的对象
例子:
<code>query q = session.createquery(</code><code>"select new com.sun.demo.userdate(ename,sysdate) from userinfo"</code><code>);</code>
<code>list list = q.list();</code>
<code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<list.size();i++){</code>
<code> </code><code>userdate u = (userdate)list.get(i);</code>
<code> </code><code>system.out.println(u.getename());</code>
<code>}</code>
8. 多态查询
对于pojo来说,java中的这种关系被扩展到了数据库表中
hibernate在查询一个表的同时,会检查该表所对应的pojo类有没有子类,如果有,一起查询出来
9. 分页查询
//查询第三到五条
q.setfirstresult(3);//从第三条开始
q.setmaxresults(3);//提取三条
10. uniqueresult方法查询(查询结果只能是一个字段)
query q = session.createquery("select count(*) from employer");
long count = (long)q.uniqueresult();
11. criteria查询(通过面向对象化的设计,将数据查询条件封装为一个对象)
9
10
11
12
13
14
15
16
17
<code>criteria c = session.createcriteria(employer.</code><code>class</code><code>);</code>
<code> </code><code>c.addorder(order.asc(</code><code>"sal"</code><code>)); </code><code>//按薪水升序查询</code>
<code> </code><code>c.setfirstresult(</code><code>3</code><code>);</code>
<code> </code><code>c.setmaxresults(</code><code>3</code><code>);</code>
<code> </code><code>list list = c.list();</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>;i<list.size();i++){</code>
<code> </code><code>employer emp = (employer)list.get(i);</code>
<code> </code><code>system.out.println(emp.getename() + </code><code>" : "</code> <code>+ emp.getsal());</code>
<code> </code><code>}</code>