Mybatis在使用過程中需要三個東西,每張表對應一個XXMapper.java接口文件,每張表對應一個XXMapper.xml文件,每張表對應一個Entity的Java文件。 其中XXMapper.xml把XXMapper.java接口文件、Entity的Java文件 結合起來
在配置過程中:
MyBatisConfig.java
@Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean() { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setTypeAliasesPackage("tk.mybatis.springboot.model");//每一張表對應的實體類 //添加XML目錄 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml"));//每張表對應的xml文件 return bean.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } }
import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import tk.mybatis.spring.mapper.MapperScannerConfigurer; import java.util.Properties; /** * MyBatis掃描接口,使用的tk.mybatis.spring.mapper.MapperScannerConfigurer,如果你不使用通用Mapper,可以改為org.xxx... * * @author liuzh * @since 2015-12-19 14:46 */ @Configuration //TODO 注意,由於MapperScannerConfigurer執行的比較早,所以必須有下面的注解 @AutoConfigureAfter(MyBatisConfig.class) public class MyBatisMapperScannerConfig { @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setBasePackage("tk.mybatis.springboot.mapper");//每張表對應的XXMapper.java interface類型的Java文件 Properties properties = new Properties(); properties.setProperty("mappers", "tk.mybatis.springboot.util.MyMapper"); properties.setProperty("notEmpty", "false"); properties.setProperty("IDENTITY", "MYSQL"); mapperScannerConfigurer.setProperties(properties); return mapperScannerConfigurer; } }
sqlSessionFactoryBeanName
屬性
sqlSessionFactoryBeanName
這個屬性一般都用不到,只有當你配置多數據源的時候,這是會有多個sqlSessionFactory
,你就需要通過該屬性來指定哪一個sqlSessionFactory
(值為SqlSessionFactoryBean
<bean>
配置中的id
屬性)。
由於通用Mapper依賴JPA,所以還需要下載persistence-api-1.0.jar:
http://repo1.maven.org/maven2/javax/persistence/persistence-api/1.0/
http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/2.Integration.md
MyBatis通用Mapper3 通用Mapper都可以極大的方便開發人員。可以隨意的按照自己的需要選擇通用方法,還可以很方便的開發自己的通用方法。 極其方便的使用MyBatis單表的增刪改查。
支持單表操作,不支持通用的多表聯合查詢。 通用 Mapper 支持 Mybatis-3.2.4 及以上版本 特別強調 不是表中字段的屬性必須加 @Transient 注解
通用 Mapper 不支持 devtools 熱加載,devtools 排除實體類包即可,
配置方式參考:using-boot-devtools-customizing-classload(http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-customizing-classload)
看本文之前,請確保你已經在SpringBoot中集成MyBatis,並能正常使用。
Spring DevTools 配置
感謝emf1002提供的解決方案。
在使用 DevTools 時,通用Mapper經常會出現 class x.x.A cannot be cast to x.x.A。
同一個類如果使用了不同的類加載器,就會產生這樣的錯誤,所以解決方案就是讓通用Mapper和實體類使用相同的類加載器即可。
DevTools 默認會對 IDE 中引入的所有項目使用 restart 類加載器,對於引入的 jar 包使用 base 類加載器,因此只要保證通用Mapper的jar包使用 restart 類加載器即可。
在 src/main/resources 中創建 META-INF 目錄,在此目錄下添加 spring-devtools.properties 配置,內容如下:
restart.include.mapper=/mapper-[\\w-\\.]+jar
restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar
使用這個配置后,就會使用 restart 類加載加載 include 進去的 jar 包。
如果沒有,那么請先移步 http://blog.csdn.net/catoop/article/details/50553714 做了解后,再按本文步驟操作。
使用MyBatis在我們通過xml集中配置SQL,並通過創建接口Mapper文件來完成持久化DAO層(mybatis內部使用的是動態代理,所以我們不需要自己編寫實現類)。
然而在實際開發中,單表操作非常多,如果你也想像JPA、JDBC那樣做一個所謂的BaseDao。那么可以實現一個通用Mapper來達到目的。
現在有現成的通用Mapper插件,我們無需重新創造輪子(代碼是開源的,你也可以自己在其基礎上修改)。
通用Mapper插件網址:http://git.oschina.net/free/Mapper
https://yq.aliyun.com/articles/5831