3.Mapper.xml 详解-程序员宅基地

技术标签: java  SSM框架笔记  mybatis  

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");
        //构建SQLSessionFactoryBuilder
        SqlSessionFactoryBuilder builder = new
                SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(inputStream);
        //获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //获取实现接口的代理对象
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //...
    }
}

1. parameterType

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

1.1 基本数据类型

public interface UserMapper {
    
    //通过id查询User
    public 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查询User
    public 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查询User
    public 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查询User
    public 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封装对象查找User
    public 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查询name
    public 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查询User
    public 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 cname
        from student s,stu_course sc,course c
        where 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, GPA
        from student s,stu_course sc,course c
        where s.id = sc.sid and c.id = sc.cid and c.id = 1;
    </select>
</mapper>

控制台打印结果如下:

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41775769/article/details/120059139

智能推荐

基于C++、MySQL的图书销售管理系统_c++ mysql管理系统实验报告设计思路-程序员宅基地

文章浏览阅读1.5w次,点赞7次,收藏174次。数据库课程设计报告开发环境与开发工具开发语言:C++、MySQL操作系统:macOS Mojave Version 10.14.5开发工具:Xcode IDE、iTerm 命令行终端终端环境:iTerm + zsh、Xcode 终端调试台MySQL Server 版本:5.7.25 MySQL Community Server (GPL)运行方式:cd 到目录下 make 可完成编译连接,而后直接 ./bsms 即可运行系统需求分析  当今的图书销售行业有数据量大、数据结构复杂、数据变_c++ mysql管理系统实验报告设计思路

ubuntu16.0.4bug无法解析域名_暂时不能解析域名“ppa.launchpad.net”-程序员宅基地

文章浏览阅读2.8w次,点赞4次,收藏43次。root@ubuntu:/etc/apt# apt-get update错误:1 http://mirrors.aliyun.com/ubuntu xenial InRelease 暂时不能解析域名“mirrors.aliyun.com”错误:2 http://mirrors.aliyun.com/ubuntu xenial-updates InRelease 暂时不能解析域名“mir..._暂时不能解析域名“ppa.launchpad.net”

qml Canva 中的fill不起作用_canvas fill填充无效-程序员宅基地

文章浏览阅读269次。解决qml中的fill填充颜色不起作用_canvas fill填充无效

前端中高级基础知识面试汇总_前端基础知识面试-程序员宅基地

文章浏览阅读9.8k次,点赞53次,收藏321次。保持学习,保持热爱。持续更新ing~前端基础github地址。README.md可以下载到typora中打开,会有整个大纲目录显示(github中markdown目录快捷生成方式不现实,之后可能会想办法生成贴过来,暂时不做相关处理)前端基础gitbook地址。README.md中会实时更新进度内容。gitbook中考虑整个学完整理完成之后,再去统一处理发布,敬请期待!gitbook版本可建议后期碎片化时间进行复习使用。前端基础csdn地址。程序员宅基地专栏前端自我修养进阶中,也会一篇一篇实时更新相关_前端基础知识面试

工作流引擎 Activiti 入门详解-程序员宅基地

文章浏览阅读682次,点赞2次,收藏3次。点击关注公众号,利用碎片时间学习1. 什么是工作流1.1 工作流介绍工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。1.2 工作流系统什么是工作流系统具有工作流程功能的软件系统。用于更好的管理业务流程。适用行业,..._activity工作流入门

【docker设置host】docker镜像设置hosts_docker hosts-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏11次。hosts文件其实并不是存储在Docker镜像中的,/etc/hosts, /etc/resolv.conf和/etc/hostname,是存在主机上的/var/lib/docker/containers/(docker_id)目录下,容器启动时是通过mount将这些文件挂载到容器内部的。因此如果在容器中修改这些文件,修改部分不会存在于容器的top layer,而是直接写入这3个文件中。_docker hosts

随便推点

Ext4.2 使用iframe实现页面四宫格布局_html 四宫格 iframe-程序员宅基地

文章浏览阅读656次。var xxxPanel = new Ext.Panel({ renderTo: Ext.getBody(), layout: 'anchor', width : '100%', height : heightbody+40, items: [ { ..._html 四宫格 iframe

windows 查看本地安装证书情况_查看电脑安装的证书-程序员宅基地

文章浏览阅读855次。windows 查看本地安装证书情况_查看电脑安装的证书

征信报告 加密文档_教你如何把文件(包括照片视频)隐藏并加密-程序员宅基地

文章浏览阅读2.4k次。大家电脑或者U盘里都会有一些比较重要和私密的文件,不方便给他人看到。比如账号密码、个人信息、工作资料、照片视频等,这些数据泄漏出去会很麻烦……虽然现在大多都有开机密码,但也有借用电脑和U盘给别人的情况等。因此将重要文件妥善保管也是一个很重要的技能。本文就分享下「如何正确地隐藏文件,和给文件夹加密的小工具」,保护个人数据安全。经小工具加密后文件夹中的文件会消失的无影无踪,输入密码后它会立刻..._怎么隐藏征信上的职业信息

Pycharm学生用户免费激活-程序员宅基地

文章浏览阅读1.3w次,点赞13次,收藏59次。Pycharm专业版_学生用户激活Pychram学生账户激活Free Educational Licenses填写申请人信息无法接受邮箱申请Pychram学生账户激活Free Educational LicensesFree Educational Licenses网址点击Apply now填写申请人信息填写个人信息,邮箱必须使用校园邮箱号,每个大学都有对应的邮箱帐号,可以去校园网自行申请点击申请免费产品无法接受邮箱申请如果出现无法接受电子邮件地址,点击蓝色的“官方文件”进行申请确认_pycharm学生

拓端tecdat|R语言:EM算法和高斯混合模型聚类的实现_r语言实现最大化聚类(em)算法中图形的绘制-程序员宅基地

文章浏览阅读436次。期望最大化(EM)算法是用于找到最大似然的或在统计模型参数,其中该模型依赖于未观察到的潜变量最大后验(MAP)估计的迭代方法。期望最大化(EM)可能是无监督学习最常用的算法。或者,如果我们有以厘米为单位的人的身高(男性和女性)的数据。高度遵循正常的分布,但男性(平均)比女性高,因此这表明两个高斯分布的混合模型。假设我们翻转硬币并得到以下内容 - 0,1,1,0,0,1,1,0,0,1。本文我们讨论期望最大化理论,应用和评估基于期望最大化的聚类。我们将使用mclust软件包附带的“糖尿病”数据。_r语言实现最大化聚类(em)算法中图形的绘制

Selenium的安装与卸载_卸载selenium-程序员宅基地

文章浏览阅读6.4k次,点赞3次,收藏5次。selenium _卸载selenium

推荐文章

热门文章

相关标签