MybatisPlus自定义命名策略

标签: 无 分类: 后台服务 创建时间:2020-07-14 05:35:47 更新时间:2023-10-20 11:23:26

在上一篇文章中(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();


// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// 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();
}
参考文章:
1.解决mybatis plus 驼峰式命名规则
2.Spring-boot整合Mybatis-plus多数据源
3.mybatis-plus 配置多数据源,无法读取全局配置文件的配置(记一bug) (这里提示了我globalcofig放置到sqlsessionFactory上,而不是configuration上)
4.使用Mybatis-Plus时的SqlSessionFactory的问题 (MybatisSqlSessionFactoryBean和SqlSessionFactoryBean源码)
5.使用配置 (官方的说明,但是不能借鉴文档开头的Spring Bean注入顺序)
6. baomidou / mybatisplus-spring-boot (官方给的源码例子,没有什么作用)

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
//@MapperScan("com.baomidou.springboot.mapper*")//这个注解,作用相当于下面的@Bean MapperScannerConfigurer,2者配置1份即可
public class MybatisPlusConfig {
// 精确到 master 目录,以便跟其他数据源隔离
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:
# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似映射
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
## Entity Class Package Name
type-aliases-package: com.bibichuan.phemsjava.entiy
mapper-locations: classpath:mapper/*.xml

## 生效
mybatis-plus:
configuration:
# 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名) 的类似射
map-underscore-to-camel-case: false
type-aliases-package: com.proheng.phzsjm.entiy
mapper-locations: classpath:mapper/*.xml
参考文章:
1.MyBatis: underscore not mapped to camelcase
2.Springboot中MyBatis 自动转换 map-underscore-to-camel-case 可以通过设 map-underscore-to-camel-case属性为true来开启驼峰功能
4.Mybatis plus关闭驼峰命名,防止出现查询为Null!四种方法超详细解析! 这里讲了四种方法关闭驼峰命名:1.通过configuration.map-underscore-to-camel-case: false 配置,去掉默认实现。2.检查实体类中的字段是否存在下划线,将所有所有存在的下划线的字段,修改为标准的驼峰命名字段。3.在初始化的时候设置全局配置。4.appliction.yml 里设置 关闭驼峰式编码或者是xml中配置
5.Mybatis和MybatisPlus的区别与联系
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。