一、getHibernateTemplate()与getSession()区别:
自动生成hibernate配置文件的时候,会在dao层用到getSession()方法来操作数据库记录,但是他还有个方法getHibernateTemplate(),这两个方法究竟有什么区别呢?
1.使用getSession()方法你只要继承sessionFactory,而使用getHibernateTemplate()方法必须继承 HibernateDaoSupport当然包括sessionFactory,这点区别都不是特别重要的,下面这些区别就很重要了
2.getSession()方法是没有经过spring包装的,spring会把最原始的session给你,在使用完之后必须自己调用相应的 close方法,而且也不会对声明式事务进行相应的管理,一旦没有及时关闭连接,就会导致数据库连接池的连接数溢出,getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接。
在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()并没有提供,这时我们用HibernateCallback 回调的方法管理数据库.
例如如下代码:
/**
* 使用 hql 语句进行操作
* @param hql HSQL 查询语句(使用回调函数访问外部变量,必须是final的)
* @param offset 开始取数据的下标
* @param length 读取数据记录数
* @return List 结果集
*/
public List getListForPage ( final String hql , final int offset , final int length ) {
List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
Query query = session.createQuery ( hql ) ;
query.setFirstResult ( offset ) ;
query.setMaxResults ( length ) ;
List list = query.list ( ) ;
return list ;
}
}) ;
return list ;
}
二、getHibernateTemplate()常用方法
Java代码
1. Java代码
2. 1、find(String queryString);
3.
4. 示例:this.getHibernateTemplate().find("from bean.User");
5.
6. 返回所有User对象
7.
8.
9. 2、find(String queryString , Object value);
10.
11. 示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test");
12.
13. 或模糊查询:this.getHibernateTemplate().find("from bean.User u where u.name like ?", "%test%");
14.
15. 返回name属性值为test的对象(模糊查询,返回name属性值包含test的对象)
16.
17.
18. 3、find(String queryString, Object[] values);
19.
20. 示例:String hql= "from bean.User u where u.name=? and u.password=?"
21.
22. this.getHibernateTemplate().find(hql, new String[]{"test", "123"});
23.
24. 返回用户名为test并且密码为123的所有User对象
25.
26.
27. ---------------------------------
28.
29. 4、findByExample(Object exampleEntity)
30.
31. 示例:
32.
33. User u=new User();
34.
35. u.setPassword("123");//必须 符合的条件但是这两个条件时并列的(象当于sql中的and)
36.
37. u.setName("bb");
38.
39. list=this.getHibernateTemplate().findByExample(u,start,max);
40.
41. 返回:用户名为bb密码为123的对象
42.
43.
44.
45. 5、findByExample(Object exampleEntity, int firstResult, int maxResults)
46.
47. 示例:
48.
49. User u=new User();
50.
51. u.setPassword("123");//必须 符合的条件但是这两个条件时并列的(象当于sql中的and)
52.
53. u.setName("bb");
54.
55. list=this.getHibernateTemplate().findByExample(u,start,max);
56.
57. 返回:满足用户名为bb密码为123,自start起共max个User对象。(对象从0开始计数)
58.
59.
60.
61. ---------------------------------------------------
62.
63. 6、findByNamedParam(String queryString , String paramName , Object value)
64.
65.
66.
67. 使用以下语句查询:
68.
69. String queryString = "select count(*) from bean.User u where u.name=:myName";
70.
71. String paramName= "myName";
72.
73. String value= "xiyue";
74.
75. this.getHibernateTemplate().findByNamedParam(queryString, paramName, value);
76.
77. System.out.println(list.get(0));
78.
79. 返回name为xiyue的User对象的条数
80.
81.
82. 7、findByNamedParam(String queryString , String[] paramName , Object[] value)
83.
84. 示例:
85.
86. String queryString = "select count(*) from bean.User u where u.name=:myName and u.password=:myPassword";
87.
88. String[] paramName= new String[]{"myName", "myPassword"};
89.
90. String[] value= new String[]{"xiyue", "123"};
91.
92. this.getHibernateTemplate().findByNamedParam(queryString, paramName, value);
93.
94. 返回用户名为xiyue密码为123的User对象
95.
96.
97. 8、findByNamedQuery(String queryName)
98.
99. 示例:
100.
101. 1、首先需要在User.hbm.xml中定义命名查询
102.
103. <hibernate-mapping>
104.
105. <class>......</class>
106.
107. <query name="queryAllUser"><!--此查询被调用的名字-->
108.
109. <![CDATA[
110.
111. from bean.User
112.
113. ]]>
114.
115. </query>
116.
117. </hibernate-mapping>
118.
119. 2、如下使用查询:
120.
121. this.getHibernateTemplate().findByNamedQuery("queryAllUser");
122.
123.
124. 9、findByNamedQuery(String queryName, Object value)
125.
126. 示例:
127.
128. 1、首先需要在User.hbm.xml中定义命名查询
129.
130. <hibernate-mapping>
131.
132. <class>......</class>
133.
134. <query name="queryByName"><!--此查询被调用的名字-->
135.
136. <![CDATA[
137.
138. from bean.User u where u.name = ?
139.
140. ]]>
141.
142. </query>
143.
144. </hibernate-mapping>
145.
146. 2、如下使用查询:
147.
148. this.getHibernateTemplate().findByNamedQuery("queryByName", "test");
149.
150.
151. 10、findByNamedQuery(String queryName, Object[] value)
152.
153. 示例:
154.
155. 1、首先需要在User.hbm.xml中定义命名查询
156.
157. <hibernate-mapping>
158.
159. <class>......</class>
160.
161. <query name="queryByNameAndPassword"><!--此查询被调用的名字-->
162.
163. <![CDATA[
164.
165. from bean.User u where u.name =? and u.password =?
166.
167. ]]>
168.
169. </query>
170.
171. </hibernate-mapping>
172.
173. 2、如下使用查询:
174.
175. String[] values= new String[]{"test", "123"};
176.
177. this.getHibernateTemplate().findByNamedQuery("queryByNameAndPassword" , values);
178.
179.
180. 11、findByNamedQueryAndNamedParam(String queryName, String paramName, Object value)
181.
182. 示例:
183.
184. 1、首先需要在User.hbm.xml中定义命名查询
185.
186. <hibernate-mapping>
187.
188. <class>......</class>
189.
190. <query name="queryByName"><!--此查询被调用的名字-->
191.
192. <![CDATA[
193.
194. from bean.User u where u.name =:myName
195.
196. ]]>
197.
198. </query>
199.
200. </hibernate-mapping>
201.
202. 2、如下使用查询:
203.
204. this.getHibernateTemplate().findByNamedQuery("queryByName" , "myName", "test");
205.
206.
207. 12、findByNamedQueryAndNamedParam(String queryName, String[] paramName, Object[] value)
208.
209. 示例:
210.
211. 1、首先需要在User.hbm.xml中定义命名查询
212.
213. <hibernate-mapping>
214.
215. <class>......</class>
216.
217. <query name="queryByNameAndPassword"><!--此查询被调用的名字-->
218.
219. <![CDATA[
220.
221. from bean.User u where u.name =:myName and u.password=:myPassword
222.
223. ]]>
224.
225. </query>
226.
227. </hibernate-mapping>
228.
229. 2、如下使用查询:
230.
231. String[] names= new String[]{"myName", "myPassword"};
232.
233. String[] values= new String[]{"test", "123"};
234.
235. this.getHibernateTemplate().findByNamedQuery("queryByNameAndPassword" , names, values);
236.
237.
238. 13、findByValueBean(String queryString , Object value);
239.
240. 示例:
241.
242. 1、定义一个ValueBean,属性名必须和HSQL语句中的:后面的变量名同名,此处必须至少有两个属性,分别为myName和myPassword,使用setter方法设置属性值后
243.
244. ValueBean valueBean= new ValueBean();
245.
246. valueBean.setMyName("test");
247.
248. valueBean.setMyPasswrod("123");
249.
250. 2、
251.
252. String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword";
253.
254. this.getHibernateTemplate().findByValueBean(queryString , valueBean);
255.
256.
257. 14、findByNamedQueryAndValueBean(String queryName , Object value);
258.
259. 示例:
260.
261. (1)、首先需要在User.hbm.xml中定义命名查询
262.
263. <hibernate-mapping>
264.
265. <class>......</class>
266.
267. <query name="queryByNameAndPassword"><!--此查询被调用的名字-->
268.
269. <![CDATA[
270.
271. from bean.User u where u.name =:myName and u.password=:myPassword
272.
273. ]]>
274.
275. </query>
276.
277. </hibernate-mapping>
278.
279. (2)、定义一个ValueBean,属性名必须和User.hbm.xml命名查询语句中的:后面的变量名同名,此处必须至少有两个属性,分别为myName和myPassword,使用setter方法设置属性值后
280.
281. ValueBean valueBean= new ValueBean();
282.
283. valueBean.setMyName("test");
284.
285. valueBean.setMyPasswrod("123");
286.
287. (3)、
288.
289. String queryString= "from bean.User u where u.name=:myName and u.password=:myPassword";
290.
291. this.getHibernateTemplate().findByNamedQueryAndValueBean("queryByNameAndPassword", valueBean);