Spring持久化之MyBatis

MyBatis是一個優秀的輕量級持久化框架,本文主要介紹MyBatis與Spring集成的配置與用法。java

1. Spring MyBatis配置

1.1 添加Maven依賴

在pom.xml文件裏添加mybatis-spring和mybatis的依賴:spring

<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis.spring.version}</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency>

mybatis-spring當前最新版本爲1.2.2,mybatis當前版本是3.2.5.sql

1.2 添加dao接口

這裏的dao必須是接口,而不是具體的實現,如MyBatisDao.java內容爲:數據庫

public interface MyBatisTest { public String getUserNameById(int id); public List<Students> getStudentByNumAndCity(Map<String, Object> queryMap); }

接口中定義的每個方法對應於mapper映射文件中定義的jdbc執行模塊,如<select/><update/><insert/>等。mybatis

1.3 添加mybatis配置文件

該配置文件裏主要配置類型別名<typeAliases/>、設置<settings/>,mapper映射文件路徑<mappers/>也能夠放在這裏,但更建議將全部的mapper文件都放在一個目錄下,在定義sqlSessionFactory時經過屬性mapperLocations指定。如mybatis.xml配置文件能夠以下定義:app

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <typeAliases> <typeAlias type="com.sohu.tv.bean.Students" alias="Students"/> </typeAliases> <!--<mappers>--> <!--<mapper resource="com/sohu/tv/mapper/MybatisTest.xml"/>--> <!--</mappers>--> </configuration>

類型別名是用別名來表明全限定類名,如在須要用到com.sohu.tv.bean.Students的地方,均可以使用Students來代替。框架

1.4 添加mapper映射文件:

mapper映射文件能夠定義數據庫列與POJO類屬性的映射,以及與dao接口類中的方法對應的JDBC執行模塊,如MyBatisMapper.xml的內容爲:maven

<mapper namespace="com.sohu.tv.dao.MyBatisTest"> <resultMap id="studentMap" type="Students"> <result column="name" property="name"/> <result column="sex" property="sex"/> <result column="number" property="number"/> <result column="enable" property="enable"/> <result column="city" property="city"/> </resultMap> <select id="getUserNameById" parameterType="int" resultType="String"> select name from students where id = #{id} </select> <select id="getStudentByNumAndCity" parameterType="map" resultMap="studentMap"> select * from students where number = #{num} and city = #{city} </select> </mapper>

<resultMap/>即定義列與屬性的字段映射;<select/>中的參數和返回值的類型,既能夠爲基本類型,如string,int,long,也能夠是map,返回類型還能夠是<resultMap/>定義的映射map;若是參數類型是map,則sql中的參數名(如#{num})必須是map的key;若是返回類型爲map,則sql語句中返回的列名爲key;若是是基本類型,使用type,如parameterType,resultType,若是是自定義map,使用parameterMap,resultMap.測試

1.5 Spring配置文件的配置

首先須要配置sqlSessionFactory:ui

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="feedbackDataSource"/> <property name="configLocation" value="classpath:mybatis.xml"/> <property name="mapperLocations" value="classpath:com/sohu/tv/mapper/*.xml"/> </bean>

屬性dataSource引用JDBC數據源;屬性configLocation指定mybatis配置文件的位置,配置文件中定義別名<typeAliases/>,設置<settings/>等。mapperLocations指定mapper映射文件的路徑。有一點須要注意的是,要確保mapper映射文件被打包進classpath中,默認狀況下,maven會忽略源文件中的資源文件,能夠經過在pom文件中配置,使得資源文件被一塊兒打包進classpath中;如在pom配置文件中添加:

<build> <resources> <resource> <directory>src/main/java</directory> <excludes><exclude>**/*.java</exclude></excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> </build>

其次,須要定義與dao接口相關聯的mapperFactoryBean:

<bean id="mybatisDaoImpl" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.sohu.tv.dao.MyBatisTest"/> <property name="sqlSessionFactory" ref="sqlSessionFactory"/> </bean>

mapperInterface屬性的值爲相關的dao接口,sqlSessionFactory屬性引用了上述定義的sqlSessionFacotry;

1.6 service類中調用dao類實現業務邏輯

在MyBatisServiceImpl.java中使用dao接口中提供的方法:

@Resource(name = "mybatisDaoImpl") MyBatisDao myBatisDaoImpl; String userName = mybatisDaoImpl.getUserNameById(2); System.out.println(userName); Map<String, Object> queryMap = new HashMap<String, Object>(); queryMap.put("num", 333); queryMap.put("city", "beijing"); List<Students> studentsList = mybatisDaoImpl.getStudentByNumAndCity(queryMap); for (Students students: studentsList) { System.out.println(students.getName()); }

2. 啓動自動掃描註解

咱們能夠在applicationContext.xml配置文件裏爲每一個dao接口定義bean,但mybatis還提供了一種更簡便的自動掃描註解的機制,即<mybatis:scan/><MapperScannerConfigurer/>。 配置<mybatis:scan/>,須要在applicationContext.xml配置文件裏添加:

<mybatis:scan base-package="com.sohu.tv.dao"/>

<mybatis:scan/>與Spring的<context:component-scan/>很是類似,base-package指定要掃描的包,並將包下的全部接口註冊爲對應的bean。命名規則:和Spring同樣,若是該接口沒有被註解,則bean的名稱爲首字母小寫的非限定類名,如接口爲com.sohu.tv.dao.MyBatisDao,則bean的名字爲myBatisDao;若是dao接口使用了Spring的註解,如@Component或@Named等註解,並提供了bean的名稱,則mybatis使用該註解的名稱做爲bean的名稱。如將MyBatisDao接口重定義以下:

@Repository(value = "mybatisDao") public interface MyBatisDao { public String getUserNameById(int id); public List<Students> getStudentByNumAndCity(Map<String, Object> queryMap); }

測試MyBatisDao被自動註解後的bean的名稱爲mybatisDao。建議經過註解指定bean的名稱,防止類類名的變化致使了bean名稱的變化;

配置<MapperScannerConfigurer/>,須要在applicationContext.xml中添加:

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.sohu.tv.dao"/> <property name="sqlSessionFactoryBeanName" value = "sqlSessionFactory"/> </bean>

這裏的basePackage<mybatis:scan/>base-package的含義一致,bean的命名規則也是同樣的,因此這兩種方式等價。

若是啓動了自動掃描註解,則在spring配置文件中再也不須要dao接口的bean定義了。

3. 總結-最佳實踐

  • mapper映射文件放在單獨的目錄中,統一管理,在配置sqlSessionFactory時,經過屬性mapperLocations指定;
  • mybatis配置文件中只定義typeAliasessettings等配置信息;
  • Spring配置文件中,經過<mybatis:scan/>或者<MapperScannerConfigurer/>啓動自動註解,並經過Spring的註解對bean命名。
相關文章
相關標籤/搜索