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

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

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

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标签
    <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:处理多对一的映射关系

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)

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主要就是处理一对多的关系,也就是处理一个集合的关系

一步查询

(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,属性,加载
来源: https://www.cnblogs.com/phonk/p/16607546.html