mybatis怎么把下划线字段转为驼峰变量

一.使用方法
1.xml配置方法,mybatis-config.xml的配置如下
<configuration>
	<!-- 全局参数 -->
	<settings>
		<!-- 使用驼峰命名法转换字段。 -->
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
</configuration>
当然前题是先要加载这个配置文件,如用spring xml是这么加载
<bean id="mybatisSqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath*:sql/**/*.xml"/>
    <property name="configLocation" value="classpath:/conf/mybatis-config.xml"></property>
</bean>
2.springboot的application.properties的配置方法
#开启驼峰命名转换
mybatis.configuration.map-underscore-to-camel-case=true
如果是多数据源,要在配置sessionFactory时配置一下,代码如下:
@Bean
@ConfigurationProperties(prefix="mybatis.configuration")
public org.apache.ibatis.session.Configuration mybatisConfig() {
	return new org.apache.ibatis.session.Configuration();
}
@Bean
public SqlSessionFactory sqlSessionFactory(org.apache.ibatis.session.Configuration config) throws Exception {
    SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
    sqlSessionFactoryBean.setDataSource(dynamicDataSource());
    //此处设置为了解决找不到mapper文件的问题
    sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml"));
    sqlSessionFactoryBean.setConfiguration(config);
    return sqlSessionFactoryBean.getObject();
}
@Bean
public SqlSessionTemplate sqlSessionTemplate(org.apache.ibatis.session.Configuration config) throws Exception {
    return new SqlSessionTemplate(sqlSessionFactory(config));
}


二、源码分析
先看一下转化的调用堆栈:
代码如下(org.apache.ibatis.reflection.MetaClass):
上面代码只是去掉了下划线,并没有首字母小写变大写的代码。再跟进findProperty方法可以找到获取驼峰结果的代码如下:
可以看出通过reflector.findPropertyName方法把去掉下划线的变量转成了驼峰的变量。再跟过去看到这样的代码:

那么caseInsensitivePropertyMap这个集合又是什么时候初始化的呢?原来是系统启动时,spring加载上下文的时候:
而它的key其实是实体类的set与get方法后面的字符(org.apache.ibatis.reflection.Reflector.addGetMethods,org.apache.ibatis.reflection.property.PropertyNamer.methodToProperty),而这个方法一般都是标准的驼峰格式。所以当get(大写字段)名时,可以得到标准的驼峰字段名。



再把整个流程整理一下:

所以其实不是转换下划线,而是去掉下划线,再取驼峰的变量。不过最后的效果与转换的一样。

如何单独使用mybatis的驼峰处理方法?
分两种情况,一种是返回的是对象形式。那么可直接用metaClass的方法,如下:
MetaClass mc=MetaClass.forClass(InfoEntry.class,new DefaultReflectorFactory());
//        MetaClass mc=MetaClass.forClass(Map.class,new DefaultReflectorFactory());
        System.out.println(mc.findProperty("create_time",true));
        System.out.println(mc.findProperty("CREATE_TIME",true));
注意这里MetaClass.forClass的参数变成Map将不可用。DefaultReflectorFactory是mybatis的类。


另一种是返回的是Map形式。可用mybatisplus的metaObject的方法,如下:
Map<String,Object> map=new HashMap<>();
map.put("create_time",new Date());
map.put("CREATE_TIME",new Date());
MetaObject mo=MetaObject.forObject(map, new DefaultObjectFactory(),new MybatisMapWrapperFactory(),new DefaultReflectorFactory());
System.out.println(Arrays.stream(mo.getGetterNames()).collect(Collectors.joining(",")));
System.out.println(mo.findProperty("create_time",true));
System.out.println(mo.findProperty("CREATE_TIME",true));

注意这里MybatisMapWrapperFactory是mybatis-plus的类。引用:
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus</artifactId>
    <version>3.1.0</version>
</dependency>


文/程忠 浏览次数:0次   2018-03-10 18:38:09

相关阅读

微信扫描-捐赠支持
加入QQ群-技术交流

评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑