先说说背景,项目之前使用的spring JPA做为数据持久化的工具,本人接手后想使用MyBatis,但是之前的又不想改变,所以有了这个需求,同一个数据源,使用spring JPA和MyBatis来做持久化。
刚开始集成出了好多问题,以下就列出正确的集成方式,参照这种方式,一定能集成成功
在之前的mybatis版本中,dao和mapper文件的文件名要特殊定义,就是末尾必须是Dao或者Mapper,但是现在不用了,现在在config文件中会配置扫描的类文件的包地址和.xml文件的地址,顺便说下mybatis版本
"org.mybatis:mybatis-spring:1.3.0",
"org.mybatis:mybatis:3.4.4",
要注意的事项:
a,xml中有个namespace是写xml文件对应的Dao类的,千万不要写错了,这个写错了mybatis也检测不出来,是个大坑
b,config文件中有如下方法,这个是读取配置文件,连接数据库的,如果配置文件是yml,可以用如下这种方式,会简结一些
@Bean
@ConfigurationProperties(prefix= "spring.datasource")
@PrimarypublicDataSource idrDataSource() {
returnDataSourceBuilder.create().build();
}
某认为,集成主要有依赖以下几个文件,1,注册数据源文件2,配置文件3,dao.java,4,mapper.xml,下面给个正确的配置
1,注册数据源的文件,主要是项目启动时扫描dao文件和xml文件,根据配置文件连接数据源
packagecom.xxx.cms.boot.config;importjavax.sql.DataSource;importorg.apache.ibatis.session.SqlSessionFactory;importorg.mybatis.spring.SqlSessionFactoryBean;importorg.mybatis.spring.SqlSessionTemplate;importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importorg.springframework.jdbc.datasource.DataSourceTransactionManager;importcom.alibaba.druid.pool.DruidDataSource;
@Configuration
//此处是dao所在的包的地址
@MapperScan(basePackages= { "com.xxx.cms.repository.ibatis" }, sqlSessionTemplateRef = "idrSqlSessionTemplate")public classIDRDatasourceConfig2 {
@Value("${spring.datasource.driver-class-name}")privateString driverClassName;
@Value("${spring.datasource.url}")privateString url;
@Value("${spring.datasource.username}")privateString username;
@Value("${spring.datasource.password}")privateString password;
@Value("${encrypt.seed}")privateString encryptKey;
@Bean
@Primarypublic DataSource idrDataSource() throwsGlobalErrorInfoException{
DruidDataSource datasource= newDruidDataSource();
datasource.setDriverClassName(driverClassName);
datasource.setUrl(url);
datasource.setUsername(username);
datasource.setPassword(password);returndatasource;//return DataSourceBuilder.create().build();
}
@Bean
@Primarypublic SqlSessionFactory idrSqlSessionFactory(@Qualifier("idrDataSource") DataSource dataSource) throwsException {
SqlSessionFactoryBean bean= newSqlSessionFactoryBean();
bean.setDataSource(dataSource);
//此处是mapper文件的位置
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));
bean.setTypeAliasesPackage("mapper");returnbean.getObject();
}
@Bean
@Primarypublic DataSourceTransactionManager idrTransactionManager(@Qualifier("idrDataSource") DataSource dataSource) {return newDataSourceTransactionManager(dataSource);
}
@Bean
@PrimarypublicSqlSessionTemplate idrSqlSessionTemplate(
@Qualifier("idrSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throwsException {return newSqlSessionTemplate(sqlSessionFactory);
}
}
2,配置文件 cms.properties
spring.datasource.url=jdbc:sqlserver://localhost:1433;databaseName=Test;applicationIntent=ReadWrite
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=admin
spring.datasource.password=123456
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
3,Dao.java文件(UserDao.java)
packagecom.xxx.cms.repository.ibatis;importorg.apache.ibatis.annotations.Mapper;importorg.apache.ibatis.annotations.Select;
@Mapperpublic interfaceUserDao {
//这种写法就是需要在xml中配置对应方法的booleanupdateAndInsert();
//这种带注解的是不需要在对应xml文件中写相应方法的
@Select("select count(1) from BC_QR_Scene")intfindCount();
}
4,Mapper.xml文件(UserMapper.xml)
IF EXISTS(SELECT * FROM USER WHERE USER_ID = #{userId} )
BEGIN
UPDATE USER SET UPDATE_TIME = GETDATE() WHERE USER_ID = #{userId}
END
ELSE
BEGIN
INSERT INTO USER VALUES (#{userId}, #{userId}, #{userId}, '0', getdate(), NULL)
END
有了以上四个文件之后,就可以在项目中集成mybatis了
哈哈哈哈,你有没有发现我们标题写的是集成JPA与MyBatis,但是我们都没有怎,但是都没有怎么写JPA如何如何吗,不是我漏写了,因为我集成完了发现,根本没有JPA什么事,保持原状就好,两个是独立的,目前没有发现在会互相干扰的情况。
引用链接: