MyBatis—多表查询使用

目录

一:多张数据表写入同一个实体类

二:多表查询 一对一

三:多表查询 一对多

四:多表查询 多对多


一:多张数据表写入同一个实体类

现在有两张表。一张student表,一张class表

  

 实体类

@Data
public class ClassAndStudent {
    private int cid;
    private String course;
    private int tid;
    //以上为class表数据,以下为Student表数据
    private int sid;
    private String sname;
    private String sbirth;
    private String sgender;
}

Dao层

@Repository
public interface UseXmlDao {
    List<ClassAndStudent> findAll();
}

Service层

//接口层
@Service
public interface UserService {
   List<ClassAndStudent> findAll();
}
//实现接口层
@Service
public class UserServiceImp implements UserService {

    @Autowired
    private UseXmlDao useXmlDao;

    @Override
    public List<ClassAndStudent> findAll() {
        return useXmlDao.findAll();
}

Controller层

@RestController
public class UserController {

    @Autowired
    private UserService userService;
    
    @RequestMapping ("/duobiao")
    public @ResponseBody List<ClassAndStudent> findAll(){
        List<ClassAndStudent> classAndStudentList = userService.findAll();
        return classAndStudentList;
    }
}

XML

    <select id="findAll" resultType="com.xiaosuda.boot.Pojo.ClassAndStudent" >
        select * from student,class
    </select>

输出结果(笛卡儿积)

 注意!使用这种方法进行多表查询时,

  • 实体类中有哪些属性,输出结果就有哪些属性,
  • sql语句中如果只查询其中一些属性,实体类中未查询的属性会显示 0 或 null

例如:去掉课程和生日属性,输出结果页没有

@Data
public class ClassAndStudent {
    private int cid;
//    private String course;
    private int tid;
    private int sid;
    private String sname;
//    private String sbirth;
    private String sgender;
}

无课程和生日字段 

例如:查询学生ID,学生姓名,课程名称

   <select id="findAll" resultType="com.xiaosuda.boot.Pojo.ClassAndStudent" >
        select student.sid,student.sname,class.course from student,class
    </select>

 返回学生ID,学生姓名,课程名称


二:多表查询 一对一

现在有两个表

 user表(表名为aa_user)

order表 (表名为aa_order)

Order的实体类

@Data
public class Order {
    private int oid;
    private String ordertime;
    private int total;
    private User user;//数据库中为u_id,此处使用 User user 是为了与aa_user表连接关系
}

User的实体类

@Data
public class User {
    private int uid;
    private String username;
    private String password;
    private String gender;
}

XML

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

//与Dao接口名字相同
<mapper namespace="com.xiaosuda.boot.Dao.UseXmlDao"> 
    // resultMap名字自取,type为主体实体类名称
    <resultMap id="OrderMap" type="com.xiaosuda.boot.Pojo.Order">
        // column为数据库的列名,property为实体类的名字
        <id column="o_id" property="oid"></id>
        <result column="order_time" property="ordertime"></result>
        <result column="to_tal" property="total"></result>

        // property 为当前实体(Order)中的属性名称(Private User user);
        // javaType 为当前实体(Order)中属性的类型
        <association property="user" javaType="com.xiaosuda.boot.Pojo.User">
            <id column="u_id" property="uid"></id>
            <result column="user_name" property="username"></result>
            <result column="pass_word" property="password"></result>
            <result column="gen_der" property="gender"></result>
        </association>
    </resultMap>

    <select id="findAll" resultMap="OrderMap"  >
        select * from aa_order,aa_user
        where aa_order.u_id  = aa_user.u_id 
    </select>
</mapper>

输出结果

 

 多表查询使用 resultMap 进行二次封装

一对一使用 association

  • property:为当前实体(Order)中的属性名称(Private User user);
  • javaType:为当前实体(Order)中属性的类型

三:多表查询 一对多

user实体类

@Data
public class User {
    private int uid;
    private String username;
    private String password;
    private String gender;
    private List<Order> orderList;     //用于查询其他Order
}

XML

<mapper namespace="com.xiaosuda.boot.Dao.UserDao">
    <resultMap id="UserMap" type="com.xiaosuda.boot.Pojo.User">
        <id column="u_id" property="uid"></id>
        <result column="user_name" property="username"></result>
        <result column="pass_word" property="password"></result>
        <result column="gen_der" property="gender"></result>
        
         //property为当前集合名称     ofType:集合中的数据类型
        <collection property="orderList" ofType="com.xiaosuda.boot.Pojo.Order">
            <id column="o_id" property="oid"></id>
            <result column="order_time" property="ordertime"></result>
            <result column="to_tal" property="total"></result>
        </collection>
    </resultMap>
    <select id="SearchAll" resultMap="UserMap"  >
        select * from aa_user,aa_order
        where aa_order.u_id  = aa_user.u_id
    </select>
</mapper>

输出结果

 一次多使用 collection

  • property: 为当前集合名称    
  • ofType:集合中的数据类型

四:多表查询 多对多

        。。。。 太复杂的 我觉得不会让我写 哈哈 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值