现在WEB开发经常使用 Mybatis 作为持久化框架,在开发过程中,会在Java代码中构建实体类与数据库表字段相互映射,

下面提出一个关于映射实体优化的方案:通过链式编程实现给实例对象赋值。

参考代码:

public class UserEntity{
private int userId;
private String userName;
private long lastLogin; public int getUserId() {
return userId;
} public UserEntity setUserId(int userId) {
this.userId = userId;
return this;
} public String getUserName() {
return userName;
} public UserEntity setUserName(String userName) {
this.userName = userName;
return this;
} public long getLastLogin() {
return lastLogin;
} public UserEntity setLastLogin(long lastLogin) {
this.lastLogin = lastLogin;
return this;
}
}

  

通过返回 this ,实现链式编程,但是返回 this 以后,Mybatis持久化框架给属性赋值的时候会不会出现问题,为了确认这个问题,查看了Mybatis的源码

Mybaits是通过反射给实体对象赋值的,在主要是调用的 Invoker 接口的相关实现类。

Invoker 接口定义:

public interface Invoker {
Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException; Class<?> getType();
}

在Mybatis中,通过Invoker的实现类 SetFieldInvoker 给实体赋值,通过 GetFieldInvoker 获取实体的值。

SetFieldInvoker 类定义:

public class SetFieldInvoker implements Invoker {
private Field field; public SetFieldInvoker(Field field) {
this.field = field;
} public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException {
field.set(target, args[0]);
return null;
} public Class<?> getType() {
return field.getType();
}
}

GetFieldInvoker 类定义:

public class GetFieldInvoker implements Invoker {
private Field field; public GetFieldInvoker(Field field) {
this.field = field;
} public Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException {
return field.get(target);
} public Class<?> getType() {
return field.getType();
}
}

 

二、Mybatis 异常情况

mapper.xml 定义:

<mapper namespace="xxx.xxx.xxx.UserMapper">
<sql id="user_field">
user_id,username,last_login
</sql> <resultMap id="user" type="xxx.xxx.xxx.User">
<id property="userId" column="user_id"/>
<result property="userName" column="username"/>
<result property="" column="last_login"/>
</resultMap>
<update id="updateLastLogin" parameterType="xxx.xxx.xxx.User">
UPDATE user SET last_login = #{last_login} WHERE user_id = #{user_id}
</update>
</mapper> 

 当调用updateUser方法的时候,程序报错:There is no getter for property named ''last_login" in 'class xxx.xxx.xxx.User'

报这个错的原因是因为我们在#{} 里面应该填写User的属性,而不是列名,我们将 Update语句改为以下形式就正确了:

<update id="updateLastLogin" parameterType="xxx.xxx.xxx.User">
UPDATE user SET lastLogin = #{last_login} WHERE user_id = #{userId}
</update>

  

Mybatis映射实体改造和异常问题的更多相关文章

  1. SSM实战——秒杀系统之DAO层实体定义、接口设计、mybatis映射文件编写、整合Spring与Mybatis

    一:DAO实体编码 1:首先,在src目录下,新建org.myseckill.entity包,用于存放实体类: 2:实体类设计 根据前面创建的数据库表以及映射关系,创建实体类. 表一:秒杀商品表 对应 ...

  2. Mybatis中实体类属性与数据库列表间映射方法介绍

               这篇文章主要介绍了Mybatis中实体类属性与数据列表间映射方法介绍,一共四种方法方法,供大家参考.         Mybatis不像Hibernate中那么自动化,通过@Co ...

  3. MyBatis映射文件 相关操作

    一.MyBatis映射文件 1.简介 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行 ...

  4. Mybatis映射文件完整模板参照

    Mybatis映射文件完整模板参照 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE map ...

  5. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

  6. Mybatis 使用Mybatis时实体类属性名和表中的字段名不一致

    开发中,实体类中的属性名和对应的表中的字段名不一定都是完全相同的,这样可能会导致用实体类接收返回的结果时导致查询到的结果无法映射到实体类的属性中,那么该如何解决这种字段名和实体类属性名不相同的冲突呢? ...

  7. mybatis映射文件祥解(StudentMapper.xml)

    1)以下是StudentMapper.xml文件,提倡放在与实体同目录下,文件名任意 <?xml version="1.0" encoding="UTF-8&quo ...

  8. Mybatis基础:Mybatis映射配置文件,Mybatis核心配置文件,Mybatis传统方式开发

    一.Mybatis快速入门 1.1 框架介绍 框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求! 框架:大工具,我们利用工具,可以快速开发项目 (mybatis也是一个 ...

  9. MyBatis 映射文件

    Mybatis映射文件简介 1) MyBatis 的真正强大在于它的映射语句.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉 ...

随机推荐

  1. poj1730 - Perfect Pth Powers(完全平方数)(水题)

    /* 以前做的一道水题,再做精度控制又出了错///... */ 题目大意: 求最大完全平方数,一个数b(不超过int范围),n=b^p,使得给定n,p最大: 题目给你一个数n,求p : 解题思路: 不 ...

  2. strings.xml显示html格式

    需求:合同协议,其中指定内容为红色 效果图: 实现如下: <string name="learn_ticket_agreement" formatted="fals ...

  3. CSUOJ 1007 矩形着色

    Description Danni想为屏幕上的一个矩形着色,但是她想到了一个问题.当点击鼠标以后电脑是如何判断填充的区域呢? 现在给你一个平面直角坐标系,其中有一个矩形和一个点,矩形的四条边均是平行于 ...

  4. Java内存是怎么管理的

    JAVA 内存管理总结 1. java是如何管理内存的 Java的内存管理就是对象的分配和释放问题.(两部分) 分配 :内存的分配是由程序完成的,程序员需要通过关键字new 为每个对象申请内存空间 ( ...

  5. js date 相关

  6. 【差分约束系统/DFS版SPFA】BZOJ3436-小K的农场

    [题目大意] 总共n个农场,有以下三种描述:农场a比农场b至少多种植了c个单位的作物,农场a比农场b至多多种植了c个单位的作物,农场a与农场b种植的作物数一样多.问是否有可能性. [思路] 农场a比农 ...

  7. 2017-2018-1 JAVA实验站 第六、七周作业

    2017-2018-1 JAVA实验站 第六.七周作业 详情请见团队博客

  8. 【对比分析五】CSS阻塞和JS阻塞

    js 的阻塞特性: 所有浏览器在下载 JS 的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.直到 JS 下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容.为了提高用户体验,新 ...

  9. bestcoder#23 1001 Sequence

    Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. ROS知识(9)----NodeHandle命令空间问题

    一直被NodleHandle的构造函数的命名空间搞混淆了.例如: ros::NodeHandle node_private("~/"); ros::NodeHandle node_ ...