mybatis、hibernate这二个框架各有特色,对于复杂的查询,利用mybatis直接手写sql控制起来更灵活,而一般的insert/update,hibernate比较方便。同一个项目中,这二个框架可以和谐共存,下面是一些步骤:
一、版本要求
Spring 4.11 + hibernate 4.3.6 + mybatis 3.2.8 + struts 2.3.16.3 (这是目前各框架的最新版本)
建议:如果用hibernate 4.x ,Spring最好也是4.x系列,否则getCurrentSession()容易报错。
二、pom.xml依赖项
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
4 <modelVersion>4.0.0</modelVersion>
5 <groupId>infosky</groupId>
6 <artifactId>struts2-rest-ex</artifactId>
7 <packaging>war</packaging>
8 <version>1.0</version>
9 <properties>
10 <java-version>1.6</java-version>
11 <struts2.version>2.3.16.3</struts2.version>
12 <spring.version>4.1.1.RELEASE</spring.version>
13 <mybatis.version>3.2.8</mybatis.version>
14 <hibernate.version>4.3.6.Final</hibernate.version>
15 </properties>
16 <dependencies>
17
18 <dependency>
19 <groupId>commons-dbcp</groupId>
20 <artifactId>commons-dbcp</artifactId>
21 <version>1.4</version>
22 </dependency>
23
24 <!-- oracle -->
25 <dependency>
26 <groupId>com.oracle</groupId>
27 <artifactId>ojdbc6</artifactId>
28 <version>11.2.0.3</version>
29 </dependency>
30
31 <dependency>
32 <groupId>asm</groupId>
33 <artifactId>asm</artifactId>
34 <version>3.3.1</version>
35 </dependency>
36
37 <dependency>
38 <groupId>asm</groupId>
39 <artifactId>asm-commons</artifactId>
40 <version>3.3.1</version>
41 </dependency>
42
43 <dependency>
44 <groupId>asm</groupId>
45 <artifactId>asm-tree</artifactId>
46 <version>3.3.1</version>
47 </dependency>
48
49 <dependency>
50 <groupId>commons-beanutils</groupId>
51 <artifactId>commons-beanutils</artifactId>
52 <version>1.8.3</version>
53 </dependency>
54
55 <dependency>
56 <groupId>commons-collections</groupId>
57 <artifactId>commons-collections</artifactId>
58 <version>3.2.1</version>
59 </dependency>
60
61 <dependency>
62 <groupId>commons-fileupload</groupId>
63 <artifactId>commons-fileupload</artifactId>
64 <version>1.3</version>
65 </dependency>
66
67 <dependency>
68 <groupId>commons-io</groupId>
69 <artifactId>commons-io</artifactId>
70 <version>2.2</version>
71 </dependency>
72
73 <dependency>
74 <groupId>org.apache.commons</groupId>
75 <artifactId>commons-lang3</artifactId>
76 <version>3.1</version>
77 </dependency>
78
79 <dependency>
80 <groupId>javassist</groupId>
81 <artifactId>javassist</artifactId>
82 <version>3.12.1.GA</version>
83 </dependency>
84
85 <dependency>
86 <groupId>ognl</groupId>
87 <artifactId>ognl</artifactId>
88 <version>3.0.6</version>
89 </dependency>
90
91
92 <!-- log -->
93 <dependency>
94 <groupId>org.apache.logging.log4j</groupId>
95 <artifactId>log4j-api</artifactId>
96 <version>2.0.2</version>
97 </dependency>
98 <dependency>
99 <groupId>org.apache.logging.log4j</groupId>
100 <artifactId>log4j-core</artifactId>
101 <version>2.0.2</version>
102 </dependency>
103 <dependency>
104 <groupId>org.apache.logging.log4j</groupId>
105 <artifactId>log4j-web</artifactId>
106 <version>2.0.2</version>
107 </dependency>
108 <dependency>
109 <groupId>org.slf4j</groupId>
110 <artifactId>slf4j-api</artifactId>
111 <version>1.7.7</version>
112 </dependency>
113
114 <dependency>
115 <groupId>net.sf.ezmorph</groupId>
116 <artifactId>ezmorph</artifactId>
117 <version>1.0.6</version>
118 </dependency>
119
120 <dependency>
121 <groupId>org.freemarker</groupId>
122 <artifactId>freemarker</artifactId>
123 <version>2.3.19</version>
124 </dependency>
125
126 <dependency>
127 <groupId>org.codehaus.jackson</groupId>
128 <artifactId>jackson-core-asl</artifactId>
129 <version>1.9.10</version>
130 </dependency>
131
132 <dependency>
133 <groupId>org.codehaus.jackson</groupId>
134 <artifactId>jackson-mapper-asl</artifactId>
135 <version>1.9.10</version>
136 </dependency>
137
138 <dependency>
139 <groupId>net.sf.json-lib</groupId>
140 <artifactId>json-lib</artifactId>
141 <version>2.4</version>
142 <classifier>jdk15</classifier>
143 </dependency>
144
145 <dependency>
146 <groupId>org.apache.struts</groupId>
147 <artifactId>struts2-convention-plugin</artifactId>
148 <version>2.3.16</version>
149 </dependency>
150
151 <dependency>
152 <groupId>org.apache.struts</groupId>
153 <artifactId>struts2-config-browser-plugin</artifactId>
154 <version>2.3.16</version>
155 </dependency>
156
157 <dependency>
158 <groupId>org.apache.struts</groupId>
159 <artifactId>struts2-core</artifactId>
160 <version>${struts2.version}</version>
161 </dependency>
162
163 <dependency>
164 <groupId>org.apache.struts</groupId>
165 <artifactId>struts2-rest-plugin</artifactId>
166 <version>2.3.16</version>
167 </dependency>
168
169 <dependency>
170 <groupId>com.thoughtworks.xstream</groupId>
171 <artifactId>xstream</artifactId>
172 <version>1.4.3</version>
173 </dependency>
174
175 <dependency>
176 <groupId>org.apache.struts.xwork</groupId>
177 <artifactId>xwork-core</artifactId>
178 <version>${struts2.version}</version>
179 </dependency>
180
181 <!-- Servlet -->
182 <dependency>
183 <groupId>javax.servlet</groupId>
184 <artifactId>servlet-api</artifactId>
185 <version>2.5</version>
186 <scope>provided</scope>
187 </dependency>
188
189 <!-- spring -->
190 <dependency>
191 <groupId>org.apache.struts</groupId>
192 <artifactId>struts2-spring-plugin</artifactId>
193 <version>${struts2.version}</version>
194 </dependency>
195
196 <dependency>
197 <groupId>org.springframework</groupId>
198 <artifactId>spring-context</artifactId>
199 <version>${spring.version}</version>
200 </dependency>
201
202 <dependency>
203 <groupId>org.springframework</groupId>
204 <artifactId>spring-orm</artifactId>
205 <version>${spring.version}</version>
206 </dependency>
207
208 <dependency>
209 <groupId>org.springframework</groupId>
210 <artifactId>spring-beans</artifactId>
211 <version>${spring.version}</version>
212 </dependency>
213
214 <dependency>
215 <groupId>org.springframework</groupId>
216 <artifactId>spring-core</artifactId>
217 <version>${spring.version}</version>
218 </dependency>
219
220 <dependency>
221 <groupId>org.springframework</groupId>
222 <artifactId>spring-web</artifactId>
223 <version>${spring.version}</version>
224 </dependency>
225
226 <dependency>
227 <groupId>org.springframework</groupId>
228 <artifactId>spring-context</artifactId>
229 <version>${spring.version}</version>
230 </dependency>
231
232 <dependency>
233 <groupId>org.springframework</groupId>
234 <artifactId>spring-context-support</artifactId>
235 <version>${spring.version}</version>
236 </dependency>
237
238 <dependency>
239 <groupId>org.springframework</groupId>
240 <artifactId>spring-expression</artifactId>
241 <version>${spring.version}</version>
242 </dependency>
243
244 <dependency>
245 <groupId>org.springframework</groupId>
246 <artifactId>spring-jdbc</artifactId>
247 <version>${spring.version}</version>
248 </dependency>
249
250 <dependency>
251 <groupId>org.springframework</groupId>
252 <artifactId>spring-tx</artifactId>
253 <version>${spring.version}</version>
254 </dependency>
255
256 <dependency>
257 <groupId>org.springframework</groupId>
258 <artifactId>spring-aop</artifactId>
259 <version>${spring.version}</version>
260 </dependency>
261
262
263 <dependency>
264 <groupId>org.aspectj</groupId>
265 <artifactId>aspectjweaver</artifactId>
266 <version>1.7.3</version>
267 </dependency>
268
269 <dependency>
270 <groupId>aopalliance</groupId>
271 <artifactId>aopalliance</artifactId>
272 <version>1.0</version>
273 </dependency>
274
275
276 <dependency>
277 <groupId>junit</groupId>
278 <artifactId>junit</artifactId>
279 <version>4.11</version>
280 </dependency>
281
282 <!-- mybatis -->
283 <dependency>
284 <groupId>org.mybatis</groupId>
285 <artifactId>mybatis-spring</artifactId>
286 <version>1.2.2</version>
287 </dependency>
288
289 <dependency>
290 <groupId>org.mybatis</groupId>
291 <artifactId>mybatis</artifactId>
292 <version>${mybatis.version}</version>
293 </dependency>
294
295 <dependency>
296 <groupId>com.github.miemiedev</groupId>
297 <artifactId>mybatis-paginator</artifactId>
298 <version>1.2.15</version>
299 </dependency>
300
301 <!-- hibernate -->
302 <dependency>
303 <groupId>org.hibernate</groupId>
304 <artifactId>hibernate-core</artifactId>
305 <version>${hibernate.version}</version>
306 </dependency>
307
308 <dependency>
309 <groupId>xml-apis</groupId>
310 <artifactId>xml-apis</artifactId>
311 <version>1.0.b2</version>
312 <scope>provided</scope>
313 </dependency>
314
315
316 </dependencies>
317
318 <profiles>
319 <profile>
320 <!-- 开发环境 -->
321 <id>dev</id>
322 <properties>
323 <db-url>jdbc:oracle:thin:@172.21.129.51:1521:orcl</db-url>
324 <db-username>***</db-username>
325 <db-password>***</db-password>
326 </properties>
327 <!-- 默认激活本环境 -->
328 <activation>
329 <activeByDefault>true</activeByDefault>
330 </activation>
331 </profile>
332 <profile>
333 <!-- 测试环境 -->
334 <id>test</id>
335 <properties>
336 <db-url>jdbc:oracle:thin:@172.21.129.51:1521:orcl</db-url>
337 <db-username>***</db-username>
338 <db-password>***</db-password>
339 </properties>
340 </profile>
341 </profiles>
342
343 <build>
344 <finalName>struts2-rest-ex</finalName>
345 <resources>
346 <resource>
347 <directory>src/main/resources</directory>
348 <filtering>true</filtering>
349 </resource>
350 </resources>
351 <plugins>
352 <plugin>
353 <groupId>org.apache.maven.plugins</groupId>
354 <artifactId>maven-compiler-plugin</artifactId>
355 <version>2.5.1</version>
356 <configuration>
357 <source>1.6</source>
358 <target>1.6</target>
359 <encoding>utf-8</encoding>
360 </configuration>
361 </plugin>
362
363 <plugin>
364 <artifactId>maven-source-plugin</artifactId>
365 <version>2.1.2</version>
366 <executions>
367 <execution>
368 <phase>package</phase>
369 <goals>
370 <goal>jar-no-fork</goal>
371 </goals>
372 </execution>
373 </executions>
374 </plugin>
375
376 <plugin>
377 <groupId>org.apache.maven.plugins</groupId>
378 <artifactId>maven-surefire-plugin</artifactId>
379 <version>2.16</version>
380 <configuration>
381 <forkMode>once</forkMode>
382 <argLine>-Dfile.encoding=UTF-8</argLine>
383 </configuration>
384 </plugin>
385 </plugins>
386 </build>
387 <organization>
388 <name>yjmyzz</name>
389 <url>http://yjmyzz.cnblogs.com/</url>
390 </organization>
391
392 </project>
最终打包后,WEB-INF/lib下的jar文件列表为:
antlr-2.7.7.jar aopalliance-1.0.jar asm-3.3.1.jar asm-commons-3.3.1.jar asm-tree-3.3.1.jar aspectjweaver-1.7.3.jar commons-beanutils-1.8.3.jar commons-collections-3.2.1.jar commons-dbcp-1.4.jar commons-fileupload-1.3.jar commons-io-2.2.jar commons-lang-2.3.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar commons-pool-1.5.4.jar dom4j-1.6.1.jar ezmorph-1.0.6.jar freemarker-2.3.19.jar hamcrest-core-1.3.jar hibernate-commons-annotations-4.0.5.Final.jar hibernate-core-4.3.6.Final.jar hibernate-jpa-2.1-api-1.0.0.Final.jar jackson-core-asl-1.9.10.jar jackson-mapper-asl-1.9.10.jar jandex-1.1.0.Final.jar javassist-3.12.1.GA.jar javassist-3.18.1-GA.jar jboss-logging-3.1.3.GA.jar jboss-logging-annotations-1.2.0.Beta1.jar jboss-transaction-api_1.2_spec-1.0.0.Final.jar json-lib-2.4-jdk15.jar junit-4.11.jar log4j-api-2.0.2.jar log4j-core-2.0.2.jar log4j-web-2.0.2.jar mybatis-3.2.8.jar mybatis-paginator-1.2.15.jar mybatis-spring-1.2.2.jar ognl-3.0.6.jar ojdbc6-11.2.0.3.jar slf4j-api-1.7.7.jar spring-aop-4.1.1.RELEASE.jar spring-beans-4.1.1.RELEASE.jar spring-context-4.1.1.RELEASE.jar spring-context-support-4.1.1.RELEASE.jar spring-core-4.1.1.RELEASE.jar spring-expression-4.1.1.RELEASE.jar spring-jdbc-4.1.1.RELEASE.jar spring-orm-4.1.1.RELEASE.jar spring-tx-4.1.1.RELEASE.jar spring-web-4.1.1.RELEASE.jar struts2-config-browser-plugin-2.3.16.jar struts2-convention-plugin-2.3.16.jar struts2-core-2.3.16.3.jar struts2-rest-plugin-2.3.16.jar struts2-spring-plugin-2.3.16.3.jar xmlpull-1.1.3.1.jar xpp3_min-1.1.4c.jar xstream-1.4.3.jar xwork-core-2.3.16.3.jar
三、Spring配置(关键)
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
4 xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xsi:schemaLocation="
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
8 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
9 http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
10 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
11 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
12 default-autowire="byName">
13
14 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
15 destroy-method="close">
16 <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
17 <property name="url" value="jdbc:oracle:thin:@172.21.129.**:1521:orcl" />
18 <property name="username" value="***" />
19 <property name="password" value="***" />
20 <property name="defaultAutoCommit" value="false" />
21 <property name="initialSize" value="2" />
22 <property name="maxActive" value="10" />
23 <property name="maxWait" value="60000" />
24 </bean>
25
26 <bean id="sessionFactory"
27 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
28 <property name="dataSource" ref="dataSource" />
29 <property name="packagesToScan">
30 <list>
31 <value>com.cnblogs.yjmyzz.entity</value>
32 </list>
33 </property>
34 <property name="mappingLocations">
35 <list>
36 <value>classpath*:hibernate/**/*.hbm.xml</value>
37 </list>
38 </property>
39 <property name="hibernateProperties">
40 <props>
41 <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
42 <!-- <prop key="current_session_context_class">thread</prop> -->
43 <prop key="hibernate.format_sql">false</prop>
44 <prop key="hibernate.show_sql">true</prop>
45 <prop key="hibernate.use_sql_comments">true</prop>
46 <prop key="hibernate.max_fetch_depth">3</prop>
47 <prop key="hibernate.jdbc.batch_size">20</prop>
48 <prop key="hibernate.jdbc.fetch_size">20</prop>
49 <prop key="hibernate.cache.use_second_level_cache">false</prop>
50 </props>
51 </property>
52 </bean>
53
54 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
55 <property name="dataSource" ref="dataSource" />
56 <property name="configLocation" value="classpath:mybatis-config.xml"></property>
57 <property name="typeAliasesPackage" value="com.cnblogs.yjmyzz.entity"></property>
58 <property name="mapperLocations" value="classpath:mybatis/**/*.xml"></property>
59 <property name="plugins">
60 <list>
61 <bean
62 class="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
63 <property name="dialectClass"
64 value="com.github.miemiedev.mybatis.paginator.dialect.OracleDialect"></property>
65 </bean>
66 </list>
67 </property>
68 </bean>
69
70 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
71 <property name="basePackage" value="com.cnblogs.yjmyzz.mybatis.mapper" />
72 </bean>
73
74 <bean id="transactionManager"
75 class="org.springframework.orm.hibernate4.HibernateTransactionManager">
76 <property name="sessionFactory">
77 <ref local="sessionFactory" />
78 </property>
79 </bean>
80
81 <tx:advice id="txAdvice" transaction-manager="transactionManager">
82 <tx:attributes>
83 <tx:method name="do*" read-only="false" rollback-for="java.lang.Exception" />
84 <tx:method name="*" propagation="SUPPORTS" read-only="true" />
85 </tx:attributes>
86 </tx:advice>
87
88 <aop:config>
89 <aop:pointcut id="pc"
90 expression="execution(* com.cnblogs.yjmyzz.service.*.*(..))" />
91 <aop:advisor pointcut-ref="pc" advice-ref="txAdvice" />
92 </aop:config>
93
94 </beans>
有几个关键点:
a) mybatis与hibernate的sessionFactory,共用同一个dataSource
b) 事务管理共用hibernate的事务管理
四、web.xml配置
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
5
6 <display-name>struts2-app-sample</display-name>
7
8 <listener>
9 <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
10 </listener>
11 <filter>
12 <filter-name>log4jServletFilter</filter-name>
13 <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
14 </filter>
15 <filter-mapping>
16 <filter-name>log4jServletFilter</filter-name>
17 <url-pattern>/*</url-pattern>
18 <dispatcher>REQUEST</dispatcher>
19 <dispatcher>FORWARD</dispatcher>
20 <dispatcher>INCLUDE</dispatcher>
21 <dispatcher>ERROR</dispatcher>
22 </filter-mapping>
23
24 <context-param>
25 <param-name>contextConfigLocation</param-name>
26 <param-value>classpath:spring.xml</param-value>
27 </context-param>
28 <listener>
29 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
30 </listener>
31
32 <filter>
33 <filter-name>struts2</filter-name>
34 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
35 <init-param>
36 <param-name>loggerFactory</param-name>
37 <param-value>com.opensymphony.xwork2.util.logging.slf4j.Slf4jLoggerFactory</param-value>
38 </init-param>
39 </filter>
40
41 <filter>
42 <filter-name>openSessionInViewFilter</filter-name>
43 <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class>
44 <init-param>
45 <param-name>singleSession</param-name>
46 <param-value>true</param-value>
47 </init-param>
48 </filter>
49
50 <filter-mapping>
51 <filter-name>struts2</filter-name>
52 <url-pattern>/*</url-pattern>
53 </filter-mapping>
54
55 <welcome-file-list>
56 <welcome-file>index.html</welcome-file>
57 </welcome-file-list>
58
59 </web-app>
五、代码调用
5.1 服务层基类
1 package com.cnblogs.yjmyzz.service.support;
2
3 import java.io.Serializable;
4
5 import javax.annotation.Resource;
6
7 import org.apache.ibatis.session.SqlSessionFactory;
8 import org.hibernate.Session;
9 import org.hibernate.SessionFactory;
10 import org.hibernate.StatelessSession;
11
12 public class BaseServiceImpl implements Serializable {
13
14 private static final long serialVersionUID = -33988360094493502L;
15
16 /**
17 * hibernate入口
18 */
19 @Resource(name = "sessionFactory")
20 protected SessionFactory hibernateSessionFactory;
21
22 /**
23 * mybatis入口
24 */
25 @Resource(name = "sqlSessionFactory")
26 protected SqlSessionFactory mybatisSessionFactory;
27
28 protected Session openSession() {
29 return hibernateSessionFactory.openSession();
30 }
31
32 protected StatelessSession openStatelessSession() {
33 return hibernateSessionFactory.openStatelessSession();
34 }
35
36 protected Session getCurrentSession() {
37 return hibernateSessionFactory.getCurrentSession();
38 }
39
40 }
其它各业务服务实现类,都继承自它。当然,也可以弄一个BaseDAO,对hibernate做些封装
1 package com.cnblogs.yjmyzz.dao;
2
3 import java.io.Serializable;
4 import java.util.List;
5
6 /**
7 * 基础数据库操作类
8 *
9 * @author ss
10 *
11 */
12 public interface BaseDAO<T> {
13
14 /**
15 * 保存一个对象
16 *
17 * @param o
18 * @return
19 */
20 public Serializable save(T o);
21
22 /**
23 * 删除一个对象
24 *
25 * @param o
26 */
27 public void delete(T o);
28
29 /**
30 * 更新一个对象
31 *
32 * @param o
33 */
34 public void update(T o);
35
36 /**
37 * 保存或更新对象
38 *
39 * @param o
40 */
41 public void saveOrUpdate(T o);
42
43 /**
44 * 查询
45 *
46 * @param hql
47 * @return
48 */
49 public List<T> find(String hql);
50
51 /**
52 * 查询集合
53 *
54 * @param hql
55 * @param param
56 * @return
57 */
58 public List<T> find(String hql, Object[] param);
59
60 /**
61 * 查询集合
62 *
63 * @param hql
64 * @param param
65 * @return
66 */
67 public List<T> find(String hql, List<Object> param);
68
69 /**
70 * 查询集合(带分页)
71 *
72 * @param hql
73 * @param param
74 * @param page
75 * 查询第几页
76 * @param rows
77 * 每页显示几条记录
78 * @return
79 */
80 public List<T> find(String hql, Object[] param, Integer page, Integer rows);
81
82 /**
83 * 查询集合(带分页)
84 *
85 * @param hql
86 * @param param
87 * @param page
88 * @param rows
89 * @return
90 */
91 public List<T> find(String hql, List<Object> param, Integer page,
92 Integer rows);
93
94 /**
95 * 获得一个对象
96 *
97 * @param c
98 * 对象类型
99 * @param id
100 * @return Object
101 */
102 public T get(Class<T> c, Serializable id);
103
104 /**
105 * 获得一个对象
106 *
107 * @param hql
108 * @param param
109 * @return Object
110 */
111 public T get(String hql, Object[] param);
112
113 /**
114 * 获得一个对象
115 *
116 * @param hql
117 * @param param
118 * @return
119 */
120 public T get(String hql, List<Object> param);
121
122 /**
123 * select count(*) from 类
124 *
125 * @param hql
126 * @return
127 */
128 public Long count(String hql);
129
130 /**
131 * select count(*) from 类
132 *
133 * @param hql
134 * @param param
135 * @return
136 */
137 public Long count(String hql, Object[] param);
138
139 /**
140 * select count(*) from 类
141 *
142 * @param hql
143 * @param param
144 * @return
145 */
146 public Long count(String hql, List<Object> param);
147
148 /**
149 * 执行HQL语句
150 *
151 * @param hql
152 * @return 响应数目
153 */
154 public Integer executeHql(String hql);
155
156 /**
157 * 执行HQL语句
158 *
159 * @param hql
160 * @param param
161 * @return 响应数目
162 */
163 public Integer executeHql(String hql, Object[] param);
164
165 /**
166 * 执行HQL语句
167 *
168 * @param hql
169 * @param param
170 * @return
171 */
172 public Integer executeHql(String hql, List<Object> param);
173
174 }
1 package com.cnblogs.yjmyzz.dao.impl;
2
3 import com.cnblogs.yjmyzz.dao.BaseDAO;
4
5 import java.io.Serializable;
6 import java.util.List;
7
8 import org.hibernate.Query;
9 import org.hibernate.Session;
10 import org.hibernate.SessionFactory;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Component;
13 import org.springframework.stereotype.Repository;
14
15 @Component("baseDAO")
16 @SuppressWarnings("all")
17 public class BaseDAOImpl<T> implements BaseDAO<T> {
18
19 private SessionFactory sessionFactory;
20
21 public SessionFactory getSessionFactory() {
22 return sessionFactory;
23 }
24
25 @Autowired
26 public void setSessionFactory(SessionFactory sessionFactory) {
27 this.sessionFactory = sessionFactory;
28 }
29
30 private Session getCurrentSession() {
31 return sessionFactory.getCurrentSession();
32 }
33
34 public Serializable save(T o) {
35 return this.getCurrentSession().save(o);
36 }
37
38 public void delete(T o) {
39 this.getCurrentSession().delete(o);
40 }
41
42 public void update(T o) {
43 this.getCurrentSession().update(o);
44 }
45
46 public void saveOrUpdate(T o) {
47 this.getCurrentSession().saveOrUpdate(o);
48 }
49
50 public List<T> find(String hql) {
51 return this.getCurrentSession().createQuery(hql).list();
52 }
53
54 public List<T> find(String hql, Object[] param) {
55 Query q = this.getCurrentSession().createQuery(hql);
56 if (param != null && param.length > 0) {
57 for (int i = 0; i < param.length; i++) {
58 q.setParameter(i, param[i]);
59 }
60 }
61 return q.list();
62 }
63
64 public List<T> find(String hql, List<Object> param) {
65 Query q = this.getCurrentSession().createQuery(hql);
66 if (param != null && param.size() > 0) {
67 for (int i = 0; i < param.size(); i++) {
68 q.setParameter(i, param.get(i));
69 }
70 }
71 return q.list();
72 }
73
74 public List<T> find(String hql, Object[] param, Integer page, Integer rows) {
75 if (page == null || page < 1) {
76 page = 1;
77 }
78 if (rows == null || rows < 1) {
79 rows = 10;
80 }
81 Query q = this.getCurrentSession().createQuery(hql);
82 if (param != null && param.length > 0) {
83 for (int i = 0; i < param.length; i++) {
84 q.setParameter(i, param[i]);
85 }
86 }
87 return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();
88 }
89
90 public List<T> find(String hql, List<Object> param, Integer page,
91 Integer rows) {
92 if (page == null || page < 1) {
93 page = 1;
94 }
95 if (rows == null || rows < 1) {
96 rows = 10;
97 }
98 Query q = this.getCurrentSession().createQuery(hql);
99 if (param != null && param.size() > 0) {
100 for (int i = 0; i < param.size(); i++) {
101 q.setParameter(i, param.get(i));
102 }
103 }
104 return q.setFirstResult((page - 1) * rows).setMaxResults(rows).list();
105 }
106
107 public T get(Class<T> c, Serializable id) {
108 return (T) this.getCurrentSession().get(c, id);
109 }
110
111 public T get(String hql, Object[] param) {
112 List<T> l = this.find(hql, param);
113 if (l != null && l.size() > 0) {
114 return l.get(0);
115 } else {
116 return null;
117 }
118 }
119
120 public T get(String hql, List<Object> param) {
121 List<T> l = this.find(hql, param);
122 if (l != null && l.size() > 0) {
123 return l.get(0);
124 } else {
125 return null;
126 }
127 }
128
129 public Long count(String hql) {
130 return (Long) this.getCurrentSession().createQuery(hql).uniqueResult();
131 }
132
133 public Long count(String hql, Object[] param) {
134 Query q = this.getCurrentSession().createQuery(hql);
135 if (param != null && param.length > 0) {
136 for (int i = 0; i < param.length; i++) {
137 q.setParameter(i, param[i]);
138 }
139 }
140 return (Long) q.uniqueResult();
141 }
142
143 public Long count(String hql, List<Object> param) {
144 Query q = this.getCurrentSession().createQuery(hql);
145 if (param != null && param.size() > 0) {
146 for (int i = 0; i < param.size(); i++) {
147 q.setParameter(i, param.get(i));
148 }
149 }
150 return (Long) q.uniqueResult();
151 }
152
153 public Integer executeHql(String hql) {
154 return this.getCurrentSession().createQuery(hql).executeUpdate();
155 }
156
157 public Integer executeHql(String hql, Object[] param) {
158 Query q = this.getCurrentSession().createQuery(hql);
159 if (param != null && param.length > 0) {
160 for (int i = 0; i < param.length; i++) {
161 q.setParameter(i, param[i]);
162 }
163 }
164 return q.executeUpdate();
165 }
166
167 public Integer executeHql(String hql, List<Object> param) {
168 Query q = this.getCurrentSession().createQuery(hql);
169 if (param != null && param.size() > 0) {
170 for (int i = 0; i < param.size(); i++) {
171 q.setParameter(i, param.get(i));
172 }
173 }
174 return q.executeUpdate();
175 }
176
177 }
至于mybatis,就没必要封装了,因为各xxxMapper接口,注入后可以直接拿来调
5.2 调用示例
1 package com.cnblogs.yjmyzz.service.support;
2
3 import java.math.BigDecimal;
4 import java.util.*;
5
6 import javax.annotation.Resource;
7
8 import org.springframework.beans.factory.annotation.Autowired;
9 import org.springframework.stereotype.Service;
10
11 import com.cnblogs.yjmyzz.convertor.OrderConverter;
12 import com.cnblogs.yjmyzz.dao.BaseDAO;
13 import com.cnblogs.yjmyzz.dto.Order;
14 import com.cnblogs.yjmyzz.entity.TOrder;
15 import com.cnblogs.yjmyzz.mybatis.mapper.OrderMapper;
16 import com.cnblogs.yjmyzz.service.OrderService;
17
18 @Service
19 public class OrdersServiceImpl extends BaseServiceImpl implements OrderService {
20
21 @Autowired
22 OrderMapper orderMapper;
23
24 @Resource
25 BaseDAO<TOrder> tOrderDAO;
26
27 private static final long serialVersionUID = 1513133416493770048L;
28
29 @Override
30 public Order get(String id) {
31 // hibernate实现
32 // return OrderConverter.toDto((TOrder) getCurrentSession().get(
33 // TOrder.class, new BigDecimal(Integer.parseInt(id))));
34 return OrderConverter.toDto(tOrderDAO.get(TOrder.class, new BigDecimal(
35 Integer.parseInt(id))));
36
37 // mybatis实现
38 // return
39 // OrderConverter.toDto(orderMapper.getOrder(Integer.parseInt(id)));
40 }
41
42 @Override
43 public List<Order> getAll() {
44 List<TOrder> entities = orderMapper.getAllOrder();
45 List<Order> orders = new ArrayList<Order>();
46 for (TOrder entity : entities) {
47 orders.add(OrderConverter.toDto(entity));
48 }
49 return orders;
50 }
51
52 @Override
53 public void doSave(Order order) {
54 // hibernate
55 TOrder entity = OrderConverter.toEntity(order);
56 if (entity.getId() != null) {
57 entity = (TOrder) getCurrentSession().get(TOrder.class,
58 entity.getId());
59
60 // update fields
61 entity.setClientname(order.getClientName());
62 entity.setAmount(new BigDecimal(order.getAmount()));
63 }
64 getCurrentSession().saveOrUpdate(entity);
65 }
66
67 @Override
68 public void doRemove(String id) {
69 // mybatis
70 orderMapper.deleteOrder(Integer.parseInt(id));
71
72 }
73
74 }
其它注意事项:
hibernate 4.x以后,entity类上的注解,最好改成@Entity("TABLE_NAME"),而非以前的@Table(xxx),参考:
@Entity(name = "T_ORDER")
public class TOrder implements java.io.Serializable {