很多項目中使用到了mybatis框架,一般也都是把mybatis集成在spring中。為什么要使用mybatis,以及使用mybatis優勢在哪,這個往往是我們要關心以及要弄明白的地方。
mybatis官網給出的定義:MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。
也許官網給出的定義太過抽象,下面以我自己的理解來說明下。(以例子來說明)
一、配置集成到spring的mybatis相關配置(applicationContext.xml)
配置文件如下:

1 <!-- 配置數據源 --> 2 <bean id="dataSource" 3 class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 4 <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 5 <property name="url" value="jdbc:mysql://localhost:3306/db_crm"/> 6 <property name="username" value="root"/> 7 <property name="password" value="passwd"/> 8 </bean> 9 10 <!-- 配置mybatis的sqlSessionFactory --> 11 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 12 <property name="dataSource" ref="dataSource" /> 13 <!-- 自動掃描mappers.xml文件 --> 14 <property name="mapperLocations" value="classpath:com/hik/mappers/*.xml"></property> 15 <!-- mybatis配置文件 --> 16 <property name="configLocation" value="classpath:mybatis-config.xml"></property> 17 </bean> 18 19 <!-- DAO接口所在包名,Spring會自動查找其下的類 --> 20 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 21 <property name="basePackage" value="com.hik.dao" /> 22 <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> 23 </bean>
mybatis框架使用實際上是優化了dao實現層,我們都知道dao層是與數據庫打交道,dao層定義接口,dao實現層相關代碼實現數據的增刪改查操作。
而mybatis的使用,直接省去了dao實現層的代碼,通過配置文件實現映射。框架內部會自動把mybatis配置文件轉為dao實現層代碼,實現數據的增刪改查操作。
其本質都是一樣的。所以,為什么我們使用mybatis,是因為它代碼實現起來,更加簡潔,通過配置文件映射更加直觀。我們使用時,只需遵循它的配置規則即可。
如下:
dao接口層:

1 /** 2 * 3 */ 4 package com.hik.dao; 5 6 import java.util.List; 7 import java.util.Map; 8 9 import com.hik.entity.User; 10 11 /** 12 * @ClassName: UserDao 13 * @Description: 用戶Dao接口 14 * @author jed 15 * @date 2017年8月13日上午11:47:48 16 * 17 */ 18 public interface UserDao { 19 20 /** 21 * @MethodName: login 22 * @Description: 用戶登錄 23 * @author jed 24 * @date 2017年8月13日下午4:35:42 25 * @param @param user 26 * @param @return 27 * @return User 返回類型 28 * @param user 29 * @return 30 * 31 */ 32 public User login(User user); 33 34 /** 35 * 36 * @MethodName: find 37 * @Description: 查詢所有用戶 38 * @author jed 39 * @date 2017年8月19日上午9:50:46 40 * @param @return 41 * @return List<User> 返回類型 42 * @return 43 * 44 */ 45 public List<User> find(Map<String, Object> map); 46 47 /** 48 * 49 * @MethodName: getTotal 50 * @Description: 獲取總記錄數 51 * @author jed 52 * @date 2017年8月19日上午9:52:52 53 * @param @param map 54 * @param @return 55 * @return Long 返回類型 56 * @param map 57 * @return 58 * 59 */ 60 public Long getTotal(Map<String, Object> map); 61 }
使用mybatis,我們不需要寫daoImpl代碼
只需在mapper配置文件中寫數據庫語句即可。

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.hik.dao.UserDao"> 6 7 <resultMap type="User" id="UserResult"> 8 <result property="id" column="id"/> 9 <result property="userName" column="userName"/> 10 <result property="password" column="password"/> 11 <result property="trueName" column="trueName"/> 12 <result property="email" column="email"/> 13 <result property="phone" column="phone"/> 14 <result property="roleName" column="roleName"/> 15 </resultMap> 16 17 <select id="login" parameterType="User" resultMap="UserResult"> 18 select * from t_user where userName=#{userName} and password=#{password} and roleName=#{roleName} 19 </select> 20 21 <select id="find" parameterType="Map" resultMap="UserResult"> 22 select * from t_user 23 <where> 24 <if test="userName!=null and userName!=''"> 25 and userName like #{userName} 26 </if> 27 </where> 28 <if test="start!=null and size!=null"> 29 limit #{start},#{size} 30 </if> 31 </select> 32 33 <select id="getTotal" parameterType="Map" resultType="Long"> 34 select count(*) from t_user 35 <where> 36 <if test="userName!=null and userName!=''"> 37 and userName like #{userName} 38 </if> 39 </where> 40 </select> 41 </mapper>
命名空間正好是dao,對應dao層,其實mapper的配置文件,我們就可以看作是daoImpl。
這里的實體對象,配置成resultMap,作為sql查詢語句的返回值(resultType)。這里可省去resultType
where標簽中if標簽用於條件判斷,里面的and會自動去掉。保證sql語句的正確性。

1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 別名 --> 7 <typeAliases> 8 <package name="com.hik.entity"/> 9 </typeAliases> 10 </configuration>
而mybatis-config.xml配置中的別名,便於我們找到javaBean實體。
使用mybatis框架,確實方便不少。