mybatis的mapUnderscoreToCamelCase自动转驼峰使用详解和坑-_-

前言

首先说一下为什么要使用自动转驼峰呢?很多小伙伴特别是项目经验经验不是太丰富的感触不太深,但就博主自己觉得一个项目中统一的变量命名能节省很多很繁琐的事,特别是项目较大功能较多的时候,以及涉及到与第三方对接,这就显得非常重要了。

那要怎么保持项目中的变量命名统一化呢?如果要使用驼峰式命名的话,就必须对数据库的数据做一些处理,因为我们都知道数据库中的表名和字段名的两个单词间都是使用下划线“_”的,那这样就会产生在比如在myabtis中查出来的数据的命名都是下划线,那这时该怎么办呢?可能有些小伙伴觉得那我在设计数据库的时候全部使用驼峰式名,这样问题就不存在了。

但博主建议这种做法最好不要去干,一是因为数据库的表名和字段都采用下划线“——”的方式,这是规范,二是因为公司的项目往往数据库设计不是你说了算或者说数据库已经搭建好了,那就必须在代码或者配置文件中做手脚了

正文

最近在做springboot+mybatis的整合项目,所以下面使用springboot+mybatis作为案例

1.第一种使用resultMap一一对应映射

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.easycare.dao.CommonInfoMapper">

	<resultMap id="BaseResultMap"
		type="com.easycare.entity.CommonInfo">
		<id column="comment_id" jdbcType="VARCHAR" property="commentId" />
		<result column="prescription_order_id" jdbcType="VARCHAR"
			property="prescriptionOrderId" />
		<result column="customer_id" jdbcType="VARCHAR"
			property="customerId" />
		<result column="content" jdbcType="VARCHAR" property="content" />
		<result column="grade" jdbcType="INTEGER" property="grade" />
	</resultMap>
	
	<select id="test1" resultMap="BaseResultMap">
		select
			comment_id,
			prescription_order_id,
			customer_id,
			content,
			grade
		from
			tb_comment_info
	</select>
</mapper>

直接用resultMap作为接受类型,再把获取的数据一一对应映射到实体上

这样也可以实现将下划线转换为驼峰式命名

2.第二种 mapUnderscoreToCamelCase

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 配置mybatis自动转换为驼峰式命名 -->
	<settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

</configuration>

直接在mybatis-config.xml配置文件中添加以上代码 或者在

application.yml中配置

#mybatis配置
mybatis:
   configuration:
    map-underscore-to-camel-case: true

然后mybatis中直接使用对应的实体类作为接受类型

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.easycare.dao.CommonInfoMapper">

	<select id="test3" parameterType="pd"
		resultType="com.easycare.entity.CommonInfo">
		select
			comment_id,
			prescription_order_id,
			customer_id,
			content,
			grade
		from
			tb_comment_info
		<where>
			comment_id=2
		</where>
	</select>
</mapper>

这样也会帮你自动转换为驼峰式

博主踩得坑-_-

以上两种都不是重点,重点的来了
以上两种自动转驼峰的方式之所以会成功都是因为存在对应的驼峰式实体类

而博主在搭建项目的时候封装万能实体类PageData作为接受参数的工具类,所以我把实体类那层给去掉了,所以导致我在自动转驼峰mapUnderscoreToCamelCase的坑中摔得很惨

相关代码

1.mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.easycare.dao.CommonInfoMapper">

	<select id="findPd" parameterType="pd" resultType="pd">
		select
			comment_id,
			prescription_order_id,
			customer_id,
			content,
			grade
		from
			tb_comment_info
		<where>
			comment_id=2
		</where>
	</select>
	
</mapper>

其中pd是PageData的别名

2.mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  
	"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<!-- 配置mybatis自动转换为驼峰式命名 -->
	<settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
	<!-- 别名 -->
	<typeAliases>
		<typeAlias type="com.easycare.utils.PageData" alias="pd"/>
	</typeAliases>

</configuration>

起初博主弄得时候还挺高兴,PageData+mapUnderscoreToCamelCase=无敌!!!!然而运行出来

在这里插入图片描述

查是能查询出来的,可是自动转驼峰不生效,于是博主在网上找各种各样的原因(两小时后…),我**********************************************************************************************************************

以上省略几万字请自行想像博主的心情,

总结
使用mapUnderscoreToCamelCase时一定要有又对应的实体类做映射

使用其他的工具类或者自定义对象不能成功

那里说错的或者各位小伙伴有更好的解决方法请留言博主

博主到现在还没想到好的办法

要么放弃PageData改用实体类,要么使用PageData而不做变量命名同一驼峰化

鱼与熊掌

你可能感兴趣的:(Mybatis)