首页 > 其他分享 >mybatis自定义参数

mybatis自定义参数

时间:2022-08-20 13:00:22浏览次数:59  
标签:自定义 did 查询 参数 emp 设置 mybatis 属性 加载

首先我们先定义两个表t_emp / t_dept

由于我们的pojo中,使用了驼峰命名法,而数据表中使用的是下划线命名法

解决字段名和属性名不一致

为字段起别名,保持与属性名一致

select 列名 as 别名 from 表名

List<Emp> getAllEmpAs();
 <select id="getAllEmpAs" parameterType="Emp">
        select eid, emp_name as empName, age, sex, email from t_emp
    </select>

通过全局配置settings-mapUnderscoreToCamelCase

将下划线自动映射为驼峰

mybatis-config.xml

<settings>
        <!--**将下划线自动映射为驼峰**-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

使用resultMap

设置自定义映射关系,只在查询功能中使用

  • type属性,设置要对什么实体类进行处理

  • id属性,设置你resultMap的唯一标识

  • id标签设置主键的属性

  • result设置普通键的属性

  • association处理多对一的关系

  • collection处理一对多的关系

  • property设置属性名,必须是type属性设置的实体类属性名

  • column设置字段名,必须是sql语句查询出的字段名

List<Emp> getAllEmpResultMap();
   <resultMap id="empResultMap" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>
    </resultMap>
​
<select id="getAllEmpResultMap" resultMap="empResultMap">
        select eid, emp_name, age, sex, email from t_emp
    </select>

多对一的映射

这里就是说,多个员工在同一个部门里,查询员工对应所对应的部门信息

首先我们先设置emp+dept的mapper方法

Emp getEmpByIdLeftOutter(@Param("eid")Integer eid);
    <select id="getEmpByIdLeftOutter" resultMap="empAndDeptResultMap">
        selet *
        from t_emp as e
        left outter join t_dept as d
        on e.did = d.did
        where e.eid = #{eid}
    </select>

一条sql语句

级联属性赋值(用的少)
   <resultMap id="empAndDeptResultMap" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>         <result property="dept.did" column="did"/>
        <result property="dept.deptName" column="dept_name"/>
    </resultMap>
使用association标签
  • association:处理多对一的映射关系

    • property:需要处理的属性名

    • javaType:该属性的类型

    • select:设置分布查询的sql唯一标识(namespace.SQLid / 或mapper接口的全类名.方法名)

    • column:设置分布查询的条件

    <resultMap id="empAndDeptResultMap" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>     	  
        <association property="dept" javaType="Dept">
            <id property="did" column="did"/>
            <result property="deptName" column="dept_name"/>
         </association>
    </resultMap>

accoiation+多条sql语句分布查询(用的多)

 

第0步:打开setting设置下划线转驼峰命名
   <settings>
        <!--**将下划线自动映射为驼峰**-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
第一步:查询查询员工信息

association:处理多对一的映射关系

  • property:需要处理的属性名

  • javaType:在该属性的实体类名

  • select:设置分布查询的sql唯一标识(namespace.SQLid 或 mapper接口的全类名.方法名)

  • column:设置分布查询的条件

Emp getEmpByIdByStep(@Param("eid")Integer eid);
    <resultMap id="empAndDeptResultMapByStep" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>
        <association property="dept"
                     select="com.atguigu.mybatis.mappers.DeptMapper.getDeptById" column="did">
        </association>
    </resultMap>

    <select id="getEmpByIdByStep" resultMap="empAndDeptResultMapByStep">
        select *
        from t_user
        where id = #{eid}
    </select>
第二步:通过did查询员工所对应的部门
Dept getDeptById(@Param("did")Integer did);
   <select id="getDeptById" resultMap="Dept">
        selet *
        from t_dept
        where id = #{did}
    </select>

延迟加载

如果设置了延迟加载,分布查询只想执行第一步就只能触发第一步,如果想一二步一起执行,就触发执行两步,实现按需加载,获取的数据是什么,就只会执行相应的sql

分布查询可以实现延迟加载,但是必须在核心配置文件中设置全局配置信息(settings)

  • lazyLoadingEnabled:延迟加载的全局开关。当开启时,所有关联对象(分布查询的第 2 / 3 / n 步)都会延迟加载

  • aggressiveLazyLoading:按需加载,当开启时,任何方法的调用都会加载该对象的所有属性。否则,** **

  • 如果开启了延时加载,那么全局都开启了延时加载association的fetchType属性,"lazy / eager"设置延迟 / 立即加载。如果没开启延迟加载,那么这个属性无论设置什么,都是立即加载

mybatis-config.xml

   <!--全局配置-->
    <settings>
        <!--**将下划线自动映射为驼峰**-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--延迟加载全局开关-->
        <setting name="lazyLodingEnabled" value="true"/>
        <!--开启按需加载-->
        <setting name="aggressiveLazyLoading" value="true"/>
    </settings>

EmpMapper.xml

 <resultMap id="empAndDeptResultMapByStep" type="Emp">
        <id property="eid" column="eid"/>
        <result property="empName" column="emp_name"/>
        <result property="age" column="age"/>
        <result property="sex" column="sex"/>
        <result property="email" column="email"/>
        <association property="dept"
                     select="com.atguigu.mybatis.mappers.DeptMapper.getDeptById"
                     column="did"
                     fetchType="lazy">
        </association>
    </resultMap>

一对多映射

使用 (一).集合<多> 实现一对多

private List<Emp> emps;

collection

使用collection主要就是处理一对多的关系,也就是处理一个集合的关系

  • property:集合的名字

  • ofType:该属性所对应的集合中存储数据的类型

  • select:设置分布查询的sql唯一标识(namespace.SQLid 或 mapper接口的全类名.方法名)

  • column:设置分布查询的条件

  • fetchType:"lazy / eager"设置延迟 / 立即加载。如果没开启延迟加载,那么这个属性无论设置什么,都是立即加载

一步查询

(0)DeptMapper.xml.collection

这里emp不用设置它的dept属性,否则无限循环查询

    <resultMap id="DeptAndEmps" type="dept">
        <id property="did" column="did" />
        <result property="deptName" column="dept_name" />
        <collection property="emps" ofType="Emp">
            <id property="eid" column="eid"/>
            <result property="empName" column="emp_name"/>
            <result property="age" column="age"/>
            <result property="sex" column="sex"/>
            <result property="email" column="email"/>
        </collection>
    </resultMap>
(1)DeptMapper
Dept getDeptAndEmpsById(@Param("did")Integer did)
  <select id="getDeptAndEmpsById" resultMap="DeptAndEmps">
        select * 
        from t_dept as d 
        left outter join t_emp as e
        on d.did = e.did
        where d.did = #{did}
    </select>

分步查询

一般分步查询,第一步都用resultMap,第二步使用resultType,除非第二步里也要往下分步

(0)DetpMapper.xml.collection

注意这里不需要ofType了,直接把第二步查出来的当作集合了

<resultMap id="DeptAndEmpsByStep" type="detp">
        <id property="did" column="did" />
        <result property="deptName" column="dept_name" />
        <collection property="emps"
                    select="com.atguigu.mybatis.mappers.EmpMapper.getDeptAndEmpsByIdStepTwo"
                    column="did"/>
    </resultMap>
(1)第一步:根据did查询部门所有信息 DeptMappper
Dept getDeptById(@Param("did")Integer did);
    <select id="getDeptById" resultMap="DeptAndEmpsByStep">
        select *
        from t_dept
        where id = #{did}
    </select>
(2)第二步:根据did查询员工集合信息 EmpMapper
List<Emp> getDeptAndEmpsByIdStepTwo(@Param("did")Integer did);
 <select id="getDeptAndEmpsByIdStepTwo" resultType="Emp">
        select *
        from t_emp
        where did = #{did}
    </select>

标签:自定义,did,查询,参数,emp,设置,mybatis,属性,加载
From: https://www.cnblogs.com/phonk/p/16607546.html

相关文章

  • mybatis缓存
    MyBatis缓存只对查询功能有效一级缓存一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访......
  • train.py文件在pycharm中输入参数命令的方法
    保姆式yolov5教程,训练你自己的数据集-知乎(zhihu.com)点击train->EditConfigurations: 在Parameters,输入对应参数命令--weightsyolov5s.pt--datadata/fire.......
  • mybatisplus使用xml
    一、配置xml路径mybatis-plus:mapper-locations:classpath:mapper/*.xml二、编写Mapper里面的方法publicinterfaceUserMapperextendsBaseMapper{ListfindAll()......
  • 4.函数的默认参数
    //2022年8月20日09:05:03#include<iostream>usingnamespacestd;intmyFunc(inta,intb=0)//intb=0;这就是函数的默认参数,不一定是0{returna+b;}......
  • NXP GUI-Guider,lvgl的好伴侣 拖曳式设计并自动生成代码,而且还可以当模拟器练习代码,
    GUIGuider是恩智浦提供的用户友好型图形用户界面开发工具,可通过开源LVGL图形库快速开发高品质的显示。GUIGuider的拖放编辑器可以轻松利用LVGL的众多特性,如小部件、动画......
  • MybatisPlus分页 假性失效
    背景:前端告诉我,页面只能显示1000条数据,实际上有4701条数据,为什么其他数据不能显示,后端返回的total就是1000。我看了后端分页插件配置也没有发现不正确的地方,使用了page()方......
  • 借用Linq To SQL,Dapper和自定义实体属性映射构建数据库底层实体和仓储层代码
    这里直接列举核心代码,以后整理:底层引用Dapper。 a1-实体类:usingWebApplication1.DB.Extend;usingWebApplication1.Enum;namespaceWebApplication1.DB.CMS{......
  • MybatisPlus——全网配置最全的代码生成器
    MybatisPlus代码生成器这里讲解的是新版(mybatis-plus3.5.1+版本),旧版不兼容官方文档:https://baomidou.com/(建议多看看官方文档,每种功能里面都有讲解)配置这里的配置......
  • 学习javaweb第2天(MyBatis快速入门)
    Mybatis几乎免除所有的JDBC代码以及设置参数和获取结果集的工作演示mybatis快速入门1、创建user表,添加数据:在sqlyog中输入一下代码,生成mybatis数据库,并且生成tb_user表......
  • mybatisplus-ActiveRecord 模式
    ActiveRecord模式直接调用Model对象来进行增删改查。实体类只需继承Model类即可进行强大的CRUD操作需要项目中已注入对应实体的BaseMapper实体类User点击查看代......