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 {