mybatis查询结果返回至实体类的示例代码

近期,利用mybatis做一个简单查询,先看主要代码

Service层:

package com.example1.service;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example1.dao.OrderMapper;
import com.example1.pojo.Order;

@Service
public class OrderService {

 private Logger log = Logger.getLogger(OrderService.class);

 @Autowired
 private OrderMapper orderMapper;

 public void findOrders() {
 List<Order> orders = orderMapper.findOrders();
 for (Order order : orders) {
  log.info(order.getId() + " : " + order.getName());
 }
 }
}

dao层:

package com.example1.dao;
import java.util.List;
import com.example1.pojo.Order;
public interface OrderMapper {
 public List<Order> findOrders();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example1.dao.OrderMapper">

 <select id="findOrders" parameterType="String" resultType="java.util.Map">
 SELECT * FROM t_order
 </select>
</mapper>

Order类:

package com.example1.pojo;

public class Order {

 private String id;
 private String name;
 public String getId() {
 return id;
 }
 public void setId(String id) {
 this.id = id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 @Override
 public String toString() {
 return "Order [id=" + id + ", name=" + name + "]";
 }
}

配置妥当,执行,结果报错了:

java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example1.pojo.Order   at com.example1.service.OrderService.findOrders(OrderService.java:26)   at com.example1.service.OrderService$$FastClassBySpringCGLIB$$b6b2c61a.invoke(<generated>)   at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)   at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717)   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)   at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)   at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)   at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653)   at com.example1.service.OrderService$$EnhancerBySpringCGLIB$$e285c4bb.findOrders(<generated>)   at com.example1.controller.OrderController.findOrders(OrderController.java:22)   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   at java.lang.reflect.Method.invoke(Method.java:498)   at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)   at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)   at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100)   at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:604)   at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:565)   at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)   at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)   at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)   at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)   at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)   at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)   at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:879)   at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:617)   at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1778)   at java.lang.Thread.run(Thread.java:745)

可以看出,java.util.HashMap不能直接存储到具体的实体类。

解决办法:

一、dao层通过resultType指定返回类型

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example1.dao.OrderMapper">

 <select id="findOrders" parameterType="String" resultType="com.example1.pojo.Order">
 SELECT * FROM t_order
 </select>
</mapper>

二、查询结果返回list,然后遍历list,将map转换成相应的java对象

修改后的Service层:

package com.example1.service;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example1.dao.OrderMapper;
import com.example1.pojo.Order;

@Service
public class OrderService {

 private Logger log = Logger.getLogger(OrderService.class);

 @Autowired
 private OrderMapper orderMapper;

 public void findOrders() {
 List<Map> orders = orderMapper.findOrders();
 for (Map orderMap : orders) {
  String orderJsonStr = JSONObject.toJSONString(orderMap);
  Order order = (Order) JSONArray.parseObject(orderJsonStr,Order.class);
  log.info(order.getId() + " : " + order.getName());
 }
 }
}

dao层:

package com.example1.dao;

import java.util.List;
import java.util.Map;

public interface OrderMapper {

 public List<Map> findOrders();
}

其中,关于map转java对象的方法有好多种,具体可以参考本人另一篇文章

https://www.jb51.net/article/190478.htm

以上两种方法均实际测试通过。到此这篇关于mybatis查询结果返回至实体类的示例代码的文章就介绍到这了,更多相关mybatis结果返回实体类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间:2020-07-10

解决mybatis使用char类型字段查询oracle数据库时结果返回null问题

同事在学mybatis时,遇到了一个问题就是,使用char类型字段作为查询条件时一直都查不出数据,其他类型的则可以. 使用的数据库是oracle,查询条件字段类型是char(50),java代码对应的是String类型. 后来经过排查,是由于在oracle中,char类型字段,如果内容长度不够,会自动以空格方式补足长度.如字段 name char(5),若值为sgl,那么oracle会自动用空格补足长度,最终值为sgl. 一.解决方法: 方法1:先用trim()函数把值去掉两边空格再作为条件查询

mybatis中查询结果为空时不同返回类型对应返回值问题

今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同类型,查询结果为空时dao接口的返回值是一样的吗?接下来我就总结一下常见的几种情况. 第一种:resultType为基本类型,如string(在此暂且把string归纳为基本类型) 如果select的结果为空,则dao接口返回结果为null 第二种,resultType为基本类型,如int 后台报异

MyBatis查询返回Map示例代码

前言 有时候我们做查询, 只需要返回两个string类型的字段,方便我们后续的处理.比如根据商品的code查询对应的分类的名字,需要返回一个map, key为商品code, value为商品分类对应的名称.以方便我们后续对结果集的处理.如果你直接用mybatis返回一个map, 你可能会发现,结果根据不是自己需要的.这时候我们需要自己实现一个ResultHandler来实现我们想要的结果,废话不多说,直接上代码 方法如下 第一步,在mapper.xml文件当中,定义一个ResultMap <re

Mybatis查不到数据查询返回Null问题

mybatis突然查不到数据,查询返回的都是Null,但是 select count(*) from xxx查询数量,返回却是正常的. Preparing: SELECT id,a9004,a9005,a9015 FROM a90 where a9010 = ? ORDER BY id LIMIT 1 [DEBUG] org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:139):http-bio-8080

解决mybatis执行SQL语句部分参数返回NULL问题

mybatis查询结果返回至实体类的示例代码

今天在写代码的时候发现一个问题:mybatis执行sql语句的时候返回bean的部分属性为null,在数据库中执行该sql语句能够正常返回,把相关代码反反复复翻了个遍,甚至都重启eclipse了,依旧没解决问题,后来网上搜了一下,还真有类似的问题. 闲话少说,直接说问题,该sql语句是自己写的,resultType直接用了该bean全名称,最终导致部分属性显示为null, 原来的写法: <select id="selectByArticle" parametertype=&quo

利用Spring MVC+Mybatis实现Mysql分页数据查询的过程详解

mybatis查询结果返回至实体类的示例代码

前言 因为最近没什么事,所以想着写一个分页的例子出来给大家分享一下.这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是将分页Pager作为一个实体对象放到domain层,当前页.单页数据量.当前页开始数.当前页结束数.总数据条数.总页数都作为成员属性放到实体类里面. 以前项目数据库用的是oracle,sql语句的写法会从当前页开始数到当前页结束数查询数据.刚刚在这纠结了很长时间,查询到的数据显示数量总是有偏差,后来

MyBatis insert操作插入数据之后返回插入记录的id

MyBatis插入数据的时候,返回该记录的id <insert id="insert" keyProperty="id" useGeneratedKeys="true" parameterType="com.demo.domain.CountRateConfig"> insert into query_rate_config (code,partner_type,search_count, booking_co

浅谈laravel数据库查询返回的数据形式

版本:laravel5.4+ 问题描述:laravel数据库查询返回的数据不是单纯的数组形式,而是数组与类似stdClass Object这种对象的结合体,即使在查询构造器中调用了toArray(),也无法转换成单纯的数组形式. 问题解析: (以上图片来源于laravel学院5.3版本到5.4版本的升级手册) 如上图所示:Laravel不再支持在配置文件中定制PDO的"fetch mode",取而代之,总是使用PDO::FETCH_OBJ,如果你仍然想要为应用定制fetch模式,需要监

ajax判断后端返回的数据是否为null的方法

1.后端返回: return null; 2.ajax需要判断: if(null != jsonStr && "" != jsonStr){ 具体代码: $.ajax( { type: "POST", data: { name: name, code: code }, dataType: "json", url: "info", success: function(jsonStr) { if(null != j

MongoDB数据查询方法干货篇

本文主要给大家介绍了MongoDB数据查询的相关内容,对大家具有一定的参考价值,需要的朋友们一起来学习学习吧. 导入测试数据 在开始之前我们应该先准备数据方便演示,这里我插入的了几条数据,数据如下: db.user.insertMany( [{ name:’jack’, age:22, sex:’Man’, tags:[‘python’,’c++’,’c’], grades:[22,33,44,55], school:{ name:’shida’, city:’xuzhou’ } },{ nam

thinkPHP数据查询常用方法总结【select,find,getField,query】

本文实例讲述了thinkPHP数据查询常用方法.分享给大家供大家参考,具体如下: thinkphp已经封装好了常用的查询方法,且都比较实用,对于不常用的查询框架也保留了原始查询方法query. $Model = new Model() // 实例化一个model对象 没有对应任何数据表 $Model->query("select * from think_user where status=1"); 如果刚学Thinkphp对框架不太了解可以用query($sql) 和 exec

mybatis实现读取树结构数据实例代码

mybatis实现读取树结构数据详细介绍如下所示: 表结构 CREATE TABLE `lscrm_function_privilege` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘编号’, `create_id` varchar(30) NOT NULL DEFAULT ‘sys’, `update_id` varchar(30) NOT NULL DEFAULT ‘sys’, `create_time` timestam

原文 

https://www.zhangshengrong.com/p/24NjoPRyXB/

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » mybatis查询结果返回至实体类的示例代码

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址