基于mybatis查询结果映射不到对象的处理

目录
  • mybatis查询结果映射不到对象
    • 项目场景:
    • 问题描述:
    • 原因分析:
    • 解决方案:
  • mybatis结果映射遇到的问题
    • 错误如下:
    • 解决:

mybatis查询结果映射不到对象

项目场景:

使用mybatis+springboot 进行数据库的数据查询操作,一直拿不到返回结果。

问题描述:

后端dao层(service层调mapper,方法的返回结果一直null)代码一直空指针,

APP 中接收数据代码:

 //分类名称
        Integer blogCategoryId = blog.getBlogCategoryId();//这里有数据  22
        BlogCategory category = blogCategoryMapper.getCategoryById(blogCategoryId);//这里返回结果就一直null
        blog.setBlogCategoryName(category.getCategoryName());//导致这里一调用方法就报空指针了。

原因分析:

仔细检查了代码(debug),controller层+ service层没问题,那问题坑定再dao层。检查xml文件,但发现xml文件中查询方法的sql代码写的没问题:

 <select id="getCategoryById" parameterType="java.lang.Integer" resultType="com.hhh.blog.entity.BlogCategory">
        SELECT
            category_id,
            category_name,
            category_icon,
            category_rank,
            create_time,
            is_deleted
        FROM
            tb_blog_category
        WHERE
            category_id = #{blogCategoryId}
    </select>

这里理论上没啥问题,但特么的就是数据库的数据映射不到对象中(实体类都是按照数据库数据对应的,只多不少)。

解决方案:

resultType=“com.hhh.blog.entity.BlogCategory”

返回结果改成使用映射:

<select id="getBlogCategoryPage" resultMap="getBlogCategoryPageMap">

  <resultMap id="getBlogCategoryPageMap" type="com.hhh.blog.entity.BlogCategory">
        <id column="category_id" jdbcType="INTEGER" property="categoryId" />
        <result column="category_name" jdbcType="VARCHAR" property="categoryName" />
        <result column="category_icon" jdbcType="VARCHAR" property="categoryIcon" />
        <result column="category_rank" jdbcType="INTEGER" property="categoryRank" />
        <result column="is_deleted" jdbcType="TINYINT" property="isDeleted" />
        <result column="create_time" jdbcType="DATE" property="createTime" />
    </resultMap>

开启驼峰式命名匹配也可能解决上述问题。没试过。建议自己搞起来

mybatis结果映射遇到的问题

错误如下:

org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.apache.ibatis.executor.ExecutorException: No constructor found in POJO.User matching [java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String]
### The error may exist in Mapper/UserMapper
### The error may involve test.selectUserById
### The error occurred while handling results
### SQL: SELECT * FROM USER WHERE id=?
### Cause: org.apache.ibatis.executor.ExecutorException: No constructor found in POJO.User matching [java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String]

解决:

最后,将User构造器中int改为Integer即可、

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis某些字段无法映射成功的解决

    随笔记录下: 刚刚遇到一个mybatis中reultMap定义正确column与property也都正确,字段的getset方法也都有,但是返回对象时,有些字段可以对应上有一些则不可以. 找了好久才发现在sql语句中的 resultMap 写成了 resultType... 很low但是痛.改成resultMap一切正常! 补充知识:MyBatis学习总结--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况

  • mybatis 解决从列名到属性名的自动映射失败问题

    问题背景 从数据库中取出数据映射到实体类时,实体类中只有部分属性映射成功,其余属性值皆为null. 问题描述 如下图AreaDao.xml文件中描述了queryArea()方法从数据库获取Area对象的各个属性值的查询过程,最后执行查询结果显示只有属性priority被成功地赋值 AreaDao.xml <select id="queryArea" resultType="com.imooc.wechatpro.model.Area"> SELECT a

  • Mybatis实体类和表映射问题(推荐)

    本文是小编给大家带来的mybatis中实体类和表映射问题的知识,学习本教程能够快速帮助我们解决字段名与实体类属性名不相同的冲突问题,需要的朋友一起看看吧! 一.准备演示需要使用的表和数据 CREATE TABLE orders( order_id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(20), order_price FLOAT ); INSERT INTO orders(order_no, order_price) VALUES('a

  • 解决mybatis映射结果集失效的问题

    在开发中可能会遇到这样的问题,使用mybatis进行结果集与实体类之间的关系映射时,可能会出现某些属性映射不上去的情况. 为了方便排查问题我们需要查看mybatis访问数据库SQL信息. 可以在配置Log4J: log4j.logger.com.xxx.dao=TRACE log4j.logger.com.ibatis.common.jdbc.SimpleDataSource = DEBUG log4j.logger.com.ibatis.common.jdbc.ScriptRunner = D

  • Mybatis有查询结果但存不进实体类的解决方案

    问题描述 使用Mybatis查询得到实体类 表定义如下 成员ID 成员姓名 member_id member_name 对应的实体类如下 public class Member { private Integer memberId; private String memberName; // 省略getter和setter } 对应的Mapper.xml如下 <select id="selectMemberByMemberName" resultType="Member

  • 基于mybatis查询结果映射不到对象的处理

    目录 mybatis查询结果映射不到对象 项目场景: 问题描述: 原因分析: 解决方案: mybatis结果映射遇到的问题 错误如下: 解决: mybatis查询结果映射不到对象 项目场景: 使用mybatis+springboot 进行数据库的数据查询操作,一直拿不到返回结果. 问题描述: 后端dao层(service层调mapper,方法的返回结果一直null)代码一直空指针, APP 中接收数据代码: //分类名称 Integer blogCategoryId = blog.getBlog

  • 基于mybatis高级映射多对多查询的实现

    1.同以前一样,首先给一个使用多对多的需求, 要查询用户以及用户所购买的商品信息,经过分析用户和商品数据库级别没有任何关系,用户和商品需要建立关系,要通过订单,订单明细建立关系.根据这个需求,可以分析出需要查询的主表为: 查询主表:用户表 查询关联表:由于商品和用户没有关系,通过订单和订单明细进行关联,所以得出关联表是:orders订单表,orderDetail订单明细表,items商品表.这样的话,sql该如何去写?这样写: select orders.*, t_user.id user_id

  • 基于Mybatis Plus实现多表分页查询的示例代码

    注意:Mybatis Plus 3.0.7 版本才开始用[自定义sql]+[QueryWrapper],低版本不能使用,还是老实写SQL进行条件拼接 1.源码分析 在Wrapper<T>接口中就有如下方法 /** * 获取自定义SQL 简化自定义XML复杂情况 * 使用方法:自定义sql + ${ew.customSqlSegment} * 1.逻辑删除需要自己拼接条件 (之前自定义也同样) * 2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦) * 3.用法 ${e

  • 基于mybatis 动态SQL查询总结

    背景 ××项目需要提供系统部分函数第三方调用接口,基于安全性和避免暴露数据库表信息的基础上进行函数接口的设计,根据第三方调用身份的权限提供某张表的自定义集合. 本项目基于mybatis的持久层框架,支持定制化的SQL,这样可以避免拼接sql语句的痛苦. 例如拼接时要确保不能添加空格,还要注意去掉列表的最后一个列名的都逗号. 基于OGNL的表达式的mybatis框架可以彻底解决这种痛苦. 动态返回mysql某张表指定列的名字,类型和注释 <select id="queryColumns&qu

  • Mybatis查询语句返回对象和泛型集合的操作

    Mybatis查询语句返回对象和泛型集合 EmpMapper映射接口: package cn.et.mybatis.lesson03; import java.util.List; import org.apache.ibatis.annotations.Result; import org.apache.ibatis.annotations.Results; import org.apache.ibatis.annotations.Select; public interface EmpMap

  • 基于Mybatis映射的一点心得(分享)

    以前一直使用Hibernate,基本上没用过Mybatis,工作中需要做映射关系,简单的了解下Mybatis的映射. 两者相差不多都支持一对一,一对多,多对多,本章简单介绍一对一的使用以及注意点. 建表语句: CREATE TABLE `bloc` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) collate utf8_bin default NULL, `company_id` int(11) default NULL,

  • 基于MyBatis XML配置方法(全面了解)

    MyBatis 的配置文件包含了影响 MyBatis 行为甚深的设置(settings)和属性(properties)信息. 文档的顶层结构如下: configuration 配置 properties 属性 settings 设置 typeAliases 类型命名 typeHandlers 类型处理器 objectFactory 对象工厂 plugins 插件 environments 环境 environment 环境变量 transactionManager 事务管理器 dataSourc

  • 基于MyBatis的简单使用(推荐)

    MyBatis MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录. 搭建MyBatis 第一步:先创建一个项目,平常的Java project就行,项目结构先看看 第二步:导入相关的jar包(可

  • MyBatis查询缓存实例详解

    查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存 一.一级查询缓存 MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession.在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将

  • MyBatis查询结果resultType返回值类型的说明

    一.返回一般数据类型 比如要根据 id 属性获得数据库中的某个字段值. mapper 接口: // 根据 id 获得数据库中的 username 字段的值 String getEmpNameById(Integer id); SQL 映射文件: <!-- 指定 resultType 返回值类型时 String 类型的, string 在这里是一个别名,代表的是 java.lang.String 对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap' 基本数

随机推荐