转载

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

记:之前我们规定 编写实体类的时候, 属性和数据库列名 必须保持 一致。

思考:二开、业务变化等等的时候,此时数据库中的列名和实体类的属性名就是不一致,怎么解决?

实体类属性和数据库列名不一致,如下图所示:

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

演示 属性和数据库列名 不一情况下,数据库 改 操作

提示:这里只演示改操作。

记:在修改配置文件 IUserDao.xml 后,增删改操作基本可以满足开发需要。

------

新建实体类:UserV2.java

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

代码如下:

------

public class UserV2 {

    private int userId;

    private String userName;

    private Date userBirthday;

    private String userSex;

    private String userAddress;
    ...

------

接口:IUserDao.java,新增 updateUserV2 方法

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

代码如下:

-------

/**
* 用户修改v2
* @param userv2
*/
void updateUserV2(UserV2 userv2);

-------

配置文件: IUserDao.xml ,代码如下:

-------

<!--更新用户操作V2-->

<update id="updateUser" parameterType="com.abc2.domain.UserV2">

UPDATE USER SET /`username/`=#{userName},/`address/`=#{userAddress},/`sex/`=#{userSex},/`birthday/`=#{userBirthday} WHERE id=#{userId};

</update>

测试文件,代码如下:

@Test

public void updateUserV2Test() {

UserV2 user = new UserV2();

user.setUserId(70);

user.setUsername("小明");

user.setUserAddress("外星球-月球22");

user.setUserSex("女");

user.setUserBirthday(new Date());

//更新用户

userDao.updateUserV2(user);

//执行提交

sqlSession.commit();

}

结果如下,修改成功!

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

总结:

一般来说,增删改的方法,就算实体属性和数据库列名不一致,通过配置后,也可以正常运行。

但是,在查询的时候,如果不一致,就会出异常!

演示 属性和数据库列名 不一情况下,数据库 查 操作

查询的时候,列名无法对齐,导致数据出现异常。

接口:IUserDao.java

/**
 * 查询所有数据V2
 * @return
**/
List<UserV2> findAllV2();

配置文件:IUserDao.xml

<!--配置查询所有 指定id,resultType结果集类型 -->
<select id="findAllV2" resultType="com.abc2.domain.UserV2">
select /* from user
</select>

测试类:Test

@Test
public void findAllV2Test() {
    List<UserV2> allV2 = userDao.findAllV2();
    System.out.println("-------");
    for (UserV2 item : allV2) {
    System.out.println(item);
    }
    System.out.println("-------");
}

运行结果,如下图所示:

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

提示:mysql数据库在windows系统下不区分大小写。如果是linux系统下,是严格区分大小写的。

解决方案:

  • 设置查询别名(了解);
  • 配置 查询结果的列名和实体类的属性名的对应关系(推荐使用!理由:这个resultMap可以复用,修改起来也方便);

修改配置文件:IUserDao.xml

<!--配置:查询结果的列名和实体类的属性名对应关系-->

<resultMap id="userMap2" type="com.abc2.domain.UserV2"/>

<!--主键字段的对应-->

<id property="userId" column="id"></id>

<!--非主键字段对应-->

<result property="userName" column="username"></result>

<result property="userBirthday" column="birthday"></result>

<result property="userSex" column="sex"></result>

<result property="userAddress" column="address"></result>

</resultMap>

  

<!--配置查询所有 指定id,resultType结果集类型 -->

<select id="findAllV2" resultMap/="userMap2">

<!-- 使用查询别名-了解即可! -->

<!-- select id as userId,username as userName,birthday as userBirthday,sex as userSex,address as userAddress from user;-->

select /* from user;

</select>

测试类:Test

@Test

public void findAllV2Test() {

List<UserV2> allV2 = userDao.findAllV2();

System.out.println("-------");

for (UserV2 item : allV2) {

System.out.println(item);

}

System.out.println("-------");

}

查询结果如下:

MyBatis解决在开发过程中实体类属性和数据库列名不一致的问题

欢迎大家来评论!

原文  https://segmentfault.com/a/1190000022026878
正文到此结束
Loading...