在上一篇文章中(Post not found: SpringBoot Druid Mybatis多数据源 SpringBoot Druid Mybatis多数据源),我使用了SpringBoot+Druid+Mybatis进行多数据源配置,更进一步的,我想将Mybatis使用Mybatis Plus进行替换。主要的工作其实就是SqlSessionFactory的生成,主要解决了下面两个问题:
1.Invalid bound statement (not found)
在我配置了多数据源的时候,使用Mybatis plus的selectList(null)时出现了错误。最后解决方式就是将默认的SqlSessionFactory换成了MybatisSqlSessionFactory
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Bean(name = "sqlserverSqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("sqlserverDataSource") DataSource masterDataSource) throws Exception { MybatisSqlSessionFactoryBean sessionFactory=new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(masterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(SqlServerConfig.MAPPER_LOCATION)); return sessionFactory.getObject();
}
|
2.mybatis plus 自动映射错误
在使用多数据源的时候,需要自己指定sqlSession,但是这个时候如果我还想使用Mybatis提供的自动生成sql语句怎么办呢?我遇到的最大的问题,就是数据库字段名不匹配,我数据库中的表名是realtime但是最后生成的sql语句中确是:from real_time,表名被加了下划线,还有就是字段名数据库中的为SiteNo,但是自动生成的sql语句却变成了site_no,所以最后就会报错,对象名不存在。
我反复尝试,最后终于在sessionFactory中修改了命名策略,刚开始我使用@Bean注入的方式进行,最后将Configuration注入到sessionFactory中,但是始终都不生效。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| @Bean(name="globalConfig") @Primary public GlobalConfig globalConfig(){ GlobalConfig globalConfig=new GlobalConfig(); globalConfig.setDbConfig(dbConfig()); return globalConfig; } @Bean(name="dbConfig") @Primary public GlobalConfig.DbConfig dbConfig(){ GlobalConfig.DbConfig dbConfig=new GlobalConfig.DbConfig(); dbConfig.setCapitalMode(true); dbConfig.setTableUnderline(false); dbConfig.setTablePrefix("ph_"); return dbConfig; } @Bean(name = "sqlserverMybatisConfiguration") @Primary public MybatisConfiguration mybatisConfiguration(){ MybatisConfiguration mybatisConfiguration=new MybatisConfiguration(); mybatisConfiguration.setMapUnderscoreToCamelCase(false); mybatisConfiguration.setAutoMappingBehavior(AutoMappingBehavior.NONE); mybatisConfiguration.setGlobalConfig(globalConfig()); return new MybatisConfiguration(); } @Bean(name = "sqlserverSqlSessionFactory") @Primary public SqlSessionFactory sqlSessionFactory(@Qualifier("sqlserverDataSource") DataSource dataSource, @Qualifier("sqlserverMybatisConfiguration") MybatisConfiguration mybatisConfiguration) throws Exception { MybatisSqlSessionFactoryBean sessionFactory=new MybatisSqlSessionFactoryBean(); sessionFactory.setDataSource(dataSource); sessionFactory.setConfiguration(mybatisConfiguration); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(SqlServerConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); }
|
3.示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| @Configuration
public class MybatisPlusConfig { static final String PACKAGE = "com.proheng.gis.mapper.sqlserver"; static final String MAPPER_LOCATION = "classpath*:mapper/sqlserver/*.xml";
@Value("${datasource.sqlserver.url}") private String url;
@Value("${datasource.sqlserver.username}") private String user;
@Value("${datasource.sqlserver.password}") private String password;
@Value("${datasource.sqlserver.driverClassName}") private String driverClass;
@Bean(name = "mybatisDataSource") @Primary public DataSource dataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; }
@Primary @Bean("mybatisSqlSessionFactory") public SqlSessionFactory sqlSessionFactory(@Qualifier("mybatisDataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean(); sqlSessionFactory.setDataSource(dataSource); MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setMapUnderscoreToCamelCase(false);
GlobalConfig globalConfig=new GlobalConfig();
GlobalConfig.DbConfig dbConfig=new GlobalConfig.DbConfig(); dbConfig.setTableUnderline(false);
globalConfig.setDbConfig(dbConfig);
sqlSessionFactory.setGlobalConfig(globalConfig); sqlSessionFactory.setConfiguration(configuration); sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(MybatisPlusConfig.MAPPER_LOCATION)); return sqlSessionFactory.getObject(); }
}
|
4.属性文件中配置
关闭驼峰命名映射,可以在属性配置文件application.yml文件进行。
1 2 3 4
| mybatis-plus: configuration: map-underscore-to-camel-case: false
|
这里要说明的是 map-underscore-to-camel-case 这个配置,默认的java类的属性名的对应方式是属性名对应到数据的下划线属性名,比如:siteno 生成sql语句的时候就是 site_no,如果数据库没有相关的列名,可能就会报:对象不存在的错误。
也就是说,我想着是属性名siteno,直接对应数据库中的siteno属性,这个时候可以关闭 map-underscore-to-camel-case: false 进行解决(这里其实我有疑问,因为我不设置false就是报错)。
还有一点就是,我的配置文件中只能用mybatis-plus,而不能用mybatis进行配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| mybatis: configuration: map-underscore-to-camel-case: true type-aliases-package: com.bibichuan.phemsjava.entiy mapper-locations: classpath:mapper/*.xml
mybatis-plus: configuration: map-underscore-to-camel-case: false type-aliases-package: com.proheng.phzsjm.entiy mapper-locations: classpath:mapper/*.xml
|