• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

MyBatis遇到的问题~

武飞扬头像
一只码农菜汪
帮助1

        今天谈一谈我在学习MyBatis框架中遇到的问题,我们先来看异常:

学新通

 学新通

         

        遇到这个问题是我把整个代码检查了一遍,发现都没有问题,最后在检查实体类时发现没有无参构造方法,只有有参构造。如果实体类里没有有参构造方法,它会有一个默认的无参构造,而当你创建了有参构造该无参构造方法必须手动创建。

实体类:

  1.  
    package com.my.entity;
  2.  
     
  3.  
    import java.util.Date;
  4.  
     
  5.  
    // 访问日志实体类
  6.  
    public class AccessLog {
  7.  
    private int id;
  8.  
    private String ip;
  9.  
    private Date accessDatetime;
  10.  
    private String accessPoint;
  11.  
     
  12.  
    //无参构造
  13.  
    // public AccessLog() {
  14.  
    // }
  15.  
     
  16.  
    //有参构造
  17.  
    public AccessLog(String ip, Date accessDatetime, String accessPoint) {
  18.  
    this.ip = ip;
  19.  
    this.accessDatetime = accessDatetime;
  20.  
    this.accessPoint = accessPoint;
  21.  
    }
  22.  
     
  23.  
    public AccessLog(String ip, String accessPoint) {
  24.  
    this.ip = ip;
  25.  
    this.accessPoint = accessPoint;
  26.  
    }
  27.  
    public int getId() {
  28.  
    return id;
  29.  
    }
  30.  
    public void setId(int id) {
  31.  
    this.id = id;
  32.  
    }
  33.  
    public String getIp() {
  34.  
    return ip;
  35.  
    }
  36.  
    public void setIp(String ip) {
  37.  
    this.ip = ip;
  38.  
    }
  39.  
    public Date getAccessDatetime() {
  40.  
    return accessDatetime;
  41.  
    }
  42.  
    public void setAccessDatetime(Date accessDatetime) {
  43.  
    this.accessDatetime = accessDatetime;
  44.  
    }
  45.  
    public String getAccessPoint() {
  46.  
    return accessPoint;
  47.  
    }
  48.  
    public void setAccessPoint(String accessPoint) {
  49.  
    this.accessPoint = accessPoint;
  50.  
    }
  51.  
    @Override
  52.  
    public String toString() {
  53.  
    return "AccessLog [id=" id ", ip=" ip ", accessDatetime=" accessDatetime ", accessPoint="
  54.  
    accessPoint "]";
  55.  
    }
  56.  
    }
学新通

       学新通

         那么为什么必须要有有参构造方法呢?这就跟MyBatis框架的底层实现有关系了。MyBatis封装了JDBC,基于反射等技术。

        在映射文件AccessLogMapper.xml,select标签的resultType属性值为实体类的完全限定名,当执行一个Mapped Statement操作时,MyBatis会根据你设置的resultType(返回值类型)通过反射创建该类型的对象,再将查询后的结果存入该对象。

大致过程如下:

  1.  
    //通过完全限定名获取该类型的Class对象
  2.  
    Class accessLogClass = Class.forName("com.my.entity.AccessLog");
  3.  
     
  4.  
    //通过无参构造创建该类对象
  5.  
    AccessLog accessLog = (AccessLog) accessLogClass.newInstance();
  6.  
     
  7.  
    //通过setXXX方法传入值
  8.  
    accessLog.setId(id);
  9.  
    accessLog.setIp(ip);
  10.  
    accessLog.setAccessDatetime(accessDatetime);
  11.  
    accessLog.setAccessPoint(accessPoint);
  12.  
     
  13.  
    //获取该类的所有构造方法
  14.  
    accessLogClass.getConstructors();
学新通

        MyBatis通过反射创建实体类对象时优先使用无参构造方法创建对象,如果实体类中没有无参构造方法,则会找有没有相应的有参构造方法。而我这个实体类中既没有无参也没有对应的有参构造,所以就会抛出异常。

加上无参构造方法后运行结果:

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgegjbb
系列文章
更多 icon
同类精品
更多 icon
继续加载