24.11.26 Mybatis2

发布于:2024-11-27 ⋅ 阅读:(57) ⋅ 点赞:(0)

resultMap 中的标签和属性

如果是主键列 一般用id标签对应   propertyjava对象的属性  column 数据库中的列
                           ( javaType实体类数据类型 jdbcType数据库列的数据类型 ) 
                           不需要配置 

<id property="empno" column="empno"  />

如果是普通列 一般用result对应  propertyjava对象的属性  column 数据库中的列
<result property="ename" column="ename" />

高级映射 (映射数据与对象的对应关系) 如果列不指定 不能自动对应

通常搭配继承一起使用 体现基础字段的对应

association 对应某个实体对象

Emp对象中 有部门信息 在java中 包含一个Dept对象

package com.javasm.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;
import java.io.Serializable;

/**
 * (Emp)实体类
 *
 * @author makejava
 * @since 2024-11-26 09:40:43
 */

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Emp implements Serializable {
    private static final long serialVersionUID = -16018027389934188L;
    
    private Integer empno;
    
    private String ename;
    
    private String job;
    
    private Integer mgr;
    
    private String hiredate;
    
    private Double sal;
    
    private Double comm;

    //关联部门信息
    private Dept dept;
    
//    private Integer deptno;
//
//
//    private String dname;
//
//    private String loc;

}

映射文件配置

<resultMap id="EmpMapBasMap" type="com.javasm.entity.Emp" >
<!--   主键列用id    -->
<!--        实体类属性名       数据库列      ( javaType实体类数据类型  jdbcType数据库列的数据类型 ) 不需要配置           -->
        <id property="empno" column="empno"  />
<!--   其他列用result    -->
        <result property="ename" column="ename" />
        <result property="job" column="job" />
        <result property="mgr" column="mgr" />
        <result property="hiredate" column="hiredate" />
        <result property="sal" column="sal" />
        <result property="comm" column="comm" />

    </resultMap>

<resultMap id="EmpMapWithDept" extends="EmpMapBasMap" type="com.javasm.entity.Emp" >
        <!--            实体类属性名     数据库列     -->
        
<!--   高级映射(对象映射标签)  需要手动指定所有字段
        association  解析resultSet数据时 可以创建多个对象
        collection
       配置关联的对象     -->
        <association property="dept" javaType="com.javasm.entity.Dept">
            <id property="deptno" column="deptno"  />
            <result property="dname" column="dname" />
            <result property="loc" column="loc" />
        </association>

    </resultMap>

通过sql语句 把需要的数据查询出来

select * from emp e,dept d where e.deptno = d.deptno

collection 对应集合

每个Dept中都有多个Emp List<Emp>

每个部门有多个员工 部门对象中 包含Emp的集合

package com.javasm.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;



@Data
@NoArgsConstructor
@AllArgsConstructor
public class Dept {
    private Integer deptno;

    private String dname;

    private String loc;
    //多方的数据集合
    private List<Emp> emps;

}

映射配置

<!-- 基础字段映射 -->
    <resultMap id="DeptBasMap" type="com.javasm.entity.Dept" >
        <id property="deptno" column="deptno"  />
        <result property="dname" column="dname" />
        <result property="loc" column="loc" />
    </resultMap>

    <resultMap id="DeptWithEmps" extends="DeptBasMap" type="com.javasm.entity.Dept">
<!--    聚合 对应集合对象    -->
        <collection property="emps" ofType="com.javasm.entity.Emp">
            <id property="empno" column="empno"  />
            <result property="ename" column="ename" />
            <result property="job" column="job" />
            <result property="mgr" column="mgr" />
            <result property="hiredate" column="hiredate" />
            <result property="sal" column="sal" />
            <result property="comm" column="comm" />
        </collection>

    </resultMap>

sql语句

select * from dept d left join emp e on  d.deptno  = e.deptno
order by d.deptno

2数据库关联查询

表有数据关联时 需要做关联查询

-- 连表查询

-- 简化语法 使用内连接 
select * from emp e,dept d where e.deptno = d.deptno 
-- 标准sql语法 内连接
select * from emp e INNER JOIN dept d on e.deptno = d.deptno
-- 外连接 left right 哪一方显示全集
select d.*,e.* from emp e right join dept d on e.deptno = d.deptno 
order by d.deptno

select * from dept d left join emp e on  d.deptno  = e.deptno
order by d.deptno

-- 如果是内连接 连表顺序无影响-- 如果做外联 连表顺序 有影响

多表关联时 全集方向保持一致

3.数据库对应关系 java对象对应关系

一对一情况下

java中 双方对象 都包含对方的对象 mybatis中使用 association 配置结果

一对多情况下

多方 包含一方的集合 collection配置

dept ----> list<emp>

class(班级) -----> list<student>

一方 关联多方的对象 association配置

emp -----> dept

student ---> class(班级)

多对多情况下

双方都是对方的集合 collection配置

order ----> list<productInfo>

productInfo -->list<Order>

总结:

java中 对象之间的关系

对象中包含某个其他对象 association

对象中包含集合其他对象 collection

4自连接

自连接 需要起别名 通过别名 让mybatis识别哪些是内层 哪些是外层

高级映射标签 association collection 可以多次 和嵌套使用

查省市对应关系数据

select ta2.*,ta1.code AS subcode ,ta1.name AS subname ,ta1.pcode AS subpcode  
            from tb_area ta1 inner join tb_area ta2 on ta1.pcode = ta2.code
where ta2.pcode = 0

映射文件

<resultMap id="TbAreaMap" type="com.javasm.entity.TbArea" >
        <id property="code" column="code" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="pcode" column="pcode" jdbcType="INTEGER"/>
        <collection property="subArea" ofType="com.javasm.entity.TbArea">
            <id property="code" column="subcode" jdbcType="INTEGER"/>
            <result property="name" column="subname" jdbcType="VARCHAR"/>
            <result property="pcode" column="subpcode" jdbcType="INTEGER"/>
        </collection>
    </resultMap>

查省市县对应关系数据

select ta3.*,ta2.code AS citycode ,ta2.name AS cityname ,ta2.pcode AS citypcode ,
             ta1.code AS areacode ,ta1.name AS areaname ,ta1.pcode AS areapcode  

from tb_area ta1 inner join tb_area ta2 on ta1.pcode = ta2.code
                 inner join tb_area ta3 on ta2.pcode = ta3.code

映射文件

<resultMap id="TbAreaMap2" type="com.javasm.entity.TbArea" >
        <id property="code" column="code" jdbcType="INTEGER"/>
        <result property="name" column="name" jdbcType="VARCHAR"/>
        <result property="pcode" column="pcode" jdbcType="INTEGER"/>
        <collection property="subArea" ofType="com.javasm.entity.TbArea">
            <id property="code" column="citycode" jdbcType="INTEGER"/>
            <result property="name" column="cityname" jdbcType="VARCHAR"/>
            <result property="pcode" column="citypcode" jdbcType="INTEGER"/>
            <collection property="subArea" ofType="com.javasm.entity.TbArea">
                <id property="code" column="areacode" jdbcType="INTEGER"/>
                <result property="name" column="areaname" jdbcType="VARCHAR"/>
                <result property="pcode" column="areapcode" jdbcType="INTEGER"/>
            </collection>
        </collection>
    </resultMap>


 


网站公告

今日签到

点亮在社区的每一天
去签到