目录
问题的提出
今天我在测试mybatis的时候,发现查询出来的一些字段为null,而且这些字段都是驼峰命名了的。所以我首先就想到了是数据库表字段和类映射出了问题。
解决办法
一、理解spring-mybatis.xml中关于驼峰命名的配置
mybatisplus是mybatis的升级版,所以配置还是有点儿差别,如果是mybatis的话,直接在configuration中配置就行了,如下:
<?xml version=\"1.0\" encoding=\"UTF-8\"?> <!DOCTYPE configuration PUBLIC \"-//mybatis.org//DTD Config 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-config.dtd\"> <configuration> <settings> <!--开启驼峰命名--> <setting name=\"mapUnderscoreToCamelCase\" value=\"true\" /> <setting name=\"cacheEnabled\" value=\"false\"/> <setting name=\"lazyLoadingEnabled\" value=\"false\"/> <setting name=\"aggressiveLazyLoading\" value=\"true\"/> <setting name=\"logImpl\" value=\"LOG4J2\"/> </settings> </configuration>
但是mybatisplus的驼峰命名配置是在MP全局配置中完成的
废话不说,直接上代码
<!-- MP 全局配置 --> <bean id=\"globalConfig\" class=\"com.baomidou.mybatisplus.entity.GlobalConfiguration\"> <!-- 全局的主键策略 --> <property name=\"idType\" value=\"0\"/> <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name=\"dbColumnUnderline\" value=\"true\"/> </bean>
二、在xml代码中正确的映射类和表
1、使用resultType直接映射到实体类
直接上代码:
<resultMap id=\"userVoResultMap\" type=\"com.ranqing.model.vo.UserVo\"> <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/> <result column=\"login_name\" property=\"loginName\" jdbcType=\"VARCHAR\"/> <result column=\"name\" property=\"name\" jdbcType=\"VARCHAR\"/> <result column=\"password\" property=\"password\" jdbcType=\"VARCHAR\"/> <result column=\"sex\" property=\"sex\" jdbcType=\"TINYINT\"/> <result column=\"age\" property=\"age\" jdbcType=\"TINYINT\"/> <result column=\"user_type\" property=\"userType\" jdbcType=\"TINYINT\"/> <result column=\"status\" property=\"status\" jdbcType=\"TINYINT\"/> <result column=\"organization_id\" property=\"organizationId\" jdbcType=\"INTEGER\"/> <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/> <result column=\"phone\" property=\"phone\" jdbcType=\"VARCHAR\"/> <result column=\"organizationName\" property=\"organizationName\" jdbcType=\"VARCHAR\"/> <collection property=\"rolesList\" ofType=\"Role\"> <id column=\"roleId\" property=\"id\"/> <result column=\"roleName\" property=\"name\"/> </collection> </resultMap> <!-- 通用查询结果列--> <sql id=\"Base_Column_List\"> id, login_name AS loginName, name, password, salt, sex, age, phone, user_type AS userType, status, organization_id AS organizationId, create_time AS createTime </sql> <!--验证用户登录--> <select id=\"selectUserByLoginNameAndPwd\" resultType=\"com.ranqing.model.vo.UserVo\"> SELECT <include refid=\"Base_Column_List\"/> from user where login_name=#{loginName} and password=#{password} </select>
注意:
1、凡是需要驼峰的字段都要用“as”取别名,然后直接resultType到UserVo上
2、这种方法不用驼峰命名也没关系,
<!-- MP 全局配置 --> <bean id=\"globalConfig\" class=\"com.baomidou.mybatisplus.entity.GlobalConfiguration\"> <!-- 全局的主键策略 --> <property name=\"idType\" value=\"0\"/> <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name=\"dbColumnUnderline\" value=\"false\"/> </bean>
dbColumnUnderline为true或false都可以
2、使用驼峰命名映射
先上代码:
<resultMap id=\"userVoResultMap\" type=\"com.ranqing.model.vo.UserVo\"> <id column=\"id\" property=\"id\" jdbcType=\"BIGINT\"/> <result column=\"login_name\" property=\"loginName\" jdbcType=\"VARCHAR\"/> <result column=\"name\" property=\"name\" jdbcType=\"VARCHAR\"/> <result column=\"password\" property=\"password\" jdbcType=\"VARCHAR\"/> <result column=\"sex\" property=\"sex\" jdbcType=\"TINYINT\"/> <result column=\"age\" property=\"age\" jdbcType=\"TINYINT\"/> <result column=\"user_type\" property=\"userType\" jdbcType=\"TINYINT\"/> <result column=\"status\" property=\"status\" jdbcType=\"TINYINT\"/> <result column=\"organization_id\" property=\"organizationId\" jdbcType=\"INTEGER\"/> <result column=\"create_time\" property=\"createTime\" jdbcType=\"TIMESTAMP\"/> <result column=\"phone\" property=\"phone\" jdbcType=\"VARCHAR\"/> <result column=\"organizationName\" property=\"organizationName\" jdbcType=\"VARCHAR\"/> <collection property=\"rolesList\" ofType=\"Role\"> <id column=\"roleId\" property=\"id\"/> <result column=\"roleName\" property=\"name\"/> </collection> </resultMap> <!-- 通用查询结果列--> <sql id=\"Base_Column_List\"> id, login_name , name, password, salt, sex, age, phone, user_type , status, organization_id , create_time </sql> <!--验证用户登录--> <select id=\"selectUserByLoginNameAndPwd\" resultMap=\"userVoResultMap\"> SELECT <include refid=\"Base_Column_List\"/> from user where login_name=#{loginName} and password=#{password} </select>
注意:
1、这种方法是使用了驼峰命名了的,所有一定要在MP中设置驼峰命名
<!-- MP 全局配置 --> <bean id=\"globalConfig\" class=\"com.baomidou.mybatisplus.entity.GlobalConfiguration\"> <!-- 全局的主键策略 --> <property name=\"idType\" value=\"0\"/> <!--映射数据库下划线字段名到数据库实体类的驼峰命名的映射--> <property name=\"dbColumnUnderline\" value=\"true\"/> </bean>
dbColumnUnderline必须为true
2、既然使用了驼峰命名,就自然不能再数据库字段上用“as”了。
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。