解决实体类属性与表字段名不一致的问题

如果实体类属性与表字段名不一致时,会出现对象为null,如何处理?

有三种解决方法:

准备工作:

项目工程如下:

1.引用依赖

<!--配置junit依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>

    <!--配置servlet依赖 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.0</version>
      <scope>provided</scope>
    </dependency>

    <!--  配置数据库依赖 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>

    <!-- 配置mybatis依赖 -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>

2.创建数据库表

#创建地域表
CREATE TABLE CH_REGION (
  ID BIGINT(10) NOT NULL AUTO_INCREMENT,	#ID号
  PARENT_ID BIGINT(10) DEFAULT NULL,			#父级ID号
  REGION_ID BIGINT(10) DEFAULT NULL,			#地域编号
  REGION_PARENT_ID BIGINT(10) DEFAULT NULL,	#地域父级编号
  REGION_NAME VARCHAR(100) DEFAULT NULL,		#地域名称
  REGION_TYPE INT(11) DEFAULT NULL COMMENT '1省 2市 3区',	#地域类型
  PRIMARY KEY (ID)
) ENGINE=INNODB AUTO_INCREMENT=11186 DEFAULT CHARSET=utf8 COMMENT='地区信息表';

3.创建实体类

package com.liuYongQi.MyBatisTest2.pojo;

import java.io.Serializable;

/**
 * @ClassName: Region
 * @Description: TODO 地域表实体类
 * @Author: Administrator
 * @CreateDate: 2018/10/8 10:05
 * @UpdateUser: Administrator
 * @UpdateDate: 2018/10/8 10:05
 * @UpdateRemark: 修改内容
 * @Version: 1.0
 */

public class Region implements Serializable {
    private Integer id;                 //ID号
    private Integer parentId;           //父级ID号
    private Integer regionId;           //地域编号
    private Integer regionParentId;     //地域父级编号
    private String regionName;          //地域名称
    private Integer regionType;         //地域类型

    public Region(Integer id, Integer parentId, Integer regionId, Integer regionParentId, String regionName, Integer regionType) {
        this.id = id;
        this.parentId = parentId;
        this.regionId = regionId;
        this.regionParentId = regionParentId;
        this.regionName = regionName;
        this.regionType = regionType;
    }

    public Region(Integer parentId, Integer regionId, Integer regionParentId, String regionName, Integer regionType) {
        this.parentId = parentId;
        this.regionId = regionId;
        this.regionParentId = regionParentId;
        this.regionName = regionName;
        this.regionType = regionType;
    }

    public Region() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getParentId() {
        return parentId;
    }

    public void setParentId(Integer parentId) {
        this.parentId = parentId;
    }

    public Integer getRegionId() {
        return regionId;
    }

    public void setRegionId(Integer regionId) {
        this.regionId = regionId;
    }

    public Integer getRegionParentId() {
        return regionParentId;
    }

    public void setRegionParentId(Integer regionParentId) {
        this.regionParentId = regionParentId;
    }

    public String getRegionName() {
        return regionName;
    }

    public void setRegionName(String regionName) {
        this.regionName = regionName;
    }

    public Integer getRegionType() {
        return regionType;
    }

    public void setRegionType(Integer regionType) {
        this.regionType = regionType;
    }

    @Override
    public String toString() {
        return "Region{" +
                "id=" + id +
                ", parentId=" + parentId +
                ", regionId=" + regionId +
                ", regionParentId=" + regionParentId +
                ", regionName='" + regionName + '\'' +
                ", regionType=" + regionType +
                '}';
    }
}

 4.创建地域表实体类接口

package com.liuYongQi.MyBatisTest2.dao;

import com.liuYongQi.MyBatisTest2.pojo.Region;

/**
 * @ClassName: IRegionDao
 * @Description: TODO 地域表实体类接口
 * @Author: Administrator
 * @CreateDate: 2018/10/8 10:10
 * @UpdateUser: Administrator
 * @UpdateDate: 2018/10/8 10:10
 * @UpdateRemark: 修改内容
 * @Version: 1.0
 */
public interface IRegionDao {
    /**
     * @Author Administrator
     * @Description //TODO 根据地域名称查询地域对象信息
     * @Date 10:16 2018/10/8
     * @Param [regionName]
     * @return com.liuYongQi.MyBatisTest2.pojo.Region
     * @exception
     */
    public Region selectRegionByRegionName(String regionName);
}

5.创建MyBatisConfig.xml

<?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="logImpl" value="STDOUT_LOGGING"></setting>

        <!--解决数据库和实体类属性名字不一致-->
        <setting name="mapUnderscoreToCamelCase" value="true"></setting>
        
    </settings>

    <!--1. 配置数据库环境,默认使用development数据库构建环境-->
    <environments default="development">
        <!--配置环境变量-->
        <environment id="development">
            <!--配置事务管理器类别-->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置数据源-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"></property>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/db_a?useUnicode=true&amp;characterEncoding=UTF-8"></property>
                <property name="username" value="root"></property>
                <property name="password" value="root"></property>
            </dataSource>
        </environment>
    </environments>

    <!--2. 加载映射器:实体类对象/关系映射文件-->
    <mappers>
        <mapper resource="com/liuYongQi/MyBatisTest2/mapper/RegionMapper.xml"></mapper>
    </mappers>

</configuration>

6.创建映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--接口注册-->
<mapper namespace="com.liuYongQi.MyBatisTest2.dao.IRegionDao">

    <select id="selectRegionByRegionName" parameterType="String" resultType="com.liuYongQi.MyBatisTest2.pojo.Region">
        select * from ch_region where REGION_NAME=#{regionName}
    </select>
    


</mapper>

7.创建测试类

package com.liuYongQi.MyBatisTest2.test;

import com.liuYongQi.MyBatisTest2.dao.IRegionDao;
import com.liuYongQi.MyBatisTest2.pojo.Region;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;


public class TestCRUD {
    //获得SqlSession对象,通过SqlSession操作CRUD
    private SqlSession sqlSession;
    private IRegionDao iregionDao;
    @Before
    public void before(){
        //读取配置文件,获取SQLSessionFactory
        try {
            //通过Resources类加载核心配置文件,得到文件的输入流
            InputStream inputStream = Resources.getResourceAsStream("MyBatisConfig.xml");
            //创建会话工厂,编译配置文件流,sqlSessionFactory
            SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            //通过sqlSessionFactory得到sqlSession象
            sqlSession = sqlSessionFactory.openSession();
            //通过sqlSession获得映射实例类的父接口
            iregionDao = sqlSession.getMapper(IRegionDao.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @After
    public void after(){
        sqlSession.commit();
    }

    @Test
    public void selectRegionByRegionName(){
        Region region = iregionDao.selectRegionByRegionName("湖南省");
        System.out.println(region);
    }
    

















}

结果为:

解决方案如下:

方法一:在SQL语句中为列名取别名(与属性名一致)

<select id="selectRegionByRegionName" parameterType="String" resultType="com.liuYongQi.MyBatisTest2.pojo.Region">
    select id as id,PARENT_ID as parentId,REGION_ID as regionId,REGION_PARENT_ID as regionParentId,
    REGION_NAME as regionName,REGION_TYPE as regionType from ch_region where REGION_NAME=#{regionName}
</select>
<!--不用在意大小写,MyBatis会先转换成大写再进行匹配-->

方法二:resultMap指定映射关系,MyBatis也能自动完成映射

<select id="selectRegionByRegionName" parameterType="String" resultMap="selectRegionByRegionNameMapper">
    select * from ch_region where REGION_NAME=#{regionName}
</select>

<resultMap id="selectRegionByRegionNameMapper" type="com.liuYongQi.MyBatisTest2.pojo.Region">
    <id property="id" column="id"></id>
    <result property="parentId" column="parent_id"></result>
    <result property="regionId" column="region_id"></result>
    <result property="regionParentId" column="region_parent_id"></result>
    <result property="regionName" column="region_name"></result>
    <result property="regionType" column="region_type"></result>
</resultMap>

方法三:设置全局属性(推荐)

通常情况下,Java中的实体类属性采用骆峰命名,而数据库中表的字段则用下划线区分字母。在这种情况下MyBatis提供了一个全局属性mapUnderscoreToCamelCase来解决两者名字不一致的问题。

在mybatisConfig.xml中配置:

<settings>
    <setting name=”mapUnderscoreToCamelCase” value=”true”>
</settings>

三种方案结果都为:

今天的测试就到这里了,谢谢大家的支持!

如果大家想浏览我的下一篇文章,请留言

版权声明:此文章属于原创,不准随意转载:https://blog.csdn.net/LYQ2332826438

猜你喜欢

转载自blog.csdn.net/LYQ2332826438/article/details/82982385