精华内容
下载资源
问答
  • mybatis一对多查询方法详解! mybatis一对多查询方法详解! mybatis一对多查询方法详解! mybatis一对多查询方法详解!
  • mybatis一对多查询功能

    2020-08-31 09:33:15
    主要介绍了mybatis一对多查询功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • 场景:现有两张表 s_class(班级表) s_student(学生表) ...方法二:mybatis提供一对多查询,一次查询解决 对比:方法二明显比方法一更合适,更符合需求,更方便操作 实际操作: 创...

    场景:现有两张表

    s_class(班级表)

    s_student(学生表) 

    需求:查询出班级和班级下的学生 

    分析:首先班级和学生是一对多的关系,一个班级对应多个学生

    实现方法:

    方法一:通过查出班级,再查出班级对应学生的数据,组装数据返回

    方法二:mybatis提供一对多的查询,一次查询解决

    对比:方法二明显比方法一更合适,更符合需求,更方便操作

    实际操作: 

    创建实体类

    班级学生实体类-StudentClass.java

    public class StudentClass {
    
        private Integer id;     //主键id
    
        private String className;   //班级
    
        private String gradeName;   //年级
    
        private List<Student> studentList;  //学生集合
    
        //此处省略了get,set方法,*实际操作一定要加上*
    }

    学生实体类-Student.java

    public class Student {
    
        private Integer id;     //主键id
    
        private String name;    //姓名
    
        private String sex;     //性别
    
        private Integer age;    //年龄
    
        //此处省略了get,set方法 *实际操作一定要加上*
    }

     

    创建mapper.xml文件

    班级学生xml文件-StudentClassMapper.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.heliu.dao.mybatis.StudentClassDao">
    
        <!--一对多查询关联-->
        <resultMap id="getStudentClassMap" type="com.heliu.entity.test.StudentClass">
            <!-- 实体类属性对应数据库的主键字段,不然主键会查不到 -->
            <id property="id" column="id"/>
            <result property="className" column="class_name"/>
            <result property="gradeName" column="grade_name"/>
            <!-- 用collection标签 ,也是实体类属性要对应数据库字段-->
            <collection property="studentList" column="id" select="com.heliu.dao.mybatis.StudentDao.queryStudentList"/>
        </resultMap>
    
        <select id="queryClass" resultMap="getStudentClassMap">
            SELECT id,class_name,grade_name
            FROM s_class
        </select>
    </mapper>

    学生xml文件-StudentMapper.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.heliu.dao.mybatis.StudentDao">
    
        <resultMap id="getStudentMap" type="com.heliu.entity.test.Student">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sex" column="sex"/>
            <result property="age" column="age"/>
        </resultMap>
    
        <select id="queryStudentList" parameterType="java.lang.Integer" resultMap="getStudentMap">
            SELECT 	id,name,sex, age
            FROM s_student WHERE class_id = #{value}
        </select>
    </mapper>

     

    模拟前端请求数据

     班级学生dao层-StudentClassDao.java

    public interface StudentClassDao {
        
        //一对多查询方法
        List<StudentClass> queryClass();
    }

    学生dao层-StudentDao.java

    public interface StudentDao {
        
        //用于一对多时查询学生
        List<Student> queryStudentList(Integer classId);
    }

     

    数据结果: 

    {"code":0,"data":[{"id":1,"className":"一班","gradeName":"高三","studentList":[{"id":1,"name":"何老板","sex":"男","age":18},{"id":5,"name":"龙","sex":"男","age":20},{"id":6,"name":"花花","sex":"女","age":19}]},{"id":2,"className":"二班","gradeName":"高三","studentList":[{"id":4,"name":"Tony","sex":"男","age":18}]},{"id":3,"className":"三班","gradeName":"高三","studentList":[{"id":2,"name":"小红","sex":"女","age":19},{"id":3,"name":"Bob","sex":"男","age":17}]}],"success":true}

    可以用在线json工具看一下:https://www.json.cn/

    需要进行条件查询只需要稍微改一下

    List<StudentClass> queryClass(Object object);    //方法里面传入需要条件查询的参数
        
    //班级学生xml文件改一下
    
     <!--一对多查询关联-->
        <resultMap id="getStudentClassMap" type="com.heliu.entity.test.StudentClass">
            <!-- 实体类属性对应数据库的主键字段,不然主键会查不到 -->
            <id property="id" column="id"/>
            <result property="className" column="class_name"/>
            <result property="gradeName" column="grade_name"/>
            <!-- 用collection标签 ,也是实体类属性要对应数据库字段-->
            <collection property="studentList" column="{id=id,object=object}"  select="com.heliu.dao.mybatis.StudentDao.queryStudentList"/>  //这个地方column里的id一定要传
        </resultMap>
    
        <select id="queryClass" parameterType="object" resultMap="getStudentClassMap">
            SELECT id,class_name,grade_name,
            case when ('${object}' != '') then '${object}' else '' end as object
            FROM s_class
        </select>
    
    List<Student> queryStudentList(Map<String,Object> map);    //方法参数改成Map接受
    
    //学生xml文件改一下
    
     <resultMap id="getStudentMap" type="com.heliu.entity.test.Student">
            <id property="id" column="id"/>
            <result property="name" column="name"/>
            <result property="sex" column="sex"/>
            <result property="age" column="age"/>
        </resultMap>
    
        <select id="queryStudentList" parameterType="java.util.Map"  resultMap="getStudentMap">     //这里传入的参数类型是Map类型的
            SELECT 	id,name,sex, age
            FROM s_student WHERE class_id = #{id} AND name=#{object}
        </select>
    
    
    

     

    展开全文
  • mybatis一对多查询案例

    千次阅读 2020-09-26 10:44:10
    mybatis一对多查询案例 (1)关联查询的中的一对多是指,站在用户的角度看,一个用户会存在多个订单跟他对应。 (2)数据来自两个表,使用连接查询,需要输出每一个用户有多少个订单 (3)查询结果使用collection...

    mybatis一对多查询案例

    • (1)关联查询的中的一对多是指,站在用户的角度看,一个用户会存在多个订单跟他对应。
    • (2)数据来自两个表,使用连接查询,需要输出每一个用户有多少个订单
    • (3)查询结果使用collection标签 映射List<元素>

    这边用一个用户可以下多个订单为案例进行业务代码的编写(这边mybatis环境的配置文件就省略了,只上传了关键的业务代码)

    数据库表:

    user表

    在这里插入图片描述

    order表:

    在这里插入图片描述

    编写测试UserTest

    package com.lbl.order;
    
    import com.lbl.bean.User;
    import com.lbl.dao.UserDao;
    import com.lbl.utils.MySessionUtils;
    import org.apache.ibatis.session.SqlSession;
    import org.junit.Test;
    
    import java.util.List;
    
    public class UserTest {
        @Test
        public void test01() {
            SqlSession sqlSession = MySessionUtils.getSession();
            UserDao dao = sqlSession.getMapper(UserDao.class);
            List<User> list = dao.findUserOrder();
    
            System.out.println(list);
            sqlSession.commit();
            sqlSession.close();
        }
    }
    
    

    User

    package com.lbl.bean;
    
    import java.util.Date;
    import java.util.List;
    
    public class User {
        private int id;
        private String username;
        private Date birthday;
        private int sex;
        private String address;
    
        List<Order> orders;
    
        public User() {
        }
    
        public User(int id, String username, Date birthday, int sex, String address, List<Order> orders) {
            this.id = id;
            this.username = username;
            this.birthday = birthday;
            this.sex = sex;
            this.address = address;
            this.orders = orders;
        }
    
        public User(String username, Date birthday, int sex, String address, List<Order> orders) {
            this.username = username;
            this.birthday = birthday;
            this.sex = sex;
            this.address = address;
            this.orders = orders;
        }
    
        public List<Order> getOrders() {
            return orders;
        }
    
        public void setOrders(List<Order> orders) {
            this.orders = orders;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public Date getBirthday() {
            return birthday;
        }
    
        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    
        public int getSex() {
            return sex;
        }
    
        public void setSex(int sex) {
            this.sex = sex;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", birthday=" + birthday +
                    ", sex=" + sex +
                    ", address='" + address + '\'' +
                    ", orders=" + orders +
                    '}';
        }
    }
    
    

    userDao

    package com.lbl.dao;
    
    import com.lbl.bean.User;
    
    import java.util.List;
    
    public interface UserDao {
         List<User> findUserOrder();
    
    }
    
    

    UserMapper.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">
    
    <!--该配置文件用来写sql-->
    <!-- namespace:命名空间,用于隔离sql
       当我们有多个UserMapper.xml时,为了区分不同的文件,则需要指定namespace,这个值必须唯一
    -->
    <mapper namespace="com.lbl.dao.UserDao">
    
        <!-- 根据id来查询用户 -->
        <!-- id:statement的id 或者叫做sql的id,后期可以用作方法名-->
        <!-- parameterType:声明输入参数的类型 ,这个参数可以省略-->
        <!-- resultType:声明输出结果的类型,应该填写pojo的全路径 -->
        <!-- #{}:输入参数的占位符,相当于jdbc的? ,如果传入的是基本类型,则{}里边的内容可以随便写 -->
    
    	<resultMap id="UserOrder" type="user" autoMapping="true">
    		<id column="uid" property="id"></id>
    		<collection property="orders" ofType="order" autoMapping="true">
    			<id column="oid" property="id"></id>
    		</collection>
    	</resultMap>
    
        <select id="findUserOrder" resultMap="UserOrder">
    	SELECT
    	`user`.id AS uid,
    	`user`.username,
    	`user`.birthday,
    	`user`.sex,
    	`user`.address,
    	`order`.id AS oid,
    	`order`.user_id,
    	`order`.number,
    	`order`.createtime,
    	`order`.note
    FROM
    	`user`
    	LEFT JOIN
    	`order`
    	ON
    		`user`.id = `order`.user_id
    	</select>
    
    </mapper>
    

    运行效果:

    在这里插入图片描述

    展开全文
  • 问题:在写mybatis一对多的时候用到了Pagehelper进行分页,然后发现确实能分页,但是展示的条数不对,后来研究了发现原来Pagehelper插件在一对多查询的时候默认的是对多的一方进行的分页,不是一的一方。 解决:目前...

    问题:在写mybatis一对多的时候用到了Pagehelper进行分页,然后发现确实能分页,但是展示的条数不对,后来研究了发现原来Pagehelper插件在一对多查询的时候默认的是对多的一方进行的分页,不是一的一方。

    解决:目前我的解决方式是用子查询,这样能够达到我想要的效果,不过会出现N+1次查询,但是我目前没有找到更好的解决方法,有的朋友可以评论分享一下。

    <?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.lmj.order.mapper.OrderMainMapper">
        <resultMap id="BaseResultMap" type="com.lmj.order.pojo.OrderMain">
            <id column="id" property="id" jdbcType="BIGINT"/>
            <result column="uid" property="uid" jdbcType="BIGINT"/>
            <result column="del_flag" property="delFlag" jdbcType="TINYINT"/>
            <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
            <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
    
            <collection property="orderMainOrders" javaType="list"
                        ofType="com.lmj.order.pojo.OrderMainOrder" select="getOrderMainOrder"
                        column="{orderMainId=id}"> 
                <result property="id" column="oId" jdbcType="BIGINT"/>
                <result property="orderMainId" column="order_main_id" jdbcType="BIGINT"/>
                <result property="orderId" column="order_id" jdbcType="BIGINT"/>
            </collection>
        </resultMap>
    
        <select id="getOrderMain" resultMap="BaseResultMap">
            SELECT * from order_main a  WHERE a.del_flag = 0 and a.uid = #{uid}
        </select>
    
        <select id="getOrderMainOrder" parameterType="map"
                resultType="map">
            select b.id as oId,b.order_main_id,b.order_id
            from order_main_order b
            where b.order_main_id = #{orderMainId}
        </select>
    </mapper>
    

    order_main表是一的一方,order_main_order是多的一方,然后我把多的一方作为子查询,对一的一方进行分页,就发现分页条数正确了。

    这里要注意的就是几个点是否对应:
    在这里插入图片描述
    首先是查询方法名称一致。

    在这里插入图片描述
    然后就是使他们相关联的条件,order_main_order表中的orderMainId是order_main表中的id。这个样子就是使他们关联起来了。其实就是一个子查询。

    展开全文
  • 主要介绍了mybatis 一对一、一对多和多对多查询的实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • mybatis一对多查询返回

    千次阅读 2019-06-20 19:32:52
    mybatis一对多查询返回定义实体类Mapper.xml文件Mapper.java文件 定义实体类 InventoryVO 和InventoryDetailVO是一对多的关系。 @Data public class InventoryVO { /**收发 1: 收 0:发**/ private String inOrOut...

    定义实体类

    InventoryVO 和InventoryDetailVO是一对多的关系。

    @Data
    public class InventoryVO {
        /**收发 1: 收 0:发**/
        private String inOrOut;
        /**发生日期**/
        private String occTime;
        private Long storeId;
        private Long customerId;
        private String customerName;
    
        /**仓库名称**/
        private String warehouseName;
        /**业务类型**/
        private String accountTypeName;
        /**业务类型**/
        private int accountType;
        /** wms单号**/
        private String wmsBillNo;
        /**货主单号**/
        private String cusBillNo;
    
        private List<InventoryDetailVO> listDetails;
    }
    
    @Data
    public class InventoryDetailVO {
        /** 行号**/
        private Integer lineNo;
        /** 货物编码**/
        private String itemSkuCode;
        /** 货物名称**/
        private String itemName;
        /** 包装数量**/
        private Integer packageCount;
        /** 单位名称**/
        private String unitName;
        private Long skuId;
        private String categoryName;
    }
    

    Mapper.xml文件

    定义一个resullMap,返回类型是type:InventoryVO

    <resultMap id="BaseResultMap2" type="com.wms.InventoryVO">
            <result column="inOrOut" property="inOrOut"/>
            <result column="occTime" property="occTime"/>
            <result column="storeId" property="storeId"/>
            <result column="warehouseName" property="warehouseName"/>
            <result column="accountType" property="accountType"/>
            <result column="wmsBillNo" property="wmsBillNo"/>
            <result column="cusBillNo" property="cusBillNo"/>
            <collection property="listDetails" ofType="com.wms.vo.InventoryDetailVO">
                <result column="lineNo" property="lineNo"/>
                <result column="itemSkuCode" property="itemSkuCode"/>
                <result column="itemName" property="itemName"/>
                <result column="skuId" property="skuId"/>
                <result column="packageCount" property="packageCount"/>
                <result column="unitName" property="unitName"/>
            </collection>
        </resultMap>
    
    <select id="statisticsDetails" resultMap="BaseResultMap2">
            SELECT
              wlog.create_time AS occTime,
              temp.`store_id` AS storeId,
              temp.`account_type` AS accountType,
              temp.`account_id` AS wmsBillNo,
              temp.`account_id` AS cusBillNo,
              temp.type as inOrOut,
              wlog.`sku_id` AS skuId,
              wlog.`change_count_total` AS packageCount
            FROM
              (SELECT
                customer_id, store_id,account_id, account_type,  type
                FROM  warehouse_inventory_log l
              GROUP BY customer_id, store_id,account_id, account_type,  type) temp
              INNER JOIN warehouse_inventory_log wlog
                ON temp.account_id = wlog.`account_id`
                AND temp.account_type = wlog.`account_type`
            <where>
                <if test="storeId != null">
                    temp.`store_id` = #{storeId}
                </if>
                <if test="skuIdList != null">
                    and sku_id in
                    <foreach collection="skuIdList" open="(" separator="," close=")" item="item">
                        #{item}
                    </foreach>
                </if>
                <if test="customerId != null">
                    and customer_id = #{customerId}
                </if>
                <if test="startTime != null">
                    and create_time >= #{startTime}
                </if>
                <if test="endTime != null">
                    and create_time <![CDATA[<=]]> #{endTime}
                </if>
                <if test="type != null">
                    and temp.type = #{type}
                </if>
            </where>
    
        </select>
    

    Mapper.java文件

    List<InventoryVO> statisticsDetails(WarehouseInventoryLogDTO warehouseInventoryLogDTO);
    
    @Data
    public class WarehouseInventoryLogDTO  extends Pager {
        private Long customerId;
        private String skuName;
        private String startTime;
        private String endTime;
        private List<Long> skuIdList;
        private Long storeId;
        private Integer type;
    }
    
    展开全文
  • PageHelper关于Mybatis一对多查询返回Total错误 遇到的问题: pagehelper进行一对多查询时,返回的总数量对不上,例如需求是一个页面展示10个spu信息,实际上只展示了6个spu,其分页的依据是根据sku,6个spu中包含了...
  • mybatis一对多查询内层排序问题

    千次阅读 2020-05-14 18:56:31
    --根据板块id查询所有主题->指标->维度--> <resultMap id="TitleDimensionMap" type="com.etouch.admincenter.bean.ZhmdDiagnosisTitleBean"> <id column="title_id" property="id"/> <...
  • mybatis 一对多性能优化 demo mybatis 一对多性能优化 demo
  • 一对多查询的时候,一条信息对应有多条数据,我们用集合来存储多的一方的数据。使用resultMap标签来定义封装的格式,今天在做测试时,出现集合内只封装到一条数据。 原因: 后面查阅资料得知,是因为两张表都有id...
  • 如题,配置的一对多查询,只返回了一条数据。 原因在于两张表有名称相同的字段,如下图所示: 解决方案:将其中一个重复字段取一个别名,如下图,问题解决:
  • select classs.* , user.id 'userid' ,user.age 'age', user.name 'name',...MyBatis 表联合查询,两张表中字段重复时,在配置文件中,sql语句联合查询时使用字段别名,resultMap中对应的column属性使用相应的别名
  • mybatis一对多查询的两种方式

    千次阅读 2018-08-24 14:26:03
    package com.itheima.mybatis.pojo; import java.io.Serializable; import java.util.Date; public class Orders implements Serializable{ @Override public String toString() { retur...
  • 主要介绍了Mybatis 一对多和多对一关联查询问题,需要的朋友可以参考下
  • springboot + mybatis 一对多查询 + 懒加载 直接上图 父表 子表 parent相关代码 entity public class ParentMessage implements Serializable { private Integer id; private String valu...
  • 对于一对多查询,网上书上的例子大多都是传入一个条件的,比如有两个表,一个用户表,一个手机表,一个用户可以有多个手机,我们就可以在用户的实体类 中放一个手机的list,用一对多查询,就可以查询一个用户的所有...
  • 实现Mybatis框架中一对多关联映射的查询操作。 User用户表 - Order_form订单表属于 1-N 的关系。 一个用户对象包含一批订单信息
  • 使用MyBatis写的一对多关联映射查询的web,在eclipse上写的,使用的Mysql进行数据连接,内含数据库脚本,直接导入数据库即可建数据库和建表,不用再编写,非常方便
  • 、整合mybatis 1、建表phone_type DROP TABLE IF EXISTS `phone_type`; CREATE TABLE `phone_type` ( `type_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类型id', `number_part` varchar(50) DEFAULT NULL ...
  • 今天使用mybatis一对多的时候,多的一方只查询出来了一条数据,研究好久才发现问题所在。 出错原因: 我是因为两张表的id字段名称相同造成的,这样子会让后面一条数据覆盖前面一条数据。 问题解决: 修改id字段名,...
  • MyBatis 一对多嵌套查询

    千次阅读 2021-01-15 13:49:51
    图片表为从表通过product_id字段与产品表id字段关联实现一对多,嵌套查询查询两次 首先查询 主表的数据 然后将主表id字段赋值给从表实体类中product_id 字段(productId)然后通过dao接口路径映射找到对应的MyBatis ...
  • NULL 博文链接:https://qihaibo1989.iteye.com/blog/2354597
  • mybatis一对多关联查询两种方式

    万次阅读 2018-12-24 00:01:06
    mybatis一对多关联查询两种方式前提:方式一:方式二: 前提: 现在有两张表,学生表跟教师表,一个教师对应多个学生 教师表: CREATE TABLE `teacher` ( `id` int(11) PRIMARY KEY, `name` varchar(20) , `age` ...
  • 就是代码而已《哈哈哈》
  • Mybatis一对多查询中,新手很容易出现Expected one result (or null) to be returned by selectOne(), but found: 3的问题。如下图: 这个报错大致意思是期望的返回结果为1个,但是实际返回结果为3个。出现这个...
  • MyBatis实现一对一,一对多关联查询

    万次阅读 多人点赞 2019-09-25 00:20:31
    MyBatis如何实现一对一,一对多查询的? 可以通过关联查询实现。关联查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成 具体实现如下 准备...
  • mybatis注解一对多查询

    千次阅读 2019-07-13 16:20:57
    官网例子http://www.mybatis.cn/archives/424.html @Results的基本用法。当数据库字段名与实体类对应的属性名不一致时,可以使用@Results映射来将其对应起来。...@Many 一对多 @One 一对一 public interf...
  • Mybatis 关联查询(一对一与一对多

    万次阅读 2019-08-18 19:55:11
    数据库表与表之间的关系: 1、一对一查询 ...如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。 sql语句: SELECT o.id, o.user_id userId, o.number, o.cre...
  • mybatis递归 一对多的实现方法示例

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,434
精华内容 68,573
关键字:

mybatis一对多查询