Mybatis映射实体改造和异常问题

现在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>

  

时间: 2024-08-04 09:50:52

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

MyBatis映射实体类插件 MyBatis Generator

MyBatis Generator大大简化了MyBatis的数据库的代码编写,有了一个配置文件,就可以直接根据表映射成实体类.Dao类和xml映射. 资源地址: MyBatis项目地址:http://mybatis.github.io/ MyBatis中文使用文档:http://mybatis.github.io/mybatis-3/zh/index.html MyBatis Generator使用文档:http://mybatis.github.io/generator/index.html

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

           这篇文章主要介绍了Mybatis中实体类属性与数据列表间映射方法介绍,一共四种方法方法,供大家参考.         Mybatis不像Hibernate中那么自动化,通过@Column注解或者直接使用实体类的属性名作为数据列名,而是需要自己指定实体类属性和数据表中列名之间的映射关系,这一点让用惯了Hibernate的人很不习惯,所幸经过探索找到了建立映射关系的几种办法,其中总也有比较简单的. 首先定义一个实体类User,如下: public class User { pr

MyBatis映射器总结

Mybatis映射器xml配置包含如下标签: select 查询语句,自定义参数返回结果集 insert 插入语句 update 更新语句 delete 删除语句 parameterMap 定义参数映射关系,不建议使用 sql 定义一段SQL,可以再其他部分引用 resultMap 结果集,提供映射规则 cache 给定命名空间的缓存配置 cache-ref 其他命名空间缓存配置的引用 1.select 1.1 select标签包含如下属性: 属性 说明 备注 id 它和Mybatis的命名空间

6.Mybatis 映射文件标签详解

编写的测试代码在下面,没有jar包(上传的大小限制啦) 1.1     Mybatis映射文件(核心) 1.1.1 输入映射 1.1.1.1  ParameterType 指定输入参数的java类型,可以使用别名或者类的全限定名.它可以接收简单类型.POJO.HashMap. 1.1.1.1.1      传递简单类型 参考需求:根据用户ID查询用户信息. 1.1.1.1.2      传递POJO对象 1.1.1.1.2.1     需求 根据用户性别和用户名称来查询用户信息 1.1.1.1.

MyBatis 映射教程

认识MyBatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .2013年11月迁移到Github.iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架.iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO) mybatis图册 简介 前面说过了简单的数据库

如何在mybatis映射文件里面使用java方法

在mybatis的映射xml文件调用java类的方法: 1. SELECT * FROM EC_CORE_USER WHERE (user_name=#{userName} or mail =#{userName} or mobile_phone = '${@[email protected](userName)}') and  user_password=#{userPassword} 入上面代码所示.此处应注意,方法必须为静态方法. 2.获取类里面的常量: r.czmc='${@[email

权限模块_整体方案说明_设计实体&amp;映射实体_实现初始化权限数据的功能

权限模块_整体方案说明 要点说明 权限就是控制功能的使用(功能对应着URL). 对功能的控制就是对URL的访问控制. 在我们的程序中,一个功能对应一个或两个URL: 1,例如列表或删除功能,只对应一个URL. 2,例如添加或修改功能,对应两个URL:..add, ..addUI 权限模型 权限方案: 用户 *----* 角色 *----* 权限 与权限相关的功能具体有哪些: 初始化数据:... 分配权限:... 使用权限:... 具体有哪些功能 初始化数据(安装) 权限数据. 超级管理员. 分配

Mybatis映射配置文件&lt;select&gt;的学习

resultMap的使用 当查询的表的列名与实体类的属性名不同时,有三种方式来处理: 1.使用SQL的别名 如:select user_name userName from user 2.如果符合驼峰命名,在setting中开启mapUnderscoreToCamelCase 3.设置resultMap,自定义结果集映射规则,不能和resultType同时使用 例: Type指定映射实体类 <resultMap id="BaseResultMap" type="com.

20180601_Eclipse自动生成mybatis映射文件

Eclipse自动生成mybatis映射文件 1.安装MyBatis Generator插件 打开Eclipse,找到Help--Eclipse Marketplace. 搜索MyBatis Generator,Install安装即可. 2.新建generatorConfig.xml文件,填写配置信息 generatorConfig.xml 1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE g