1. 程式人生 > 程式設計 >mybatisplus解決駝峰命名對映問題詳解

mybatisplus解決駝峰命名對映問題詳解

問題的提出

今天我在測試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,user_type,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”了。

到此這篇關於mybatisplus解決駝峰命名對映問題詳解的文章就介紹到這了,更多相關mybatisplus 駝峰命名對映內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!