解决mybatis一对多关联查询多条数据只显示一条的问题

一对多,如果多个表字段名相同,要记住使用别名,否则多条数据只显示一条

<resultMap type="com.example.demo.model.TuserModel" id="extendMapper">
 <id column="id" property="id" />
 <result column="user_name" property="userName" />
 <result column="nick_name" property="nickName" />
 <result column="avatar" property="avatar" />
 <result column="email" property="email" />
 <result column="signature" property="signature" />
 <result column="create_time" property="createTime" />
 <result column="update_time" property="updateTime" />
 <result column="del_flag" property="delFlag" />
 <collection property="tpluginModels" ofType="com.example.demo.model.TpluginModel"
 column="id">
 <id column="pid" property="id" />
 <result column="user_id" property="userId" />
 <result column="name" property="name" />
 <result column="icon" property="icon" />
 <result column="vsersion" property="vsersion" />
 <result column="tags" property="tags" />
 <result column="description" property="description" />
 <result column="bcreate_time" property="createTime" />
 <result column="bupdate_time" property="updateTime" />
 <result column="del_flag" property="delFlag" />
 </collection>
 <!-- <collection property="tpluginModels" column="id" ofType="com.example.demo.model.TpluginModel"
 select="pluginByUid" /> -->

下列sql

<select id="selectTuserBynameOrNick" resultMap="extendMapper"> select
 u.*,p.id as pid,p.user_id,p.name,p.icon,p.vsersion,p.tags,p.description,p.create_time
 as bcreate_time,p.update_time as bupdate_time,p.del_flag from t_user u
 LEFT
 JOIN t_plugin p ON u.id=p.user_id and u.del_flag=0 and
 p.del_flag=0 WHERE
 u.user_name LIKE CONCAT('%',#{name},'%') OR
 u.nick_name LIKE
 CONCAT('%',#{name},'%')
 </select>

补充知识:MyBatis使用resultMap解决列名和属性名不一致的问题

resultType可以指定将查询结果映射为pojo,但需要pojo的属性名和sql查询的列名一致方可映射成功。

如果sql查询字段名和pojo的属性名不一致,可以通过resultMap将字段名和属性名作一个对应关系 ,resultMap实质上还需要将查询结果映射到pojo对象中。

需求:查询订单表orders的所有数据

SELECT id,user_id,number,createtime,note FROM orders,这里的数据库表user_id与pojo的Order对象中的userId不一致

orders表:

Order对象:

OrderMapper.xml配置:

其中注释掉了另一种使用数据库别名解决列名和属性名不一致的问题

<?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.sea.crm.mapper.OrderMapper">

 <!-- 使用as 给列取别名解决类名和属性名不一致的情况 -->
 <!--<select id="queryAll" resultType="Order"> SELECT id,user_id as userId,number,createtime,note
 FROM orders </select> -->
 <!-- 使用resultMap解决列名和属性名不一致的情况 -->
 <!-- 配置一个resultMap映射列和属性 -->
 <resultMap type="Order" id="orderMap">
 <!-- id:设置ResultMap的id -->
 <!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
 <!-- property:主键在pojo中的属性名 -->
 <!-- column:主键在数据库中的列名 -->
 <id column="id" property="id" />
 <!-- 映射其他普通列 -->
 <result column="user_id" property="userId" />
 <result property="number" column="number" />
 <result property="createtime" column="createtime" />
</resultMap>
 <!-- 方法的返回值可以使用 -->
 <select id="queryAll" resultMap="orderMap">
 SELECT id,user_id ,number,createtime,note FROM orders
 </select>
</mapper>

单元测试:

public class OrderMapperTest {

 SqlSessionFactory factory = null;
 private OrderMapper orderMapper = null;

 @Before
 public void testInit() {
  // 1. 创建SqlSessionFactoryBuilder对象
  SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
  // 2. 加载SqlMapConfig.xml配置文件
  // /20181013_mybatis/config/SqlMapConfig.xml
  InputStream in = MyBatisTest.class.getResourceAsStream("/SqlMapConfig.xml");
  // 3. 创建SqlSessionFactory对象
  factory = builder.build(in);

 }
    @Test
 public void testqueryAll() {
  SqlSession session = factory.openSession();
  OrderMapper orderMapper = session.getMapper(OrderMapper.class);
  List<Order> orders = orderMapper.queryAll();
  System.out.println(orders);
 }
 }

以上这篇解决mybatis一对多关联查询多条数据只显示一条的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • mybatis的使用-Mapper文件各种语法介绍

    一.查询 mybatis自定义查询条件,queryString.queryMap.limit,Mapper文件写法如下: <select id="getByQueryParam" parameterType="com.systom.base.BaseDaoQueryParam" resultMap="BaseResultMap"> SELECT * FROM user WHERE 1 = 1 <if test="par

  • MyBatisPlus 一对多、多对一、多对多的完美解决方案

    在学习MyBatisPlus 时,简单的查询非常简单,只需继承了相关类,就能够进行增删改.但是在实际运用时,对象之间的关系非常复杂,一对多.多对一.多对多.网上查询了大量i资料都无法解决此问题. 难道要把所有的用Mybatis的重写一次? 重写一次Plus的方法还能不能用? 实在没办只能查看官网https://mp.baomidou.com/guide/在注解处找到了可能的解决方案 @TableName注解可以设置对应的resultMap 看到这里我想是不是,在Mapper中设置好resultM

  • mybatis一对多两种mapper写法实例

    mybatis一对多两种mapper写法 第一种 <resultMap type="com.example.demo.model.TuserModel" id="extendMapper"> <id column="id" property="id" /> <result column="user_name" property="userName" />

  • mybatis 多表关联mapper文件写法操作

    两张表SystemParam(系统参数表) Suit (主题) SystemParam 与 Suit 是多对一 Suit 的higerSuit字段是Suit 的父及主题id 是多对一,需要自连接查询,因为重名所以父表sql字段加别名 mapper方法 Systemparam selectJoinSuit(String strparamcode); Po类 public class Systemparam { //ManyToOne "主题" private Suit suitobj;

  • 解决mybatis一对多关联查询多条数据只显示一条的问题

    一对多,如果多个表字段名相同,要记住使用别名,否则多条数据只显示一条 <resultMap type="com.example.demo.model.TuserModel" id="extendMapper"> <id column="id" property="id" /> <result column="user_name" property="userName&

  • mybatis如何使用注解实现一对多关联查询

    mybatis 注解实现一对多关联查询 @Select("select id,mockexam_section as section,id as sectionId" + " from t_p_qb_mockexam_section" + " where mockexam_charpter_id = #{charpterId} and is_delete = 0" + " order by mockexam_section_idx as

  • mysql一对多关联查询分页错误问题的解决方法

    xml问价中查询数据中包含list,需要使用collection <resultMap id="XX" type="com.XXX.XXXX"> <id column="o_id" jdbcType="BIGINT" property="id" /> <result column="o_user_id" jdbcType="BIGINT"

  • Mybatis使用@one和@Many实现一对一及一对多关联查询

    目录 一.准备工作 1.创建springboot项目,项目结构如下 2.添加pom.xml配置信息 3.配置相关信息 二.使用@One注解实现一对一关联查询 三.使用@Many注解实现一对多关联查询 四.FetchType.LAZY 和 FetchType.EAGER的区别 一.准备工作 1.创建springboot项目,项目结构如下 2.添加pom.xml配置信息 <dependencies> <dependency> <groupId>org.mybatis<

  • MyBatis一对多嵌套查询的完整实例

    前言 嵌套查询的实现原理为两次查询,比如产品表为主表,图片表为从表通过product_id字段与产品表id字段关联实现一对多,嵌套查询 首先查询 主表的数据 然后将主表id字段赋值给从表实体类中product_id 字段(productId)然后通过dao接口路径映射找到对应的MyBatis XMl文件SQL语句ID如:com.liao.dao.DImgMapper.selectDImgByProductId 进行子查询也就是第二次查询.然后返回数据 数据库建表语句和测试数据如下: 数据库版本为

  • Mybatis表的关联查询详情

    目录 导语 什么时候用<resultMap>标签映射 什么时候用<association>&<collection> Mybatis表的关联查询 一对多查询 多对一查询 一对一查询 多对多查询 导语 关于<resultMap>标签映射,<association>&<collection>的使用 什么时候用<resultMap>标签映射 1.当我们查询结果的返回值是由对象封装的且对象中封装了另一个对象时,用标

  • MyBatis 三表外关联查询的实现(用户、角色、权限)

    一.数据库结构 二.查询所有数据记录(SQL语句) SQL语句: SELECT u.*, r.*, a.* FROM ( ( ( user u INNER JOIN user_role ur ON ur.user_id = u.user_id ) INNER JOIN role r ON r.role_id = ur.role_id ) INNER JOIN role_authority ra ON ra.role_id = r.role_id ) INNER JOIN authority a

  • 详解mybatis多对一关联查询的方式

    根据ID查询学生信息,要求该学生的教师和班级信息一并查出 第一种关联方式 1.修改实体类Student,追加关联属性,用于封装关联的数据 修改完以后重新生成get set方法还有toString方法 private Teacher teacher; private Classes classes; 2.修改TeacherMapper相关配置 1.接口类 增加 Teacher selectTeacherById(Integer tid); 2.xml映射文件 增加 <sql id="para

  • ScrollView中嵌入ListView只显示一条的解决办法

    通常情况下我们不会在ScrollView中嵌套ListView,但是如果面试官非让我嵌套的话也是可以的. 在ScrollView添加一个ListView会导致listview控件显示不全,通常只会显示一条,究竟是什么原因呢? 两个控件的滚动事件冲突导致.所以需要通过listview中的item数量去计算listview的显示高度,从而使其完整展示,如下提供一个方法供大家参考. 解决办法如下所示: lv = (ListView) findViewById(R.id.lv); adapter = n

  • JS数组去掉重复数据只保留一条的实现代码

    非常不多说,js数组去掉重复数据的代码如下所示: var arr = [1,2,3,4,5,6,1,6,7,2]; var newArr = []; for(var i =0;i<arr.length-1;i++){ if(newArr.indexOf(arr[i]) == -1){ newArr.push(arr[i]); } } 下面再给大家分享高效率去掉js数组中重复项 Array类型并没有提供去重复的方法,如果要把数组的重复元素干掉,那得自己想办法: function unique(ar

随机推荐