MyBatis和Spring的整合

1、什么是MyBatis?
    MyBatis是Apache的一款开源的java的持久层框架,提供了SQL Map和DAO。支持普通的SQL查询,存储过程和高级的映射,myBatis将SQL语句和java代码分离开,解耦了代码,将接口和POJOs映射成数据库表的记录。
    每个数据源对应一个SqlSessionFactory,SqlSessionFactory的创建 可以通过代码调用SqlSessionFactoryBuilder创建,Builder也通过xml资源创建 SqlSessionFactory。SqlSessionFactory会创建SqlSession负责执行SQL和结果的映射。
  2、MyBatis和Hibernate的对比
    1)hibernate比MyBatis重量级,难上手。
    2)Mybatis查询能够指定字段和编写复杂的SQL语句,如left join等,而hibernate的HQL若过于复杂则服务器效率会下降,所以Mybatis适合复杂的SQL查询,而hibernate适合并不复杂的简单的SQL。
    3)mybatis因为编写的SQL与具体的数据库类型有关,故移植性差,而hibernate使用HQL,不关心底层数据库的类型,移植性高。
    4)mybatis和hibernate都实现了自己的二级缓存机制,也能够实现自己的二级缓存或者使用第三方机制的缓存如echcache或Redis。hibernate的二级缓存在SessionFactory生成的配置文件里配置,然后再配置具体的表和实体类的映射。如下面例子:
        
 
   
  1. <bean id="entityManagerFactory"
  2. class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  3. <property name="dataSource" ref="dataSource" />
  4. <property name="persistenceProvider" ref="persistenceProvider" />
  5. <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
  6. <property name="jpaProperties">
  7. <props>
  8. <prop key="hibernate.dialect">${hibernate.dialect}</prop>
  9. <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
  10. <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
  11. <prop key="hibernate.jdbc.fetch_size">50</prop>
  12. <prop key="hibernate.jdbc.batch_size">50</prop>
  13.                <!--二级缓存启用-->
  14. <prop key="hibernate.cache.use_second_level_cache">true</prop>
  15.                <!--查询缓存启用-->
  16. <prop key="hibernate.cache.use_query_cache">true</prop>
  17. <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
  18. <prop key="javax.persistence.sharedCache.mode">ENABLE_SELECTIVE</prop>
  19.                <!--echcache的配置文件-->
  20. <prop key="net.sf.ehcache.configurationResourceName">/ehcache.xml</prop>
  21. <prop key="hibernate.generate_statistics">false</prop>
  22. </props>
  23. </property>
  24. </bean>
 
    
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache>
  3. <diskStore path="/opt/bpm/cache/bpm" />
  4. <!-- -->
  5. <defaultCache maxElementsInMemory="20000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskPersistent="false"
  6. diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" />
  7. <cache name="com.psbc.cfc.bpm.domain.Area" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />
  8. </ehcache>
在相关的的实体类中使用xml或者用注解:
    
 
    
  1. /**
  2. * Created By: Comwave Project Team
  3. * Created Date: 2014-4-28
  4. */
  5. package com.psbc.cfc.bpm.domain;
  6. import java.io.Serializable;
  7. import javax.persistence.Cacheable;
  8. import javax.persistence.Column;
  9. import javax.persistence.Entity;
  10. import javax.persistence.Id;
  11. import javax.persistence.Table;
  12. import org.hibernate.annotations.Cache;
  13. import org.hibernate.annotations.CacheConcurrencyStrategy;
  14. /**
  15. * 区域
  16. *
  17. * @author James
  18. * @version 1.0
  19. */
  20. @Entity
  21. @Cacheable
  22. @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
  23. @Table(name = "VIEW_AREA")
  24. public class Area implements Serializable {
  25. private static final long serialVersionUID = 6474865115108614073L;
  26. /** 区域编号 */
  27. @Id
  28. @Column(name = "AREA_CODE", length = 100)
  29. private String areaCode;
  30. /** 区域名称 */
  31. @Column(name = "AREA_NAME", length = 100)
  32. private String areaName;
  33. public String getAreaCode() {
  34. return areaCode;
  35. }
  36. public void setAreaCode(String areaCode) {
  37. this.areaCode = areaCode;
  38. }
  39. public String getAreaName() {
  40. return areaName;
  41. }
  42. public void setAreaName(String areaName) {
  43. this.areaName = areaName;
  44. }
  45. }
CacheConcurrencyStrategy有四种类型:
     NONE
     READ_ONLY:只读和缓存,不能修改缓存,但数据库修改能够立即见效。
     READ_WRITE:严格的读写,更新缓存时加锁,其他线程查询缓存时查数据库。
     NONSTRICT_READ_WRITE:不严格的读写,更新缓存不加锁,适合偶尔的更新,即两个事务更新同一缓存比较少。
而myBatis的缓存具体到在表和实体的Mapper里,如:
    
 
     
  1. <mapper namespace="com.cnblogs.yjmyzz.mybatis.mapper.OrderMapper">
  2. <cache
  3. eviction="LRU"
  4. flushInterval="60000"
  5. size="1024"
  6. readOnly="true"
  7. />
  8. ...
  9. </mapper>
在<Select"></Select>这样使用则表示不使用缓存机制。
Mapper里的所有操作默认是会作用到缓存,若使用   useCache="false",则可以禁止掉缓存。
    但通常在效率上hibernate的效能比Mybatis好。

总结:
    hibernate:
       1)hibernate对对象的维护和缓存比Mybatis好。
       2)hibernate增删查改已经为用户实现了,要写的SQL比较少。
       3)hibernate的移植性比mybatis好。
        4)hibernate的二级缓存能够支持第三方缓存,而且比Mybatis好。
    Mybatis:
        1)支持复杂的SQL查询,效率比hibernate快。
        2)门槛低,容易上手。
3、Spring和Mybatis的整合
    1)创建Maven WebApp项目
          这里贴上我自己的Maven的setting.xml,下载快:
            
 
     
  1. <?xml version="1.0"?>
  2. <settings>
  3. <localRepository>C:\job\maven_repository\maven_repository</localRepository>
  4. <mirrors>
  5. <mirror>
  6. <id>alimaven</id>
  7. <name>aliyun maven</name>
  8. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  9. <mirrorOf>central</mirrorOf>
  10. </mirror>
  11. </mirrors>
  12. <profiles>
  13. <profile>
  14. <id>nexus</id>
  15. <repositories>
  16. <repository>
  17. <id>nexus</id>
  18. <name>local private nexus</name>
  19. <url>http://maven.oschina.net/content/groups/public/</url>
  20. <releases>
  21. <enabled>true</enabled>
  22. </releases>
  23. <snapshots>
  24. <enabled>false</enabled>
  25. </snapshots>
  26. </repository>
  27. </repositories>
  28. <pluginRepositories>
  29. <pluginRepository>
  30. <id>nexus</id>
  31. <name>local private nexus</name>
  32. <url>http://maven.oschina.net/content/groups/public/</url>
  33. <releases>
  34. <enabled>true</enabled>
  35. </releases>
  36. <snapshots>
  37. <enabled>false</enabled>
  38. </snapshots>
  39. </pluginRepository>
  40. </pluginRepositories>
  41. </profile>
  42. </profiles>
  43. </settings>
   项目结构如下:  
  1140851-20170807171037221-784827408.png
 
  Pom.xml如下:
    
 
       
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>yi.zhen.mo</groupId>
  5. <artifactId>spring_myBatis</artifactId>
  6. <packaging>war</packaging>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <name>spring_myBatis Maven Webapp</name>
  9. <url>http://maven.apache.org</url>
  10. <properties>
  11. <!-- spring版本号 -->
  12. <spring.version>4.2.4.RELEASE</spring.version>
  13. <!-- mybatis版本号 -->
  14. <mybatis.version>3.2.6</mybatis.version>
  15. <!-- log4j日志文件管理包版本 -->
  16. <slf4j.version>1.7.7</slf4j.version>
  17. <log4j.version>1.2.17</log4j.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>junit</groupId>
  22. <artifactId>junit</artifactId>
  23. <version>3.8.1</version>
  24. <scope>test</scope>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework</groupId>
  28. <artifactId>spring-core</artifactId>
  29. <version>${spring.version}</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-web</artifactId>
  34. <version>${spring.version}</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework</groupId>
  38. <artifactId>spring-oxm</artifactId>
  39. <version>${spring.version}</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework</groupId>
  43. <artifactId>spring-tx</artifactId>
  44. <version>${spring.version}</version>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework</groupId>
  48. <artifactId>spring-jdbc</artifactId>
  49. <version>${spring.version}</version>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.springframework</groupId>
  53. <artifactId>spring-webmvc</artifactId>
  54. <version>${spring.version}</version>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.springframework</groupId>
  58. <artifactId>spring-aop</artifactId>
  59. <version>${spring.version}</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-context-support</artifactId>
  64. <version>${spring.version}</version>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.springframework</groupId>
  68. <artifactId>spring-test</artifactId>
  69. <version>${spring.version}</version>
  70. </dependency>
  71. <!-- mybatis核心包 -->
  72. <dependency>
  73. <groupId>org.mybatis</groupId>
  74. <artifactId>mybatis</artifactId>
  75. <version>${mybatis.version}</version>
  76. </dependency>
  77. <!-- mybatis/spring包 -->
  78. <dependency>
  79. <groupId>org.mybatis</groupId>
  80. <artifactId>mybatis-spring</artifactId>
  81. <version>1.2.2</version>
  82. </dependency>
  83. <dependency>
  84. <groupId>javax</groupId>
  85. <artifactId>javaee-api</artifactId>
  86. <version>7.0</version>
  87. </dependency>
  88. <dependency>
  89. <groupId>mysql</groupId>
  90. <artifactId>mysql-connector-java</artifactId>
  91. <version>5.1.30</version>
  92. </dependency>
  93. <dependency>
  94. <groupId>commons-dbcp</groupId>
  95. <artifactId>commons-dbcp</artifactId>
  96. <version>1.2.2</version>
  97. </dependency>
  98. <dependency>
  99. <groupId>jstl</groupId>
  100. <artifactId>jstl</artifactId>
  101. <version>1.2</version>
  102. </dependency>
  103. <!-- 日志文件管理包 -->
  104. <!-- log start -->
  105. <dependency>
  106. <groupId>log4j</groupId>
  107. <artifactId>log4j</artifactId>
  108. <version>${log4j.version}</version>
  109. </dependency>
  110. <!-- 格式化对象,方便输出日志 -->
  111. <dependency>
  112. <groupId>com.alibaba</groupId>
  113. <artifactId>fastjson</artifactId>
  114. <version>1.1.41</version>
  115. </dependency>
  116. <dependency>
  117. <groupId>org.slf4j</groupId>
  118. <artifactId>slf4j-api</artifactId>
  119. <version>${slf4j.version}</version>
  120. </dependency>
  121. <dependency>
  122. <groupId>org.slf4j</groupId>
  123. <artifactId>slf4j-log4j12</artifactId>
  124. <version>${slf4j.version}</version>
  125. </dependency>
  126. <!-- log end -->
  127. <!-- 映入JSON -->
  128. <dependency>
  129. <groupId>org.codehaus.jackson</groupId>
  130. <artifactId>jackson-mapper-asl</artifactId>
  131. <version>1.9.13</version>
  132. </dependency>
  133. <!-- 上传组件包 -->
  134. <dependency>
  135. <groupId>commons-fileupload</groupId>
  136. <artifactId>commons-fileupload</artifactId>
  137. <version>1.3.1</version>
  138. </dependency>
  139. <dependency>
  140. <groupId>commons-io</groupId>
  141. <artifactId>commons-io</artifactId>
  142. <version>2.4</version>
  143. </dependency>
  144. <dependency>
  145. <groupId>commons-codec</groupId>
  146. <artifactId>commons-codec</artifactId>
  147. <version>1.9</version>
  148. </dependency>
  149. </dependencies>
  150. <build>
  151. <finalName>spring_myBatis</finalName>
  152. <plugins>
  153. <plugin>
  154. <groupId>org.apache.maven.plugins</groupId>
  155. <artifactId>maven-compiler-plugin</artifactId>
  156. <version>3.1</version>
  157. <configuration>
  158. <source>1.7</source>
  159. <target>1.7</target>
  160. <encoding>utf8</encoding>
  161. </configuration>
  162. </plugin>
  163. <plugin>
  164. <groupId>org.apache.maven.plugins</groupId>
  165. <artifactId>maven-surefire-plugin</artifactId>
  166. <version>2.19.1</version>
  167. <configuration>
  168. <groups>org.apache.surefire.BuildTest</groups>
  169. <parallel>classes</parallel>
  170. <threadCount>10</threadCount>
  171. <forkCount>3</forkCount>
  172. <reuseForks>true</reuseForks>
  173. <skipTests>true</skipTests>
  174. <argLine>-Xmx1024m -XX:MaxPermSize=256m</argLine>
  175. </configuration>
  176. </plugin>
  177. </plugins>
  178. </build>
  179. </project>
    看applicationContext.xml如下:
            
 
        
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  9. http://www.springframework.org/schema/mvc
  10. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
  11. <!-- 自动扫描 -->
  12. <context:component-scan base-package="yi.zhen.mo" />
  13. <!-- <context:annotation-config /> -->
  14. <bean id="propertyConfigurer"
  15. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  16. <property name="location" value="classpath:jdbc.properties" />
  17. </bean>
  18. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  19. <property name="driverClassName" value="${driver}" />
  20. <property name="url" value="${url}" />
  21. <property name="username" value="${username}" />
  22. <property name="password" value="${password}" />
  23. <!-- 初始化连接大小 -->
  24. <property name="initialSize" value="${initialSize}"></property>
  25. <!-- 连接池最大数量 -->
  26. <property name="maxActive" value="${maxActive}"></property>
  27. <!-- 连接池最大空闲 -->
  28. <property name="maxIdle" value="${maxIdle}"></property>
  29. <!-- 连接池最小空闲 -->
  30. <property name="minIdle" value="${minIdle}"></property>
  31. <!-- 获取连接最大等待时间 -->
  32. <property name="maxWait" value="${maxWait}"></property>
  33. </bean>
  34. <!-- SqlSessionFactoryBean是的getObject方法会返回一个sqlSessionFactory实例 -->
  35. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  36. <property name="dataSource" ref="dataSource" />
  37. <!-- 自动扫描mapping.xml文件 若使用注解则不需 -->
  38. <property name="mapperLocations" value="classpath:yi/zhen/mo/mapping/*.xml"></property>
  39. </bean>
  40.    <!-- 单个dao的配置-->
  41. <!-- <bean id="useDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
  42. <property name="mapperInterface" value="com.xxx.dao.UserDao" />
  43. <property name="sqlSessionFactory" ref="sqlSessionFactory" />
  44. </bean> -->
  45.    <!-- 多个dao的配置 MapperScannerConfigurer会将生成的Mapper代理注册到Spring IOC容器中-->
  46. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  47. <property name="basePackage" value="yi.zhen.mo.dao" />
  48. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
  49. </bean>
  50.    <!-- dataSource的事务配置-->
  51. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  52. <property name="dataSource" ref="dataSource" />
  53. </bean>
  54. </beans>
   Mapper的配置有两种:
       (1)xml:
 
         
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="yi.zhen.mo.dao.UserMapper">
  4. <select id="getUser" resultType="yi.zhen.mo.entity.User">
  5. select * from User where username=#{username} and password=#{password}
  6. </select>
  7. </mapper>
       (2)注解:
     1140851-20170807171038205-1922896595.png
 
2)
    简单的写了个测试类:
        
    
 
         
  1. public static void main(String[] args) {
  2. ClassPathXmlApplicationContext cx=new ClassPathXmlApplicationContext("spring-mybatis.xml");
  3. UserMapper um=(UserMapper)cx.getBean("userMapper");
  4. List<User> list=um.getUser("xiaoming","111111");
  5.        if(list==null||list.size()==0)
  6.            System.out.println("can not find !");
  7.        else System.out.println("find the record !");
  8. }




 







转载于:https://www.cnblogs.com/zhenyimo/p/7300102.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值