文章目录

  • Mapper.xml 详解
    • 1. parameterType
    • 2. resultType
    • 3. 级联查询
      • 3.1 一对多
      • 3.2 多对多

Mapper.xml 详解

MyBatis 主要有两个的配置文件:config.xml 和 Mapper.xml,这两个配置文件可以自定义文件名。

  1. config.xml 是全局配置文件,主要配置 MyBatis 的数据源(DataSource),事务管理(TransactionManager)以及打印 SQL 语句,开启二级缓存,注册 Mapper.xml 等。
  2. Mapper.xml 的作用是什么?因为 MyBatis 是“半自动”的ORM框架,即SQL语句需要开发者自定义,MyBatis 的关注点在 POJO 与 SQL 之间的映射关系,所以 Mapper.xml 主要配置接口方法对应的 SQL 语句,即接口方法的具体实现。

准备测试环境如下:

实体类 User:

package com.training.entity;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;//使用这个插件后,会默认生成属性的Getter与Setter方法@AllArgsConstructor
@NoArgsConstructor
@Data
public class User {private Integer id;private String name;private Double score;
}

自定义 UserMapper 接口

package com.training.mapper;public interface UserMapper {//定义相关的业务方法//...
}

创建接口对应的 UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.training.mapper.UserMapper"><!--定义接口方法对应的 SQL 语句--></mapper>

测试类 Test

package com.training.test;import com.training.entity.User;
import com.training.mapper.UserMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;import java.io.InputStream;
import java.util.List;
public class Test {public static void main(String[] args) {//加载MyBatis配置信息InputStream inputStream = Test.class.getClassLoader().getResourceAsStream("config.xml");//构建SQLSessionFactoryBuilderSqlSessionFactoryBuilder builder = newSqlSessionFactoryBuilder();SqlSessionFactory factory = builder.build(inputStream);//获取SqlSessionSqlSession sqlSession = factory.openSession();//获取实现接口的代理对象UserMapper mapper = sqlSession.getMapper(UserMapper.class);//...}
}

1. parameterType

parameterType 设置参数的数据类型,支持基本数据类型、包装类、String、多个参数以及 Java 对象。

1.1 基本数据类型

public interface UserMapper {//通过id查询Userpublic User findById(int id);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findById" parameterType="int" resultType="com.training.entity.User">select * from user where id=#{id};</select>
</mapper>

注:#{id} 可以替换任意名称,因为只有一个参数,所以无论映射名是什么,都可以完成映射。

1.2 包装类

public interface UserMapper {//通过score查询Userpublic User findByScore(Double score);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findByScore" parameterType="java.lang.Double" resultType="com.training.entity.User">select * from user where score=#{score}</select>
</mapper>

1.3 字符串 String

public interface UserMapper {//通过name查询Userpublic User findByName(String name);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findByName" parameterType="String" resultType="com.training.entity.User">select * from user where name=#{name}</select>
</mapper>

1.4 多个参数

多个参数的情况下,无法通过映射名来进行映射,而应该采用下标进行映射,即:[arg0, arg1, arg2, ……]或者 [param1, param2, param3, ……]

public interface UserMapper {//通过id和name查询Userpublic User findByIdAndName(Integer id, String name);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findByIdAndName" resultType="com.training.entity.User"><!--select * from user where id=#{arg0} and name=#{arg1};-->select * from user where id=#{param1} and name=#{param2};</select>
</mapper>

1.5 JavaBean

参数列表中的映射名就是实体类的属性名。

public interface UserMapper {//根据User封装对象查找Userpublic User findByUser(User user);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findByUser" parameterType="com.training.entity.User" resultType="com.training.entity.User">select * from user where name=#{name} and score=#{score};</select>
</mapper>

2. resultType

resultType 设置返回值的数据类型,支持基本数据类型、包装类、String、多个参数以及 Java 对象。

2.1 基本数据类型

public interface UserMapper {//查询User的总数public int getCount();
}
<mapper namespace="com.training.mapper.UserMapper"><select id="getCount" resultType="int">select count(*) from user;</select>
</mapper>

2.2 包装类

public interface UserMapper {//查询User的总数public Integer getCount();
}
<mapper namespace="com.training.mapper.UserMapper"><select id="getCount" resultType="java.lang.Integer">select count(*) from user;</select>
</mapper>

2.3 字符串 String

public interface UserMapper {//根据id查询namepublic String findNameById(Integer id);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findNameById" parameterType="int" resultType="java.lang.String">select name from user where id=#{id};</select>
</mapper>

2.4 JavaBean

public interface UserMapper {//通过id查询Userpublic User findById(Integer id);
}
<mapper namespace="com.training.mapper.UserMapper"><select id="findById" parameterType="java.lang.Integer" resultType="com.training.entity.User">select * from user where id=#{id};</select>
</mapper>

3. 级联查询

上面介绍的查询都是基于 User 的单表查询,如果是多表关联查询,比如:Student 与 Class 一对多的关联查询、Student 与 Course 多对多的级联查询,应该如何处理呢?显然仅仅使用 resultType 无法完成了。

3.1 一对多

创建数据表

create table class
(id  int auto_increment primary key,name varchar(22) null
);
create table student
(id   int auto_increment primary key,name varchar(25)  not null comment '姓名',GPA  double default 0 null comment '分数',cid  int  null
);

数据表对应的实体类

package com.training.entity;import lombok.Data;@Data
public class Student {private Integer id;private String name;private Double GPA;private Integer cid;private Class aClass;
}
package com.training.entity;import lombok.Data;@Data
public class Class {private Integer id;private String name;private List<Student> students;
}

例1:根据学生 id 查询学生所在的班级信息

自定义接口 StudentMapper.java

package com.training.mapper;import com.training.entity.Student;public interface StudentMapper {//查询学生的班级信息public Student findById(Integer id);
}

SQL配置文件 StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.training.mapper.StudentMapper"><resultMap id="studentMap" type="com.training.entity.Student"><id column="sid" property="id"></id><result column="sname" property="name"></result><result column="GPA" property="GPA"></result><association property="aClass" javaType="com.training.entity.Class"><id column="cid" property="id"></id><result column="cname" property="name"></result></association></resultMap><select id="findById" parameterType="java.lang.Integer" resultMap="studentMap">select s.id sid, s.name sname, GPA, c.id cid, c.name cname from student s,class c where s.cid = c.id and s.id = 1;</select>
</mapper>

例2:根据班级 id 查询所在班级的学生

自定义接口 ClassMapper.java

package com.training.mapper;import com.training.entity.Class;public interface ClassMapper {public Class findById(Integer id);
}

SQL配置文件 StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.training.mapper.StudentMapper"><resultMap id="studentMap" type="com.training.entity.Student"><id column="sid" property="id"></id><result column="sname" property="name"></result><result column="GPA" property="GPA"></result><association property="aClass" javaType="com.training.entity.Class"><id column="cid" property="id"></id><result column="cname" property="name"></result></association></resultMap><select id="findById" parameterType="java.lang.Integer" resultMap="studentMap">select s.id sid, s.name sname, GPA, c.id cid, c.name cname from student s,class c where s.cid = c.id and s.id = 1;</select>
</mapper>

3.2 多对多

创建数据表

create table student
(id int auto_increment primary key,name varchar(25) not null comment '姓名',GPA double default 0 null comment '分数'
);
create table stu_course
(id  int auto_increment primary key,sid int null,cid int null
);
create table course
(id   int auto_increment primary key,name varchar(225) null
);

数据表对应的实体类

package com.training.entity;import lombok.Data;import java.util.List;@Data
public class Student {private Integer id;private String name;private Double GPA;private List<Course> courses;
}
package com.training.entity;import lombok.Data;import java.util.List;@Data
public class Course {private Integer id;private String name;private List<Student> students;
}

例1:通过学生 id 查询该学生的选课信息

自定义接口 StudentMapper.java

public interface StudentMapper {public Student findById(Integer id);
}

SQL配置文件 StudentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.training.mapper.StudentMapper"><resultMap id="studentMap" type="com.training.entity.Student"><id column="sid" property="id"></id><result column="sname" property="name"></result><result column="GPA" property="GPA"></result><collection property="courses" ofType="com.training.entity.Course"><id column="cid" property="id"></id><result column="cname" property="name"></result></collection></resultMap><select id="findById" parameterType="java.lang.Integer" resultMap="studentMap">select s.id sid, s.name sname, GPA, c.id cid, c.name cnamefrom student s,stu_course sc,course cwhere s.id = sc.sid and c.id = sc.cid and s.id = 1;</select>
</mapper>

控制台打印结果如下:


例2:通过课程 id 查询选过该课的学生信息

自定义接口 CourseMapper.java

public interface ClassMapper {public Class findById(Integer id);
}

SQL配置文件 CourseMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.training.mapper.CourseMapper"><resultMap id="courseMap" type="com.training.entity.Course"><id column="cid" property="id"></id><result column="cname" property="name"></result><collection property="students" ofType="com.training.entity.Student"><id column="sid" property="id"></id><result column="sname" property="name"></result><result column="GPA" property="GPA"></result></collection></resultMap><select id="findById" parameterType="java.lang.Integer" resultMap="courseMap">select c.id cid, c.name cname, s.id sid, s.name sname, GPAfrom student s,stu_course sc,course cwhere s.id = sc.sid and c.id = sc.cid and c.id = 1;</select>
</mapper>

控制台打印结果如下:

3.Mapper.xml 详解相关推荐

  1. MyBatis 中的mapper.xml详解

    <mapper namespace="com.mapper.UserMapper",为这个mapper指定一个唯一的namespace,一般习惯为mapper接口的包路径名, ...

  2. Ant之build.xml详解

    Ant的概念  可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道 make这个命令.当编译Linux内核及一些软件的源程序时,经常要用这个命令.Make命令 ...

  3. Tomcat(二):tomcat配置文件server.xml详解和部署简介

    1. 入门示例:虚拟主机提供web服务 该示例通过设置虚拟主机来提供web服务,因为是入门示例,所以设置极其简单,只需修改$CATALINA_HOME/conf/server.xml文件为如下内容即可 ...

  4. Stuts的Web.xml 详解

    1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...

  5. Web.xml详解(转)

    这篇文章主要是综合网上关于web.xml的一些介绍,希望对大家有所帮助,也欢迎大家一起讨论. ---题记 一.            Web.xml详解: (一)  web.xml加载过程(步骤) 首 ...

  6. 【AndroidManifest.xml详解】Manifest属性之versionCode,versionName

    Android:versionCode是什么? android:versionCode表示该软件的版本号,对用户是不可见的,它必须是一个int型的整数,它的大小代表该软件版本升级过多少次,因此每次发布 ...

  7. springboot2.0日志配置 logback的使用和logback.xml详解

    logback的使用和logback.xml详解写的非常详细. 只根据上面的我们会发现,日志要么输出到文件.要么输出到控制台不能有选择的输出满足我们的要求,这是需要看下面这个文章, 多个xml路径,有 ...

  8. Mybatis核心配置文件xml详解

    <!-- configuration:在dtd约束中? 代表一次或零次+ 代表一次或多次(最少一次,可以多次)* 代表零次或多次(有没有都可以), :逗号 特定的顺序()| :竖杠 任选其一能添 ...

  9. mybatis-day02-CRUD、动态代理开发、核心xml详解、输入输出参数

    文章目录 一.今日内容 二.mybatis实现crud 2.1 搭建环境(配置文件参考a.网址)(顺便实现findAll查询) 目录结构: pom.xml User.java SqlMapConfig ...

最新文章

  1. 云原生时代消息中间件的演进路线
  2. 《战狼2》电影观后感
  3. 章节之外:makefile中的函数定义
  4. 20210907 Engine and SDK in development
  5. spring cloud构建互联网分布式微服务云平台-断路器聚合监控(Hystrix Turbine)
  6. tnsnames.ora配置未生效_1分钟了解网络交换机的6种命令配置模式
  7. [会议分享]2020全球软件大会分享-PWA在项目中的最佳实践
  8. UNIX(多线程):21---线程池实现原理
  9. 收藏!斯坦福Andrew Ng教授“机器学习”26篇教程全译
  10. 智行买机票如何在线选座
  11. 移动端适配,华为浏览器底色无法正常显示
  12. Ubuntu18.04 + RTX2080Ti + CUDA +cudnn 环境配置
  13. InfluxDB+Grafana Alert功能Email+webhook
  14. uni-app的使用分享(一)
  15. 网络路由与交换技术常见命令1(Cisco)
  16. 行车路线(改)(图的应用)
  17. 计算机工程应用是什么期刊,计算机工程类期刊汇总
  18. PHP的realpath(...)
  19. mall前端项目的安装与部署
  20. 一分钟看懂 python继承 (面试题) 万变不离其宗

热门文章

  1. 第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem B. Nim Game-题解
  2. 校外如何登陆北邮oj
  3. zotero inline bibliography AMA 11th 出问题
  4. R-xts()时间序列
  5. 漫谈Android 增量更新
  6. 如下现有一个保险政策类InsurancePolicy
  7. vue3 - 父子组件之间的传值
  8. java中遍历类中的属性和属性值
  9. 工程项目经理也分“三六九等”
  10. SQL Server sp_helpdb 改写