Mapper.xml详解

Mapper.xml详解我们知道 每一款框架产品在实际开发中 都是通过 XML 文件来培训框架的相关流程的 MyBatis 也不例外 主要有两个配置文件 config xml 和 Mapper xml 当然 这两种配置文件可以自定义文件名 config xml 是全局配置文件 主要配置 MyBatis 的数据源 DataSource 事务管理 TransactionM 以及打印 SQL 语句 开启二级缓存 设置实体类别名等

UserDao:

//通过id查找User public User getById(int id); 

UserDao.xml:

 
   
   
    
  

(2)String类型,通过name查User

UserDao:

//通过name查询User public User getByName(String name);

UserDao.xml:

(3)包装类,通过id查询User。

UserDao:

//通过id查询User public User getById(Integer id);

UserDao.xml:

(4)多个参数,通过name和age查询User。两个参数分别是String类型和int类型,类型不一致,所以此时parameterType可以省略,通过参数下标取出参数值

UserDao:

//通过name和age查询User public User getByNameAge(int id,String name);

UserDao.xml:

(5)POJO,很显然,当有多个参数时,一个一个写太麻烦了,这时候我们可以将参数列表进行封装,将封装对象作为parameterType的值。

UserDao:

//根据Usesr封装对象查询User public User getByUser(User user);

UserDao.xml:

resultType:结果类型

(1)基本数据类型,统计User总数。

UserDao:

//通过User总数量 public int getCount();

UserDao.xml:

(2)包装类,统计User总数。

UserDao:

//通过User总数量 public Integer getCount();

UserDao.xml:

(3)String类型,根据id查询User的name值。

UserDao:

//根据id查询User的name public String getNameById(int id);

UserDao.xml:

(4)POJO,如通过id查询User,上面已经介绍过了,这里就不再重复了。

级联查询
 

一对多

我们现在查询的User是单表查询,如果是多表关联查询,比如查询Student同时级联对应的Classes,如何处理呢?

使用resultType无法完成,我们以通过id查询Student来举例。

SQL:

select * from student as s,classes as c where s.cid = c.c_id and s.id = 1; 

查询结果:

Mapper.xml详解

实体类Student:

package com.xf.pojo; public class Student { private int id; private String name; private String address; private String tel; private int score; private Classes classes; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } public Classes getClasses() { return classes; } public void setClasses(Classes classes) { this.classes = classes; } } 

Classes:

package com.xf.pojo; import java.util.List; public class Classes { private int id; private String name; private List 
  
    students; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List 
   
     getStudents() { return students; } public void setStudents(List 
    
      students) { this.students = students; } } 
     
    
  

MyBatis会自动将结果与实体类进行映射,将字段的值赋给对应的属性,若字段名与属性名一致,完成赋值,那么问题来了。

Mapper.xml详解

如图,id,name,address,tel,score属性可以对应字段,classes属性没有对应的字段,准确的讲,classes属性需要对应的对象为c_id,c_name封装起来的对象。

此时,需要使用resultMap来完成映射。

StudentDao:

//通过id查询Student public Student getById(int id);

StudentDao.xml,使用association标签配置classes级联,因为一个Student只能对应一个Classes。

 
  
        
        
        
        
        
        
        
   
             
             
         
    
   

同理,反过来查询Classes,将级联的所有Student一并查询。

ClassesDao:

//根据id查询Classes public Classes getById(int id);

ClassesDao.xml,使用collection标签配置students级联,因为一个Classes可以对应多个Student。

 
  
        
        
        
        
   
             
             
             
             
             
         
    
   

需要注意的是:association标签,通过设置javaType属性,映射实体类,

collection标签,通过设置ofType属性映射实体类。

 

多对多

多对多其实是双向的一对多关系,我们用Customer和Goods来举例,

一个Customer可以对应多个Goods,一个Goods也可以对应多个Customer,所以双方都是用collection标签设置级联。

Customer:

package com.xf.pojo; import java.util.List; public class Customer { private int id; private String name; private List 
  
    goods; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List 
   
     getGoods() { return goods; } public void setGoods(List 
    
      goods) { this.goods = goods; } } 
     
    
  

Goods:

package com.xf.pojo; import java.util.List; public class Goods { private int id; private String name; private List 
  
    customers; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List 
   
     getCustomers() { return customers; } public void setCustomers(List 
    
      customers) { this.customers = customers; } } 
     
    
  

CustomerDao:

//根据id查询Customer public Customer getById(int id);

CustomerDao.xml:

 
  
        
        
        
        
   
             
             
         
    
   

GoodsDao:

//根据id查询Goods public Goods getById(int id);

GoodsDao.xml:

 
  
        
        
        
        
   
             
             
         
    
   

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226952.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:18
下一篇 2026年3月16日 下午10:18


相关推荐

  • Python虚拟环境包管理工具

    Python虚拟环境包管理工具

    2022年3月12日
    40
  • vue中使用wangeditor_vue富文本编辑器tinymce

    vue中使用wangeditor_vue富文本编辑器tinymce富文本编辑器要求必填,否则alert(‘内容不能为空’),假设字段{{content}}当编辑器输入内容时,如果是字符,content=<p>字符XXXX</p>如果是图片,content=<p><imgsrc=”图片地址”/></p>如果是表情,content=<p>表情</p>如果是空格,content=<p>&nbsp;</p>如果是回车,co.

    2022年10月7日
    6
  • MDC简介

    MDC简介一 MDC 介绍 MDC MappedDiagno 映射调试上下文 是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能 某些应用程序采用多线程的方式来处理多个用户的请求 在一个用户的使用过程中 可能有多个不同的线程来进行处理 典型的例子是 Web 应用服务器 当用户访问某个页面时 应用服务器可能会创建一个新的线程来处理该请求 也可能从线

    2026年3月17日
    1
  • navicat导出longtext类型数据乱码的解决方案

    navicat导出longtext类型数据乱码的解决方案一、先使用sql查询出需要导出的内容,将longtext类型使用cast转化成char类型SELECT company_id, wechat_mp_appid, CAST(survey_risk_tips_orgASchar)ASsurvey_risk_tips_org, CAST(survey_disclaimerASchar)ASsurvey_disclaimer, CAS…

    2022年5月14日
    49
  • ldc1614 c语言编程,LDC1614读回来的数据为固定值不变[通俗易懂]

    ldc1614 c语言编程,LDC1614读回来的数据为固定值不变[通俗易懂]OtherPartsDiscussedinThread:LDC1614,LDC1314,LDC1614EVM求教一下各位前辈,硬件是用的LDC1614的评估板,ch0和ch1上接了两个线圈,并联的电容为100pF,器件ID和装配ID读出来为0x3055和0x5449,和手册上的一致,而且我写寄存器再读出来数据都是对的,排除了软件驱动上的问题,现在可能是配置上有哪里不对,或者芯片有问题(…

    2022年6月7日
    40
  • Unity 3D游戏开发学习教程

    Unity 3D游戏开发学习教程用C#用Unity3D制作游戏你会学到:您将学习3D游戏开发基础知识,以使用Unity3D引擎推进事物。到本课程结束时,他们将可以轻松制作任何类型的游戏,无论是3D还是2DMP4|视频:h264,1280×720|音频:AAC,44.1KHz,2Ch语言:英语+中英文字幕(根据原英文字幕机译更准确)|时长:87节课(11h32m)|大小解压后:5.86GB描述用Unity3D开发3D游戏《2021年》是一门结构完善的高级UnityC#课程,专为完全…

    2025年11月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号