MyBatis(XML映射器操作)

文章目录

    • XML映射器操作(XxxMapper.xml)
        • 文件目录
        • 1.基本介绍
          • 1.优点
          • 2.常用顶级元素
        • 2.环境配置
          • 1.在原来的父模块下创建一个子模块
          • 2.删除没用的两个文件夹
          • 3.创建基本目录
          • 4.父模块的pom.xml
          • 5.jdbc.properties
          • 6.mybatis-config.xml
          • 7.测试使用MonsterMapperTest.java
        • 3.parameterType(输入参数类型)
          • 1.基本介绍
          • 2.案例一
            • 1.MonsterMapper.java
            • 2.MonsterMapper.xml
            • 3.测试
          • 3.案例二(模糊查询)
            • 1.MonsterMapper.java添加方法
            • 2.MonsterMapper.xml添加实现类
            • 3.测试
        • 4.传入HashMap
          • 1.基本介绍![image-20240304135016653](https://img-blog.csdnimg.cn/img_convert/6ece40de84bcc9416cce823c98dd14c1.png)
          • 2.案例一(参数为map)
            • 1.MonsterMapper.java添加方法
            • 2.MonsterMapper.xml
            • 3.测试
          • 3.案例二(返回值为map)
            • 1.MonsterMapper.java添加方法
            • 2.MonsterMapper.xml
            • 3.测试
        • 5.ResultMap
          • 1.基本介绍
          • 2.案例
            • 1.创建数据表
            • 2.创建映射类User.java
            • 3.UserMapper.java
            • 4.UserMapper.xml
            • 5.测试(数据未填充!)
            • 6.使用resultMap替换resultType解决,修改UserMapper.xml
            • 7.结果
          • 3.注意事项与细节

XML映射器操作(XxxMapper.xml)

文件目录

image-20240304162123528

1.基本介绍
1.优点

image-20240304102427876

2.常用顶级元素

image-20240304102444648

2.环境配置
1.在原来的父模块下创建一个子模块

image-20240304103035583

2.删除没用的两个文件夹

image-20240304103249466

3.创建基本目录

image-20240304104018475

4.父模块的pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example</groupId>
  <artifactId>mybatis</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>Archetype - mybatis</name>
  <url>http://maven.apache.org</url>
  <modules>
    <module>mybatis_quickstart</module>
    <module>xml-mapper</module>
  </modules>
  <dependencies>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.49</version>
    </dependency>
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.7</version>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <!--如果设置scope为test,则只能在test包下使用-->
      <scope>test</scope>
    </dependency>
  </dependencies>
  <!--在父模块中的pom.xml文件中配置在build的时候要扫描的文件,解决某些类型文件拷贝到target目录失败的问题-->
  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
        <includes>
          <!--在java文件夹下的多级目录下的xml文件-->
          <include>**/*.xml</include>
        </includes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <includes>
          <!--在resources文件夹下的多级目录下的xml文件和properties文件-->
          <include>**/*.xml</include>
          <include>**/*.properties</include>
        </includes>
      </resource>
    </resources>
  </build>
</project>

5.jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

6.mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--引入外部文件jdbc.properties-->
    <properties resource="jdbc.properties"/>

    <!--配置mybatis自带的日志,settings需要放到最前面-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <!--配置类型别名-->
    <typeAliases>
        <!--方式二:这样配置完了在这个包下的所有类都可以直接使用类名表示-->
        <package name="com.sun.entity"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <!--配置事务管理器-->
            <transactionManager type="JDBC"/>
            <!--配置数据源-->
            <dataSource type="POOLED">
                <!--配置驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--配置连接url-->
                <!--
                1.jdbc:mysql:协议
                2.127.0.0.1:3306:指定连接mysql的ip+端口
                3.mybatis:连接的db
                4.useSSL:使用安全连接
                5.&amp;:表示&
                6.useUnicode=true:使用unicode,防止编码错误
                7.characterEncoding=UTF-8:字符集使用utf-8
                -->
                <property name="url" value="${jdbc.url}"/>
                <!--用户名-->
                <property name="username" value="${jdbc.username}"/>
                <!--密码-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--包的方式引入含有Mapper.xml的类-->
        <package name="com.sun.mapper"/>
    </mappers>

</configuration>

7.测试使用MonsterMapperTest.java
package com.sun.mapper;

import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MonsterMapperTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private MonsterMapper monsterMapper;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        System.out.println(monsterMapper.getClass());
    }
    @Test
    public void test() {
        System.out.println("ssss");
    }
}

image-20240304105411141

3.parameterType(输入参数类型)
1.基本介绍

image-20240304105809901

2.案例一
1.MonsterMapper.java
package com.sun.mapper;


import com.sun.entity.Monster;

import java.util.List;

/**
 * 这个接口用于声明操作monster表的方法
 *
 * @author 孙显圣
 * @version 1.0
 */
public interface MonsterMapper {
    //通过id或者名字查询
    public List<Monster> findMonsterByNameORId(Monster monster);

}

2.MonsterMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.MonsterMapper">
    <!--实现public List<Monster> findMonsterByNameORId(Monster monster);
	这里能直接写Monster是因为配置文件里配置了类型别名
	-->
    <select id="findMonsterByNameORId" parameterType="Monster" resultType="Monster">
        SELECT * FROM monster WHERE id = #{id} OR `name` = #{name}
    </select>
</mapper>
3.测试
package com.sun.mapper;

import com.sun.entity.Monster;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MonsterMapperTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private MonsterMapper monsterMapper;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        monsterMapper = sqlSession.getMapper(MonsterMapper.class);
        System.out.println(monsterMapper.getClass());
    }
    @Test
    public void test() {
        Monster monster = new Monster();
        monster.setId(1);
        monster.setName("大象精");
        List<Monster> monsterList = monsterMapper.findMonsterByNameORId(monster);
        for (Monster monster1 : monsterList) {
            System.out.println(monster1);
        }
        //关闭sqlsession
        if (sqlSession != null) {
            sqlSession.close();
        }
    }
}

image-20240304111611381

3.案例二(模糊查询)
1.MonsterMapper.java添加方法
    public List<Monster> findMonsterByName(String name);
2.MonsterMapper.xml添加实现类
    <!--实现public List<Monster> findMonsterByName(String name);-->
    <select id="findMonsterByName" parameterType="String" resultType="Monster">
        SELECT * FROM monster WHERE `name` LIKE '%${name}%'
    </select>
3.测试
    @Test
    public void MonsterMapper() {
        List<Monster> monsterList = monsterMapper.findMonsterByName("孙");
        for (Monster monster : monsterList) {
            System.out.println(monster);
        }
    }

image-20240304134750221

4.传入HashMap
1.基本介绍image-20240304135016653
2.案例一(参数为map)
1.MonsterMapper.java添加方法
    //传入map
    public List<Monster> findMonsterByIdAndName_ParamMap(Map<String, Object> map);
2.MonsterMapper.xml
    <!--这里如果想要获取到id和name则需要这个Map里面有这两个key-->
    <select id="findMonsterByIdAndName_ParamMap" parameterType="Map" resultType="Monster">
        SELECT * FROM monster WHERE id = #{id} OR `name` = #{name}
    </select>
3.测试
    @Test
    public void findMonsterByIdAndName_ParamMap() {
        Map map = new HashMap<String, Object>();
        map.put("id", 1);
        map.put("name", "大象精");
        List<Monster> monsters = monsterMapper.findMonsterByIdAndName_ParamMap(map);
        for (Monster monster : monsters) {
            System.out.println(monster);
        }
    }

image-20240304140423827

3.案例二(返回值为map)
1.MonsterMapper.java添加方法
    //以map作为返回参数
    public List<Map<String, Object>> findMonsterByIdAndName_ParamMap_returnMap(Map<String, Object> map);
2.MonsterMapper.xml
    <!--返回值是List,每一个元素都是一个map,而一个map代表了一条记录,key代表列,value代表值-->
    <select id="findMonsterByIdAndName_ParamMap_returnMap" parameterType="Map" resultType="Map">
        SELECT * FROM monster WHERE id = #{id} OR `name` = #{name}
    </select>
3.测试
    @Test
    public void findMonsterByIdAndName_ParamMap_returnMap() {
        Map map = new HashMap<String, Object>();
        map.put("id", 6);
        map.put("name", "大象精");
        List<Map<String, Object>> mapList = monsterMapper.findMonsterByIdAndName_ParamMap_returnMap(map);
        //取出所有map
        for (Map<String, Object> stringObjectMap : mapList) {
            for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) {
                System.out.println(entry.getKey() + " " + entry.getValue());
            }
        }
    }

image-20240304142058962

5.ResultMap
1.基本介绍

image-20240304142524912

2.案例
1.创建数据表
CREATE TABLE `user` (
	user_id INT NOT NULL auto_increment,
	user_email VARCHAR(255) DEFAULT '',
	user_name VARCHAR(255) DEFAULT'',
	PRIMARY KEY (user_id)
)
2.创建映射类User.java
package com.sun.entity;


/**
 * @author 孙显圣
 * @version 1.0
 */

public class User {
    private Integer user_id;
    //下面两个字段与数据表的字段不对应
    private String username; 
    private String useremail;

    public User() {
    }

    public User(Integer user_id, String username, String useremail) {
        this.user_id = user_id;
        this.username = username;
        this.useremail = useremail;
    }

    public Integer getUser_id() {
        return user_id;
    }

    public void setUser_id(Integer user_id) {
        this.user_id = user_id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUseremail() {
        return useremail;
    }

    public void setUseremail(String useremail) {
        this.useremail = useremail;
    }

    @Override
    public String toString() {
        return "User{" +
                "user_id=" + user_id +
                ", username='" + username + '\'' +
                ", useremail='" + useremail + '\'' +
                '}';
    }
}

3.UserMapper.java
UserMapper.xmlpackage com.sun.mapper;

import com.sun.entity.User;

import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface UserMapper {
    //查询所有UserMapper.xmlser
    public List<User> findAllUser();
}

4.UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.UserMapper">
    <select id="findAllUser" resultType="User">
        SELECT * FROM user
    </select>
</mapper>
5.测试(数据未填充!)
package com.sun.mapper;

import com.sun.entity.User;
import com.util.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class UserMapperTest {
    //两个属性
    private SqlSession sqlSession; //相当于连接
    private UserMapper userMapper;

    //编写方法完成初始化
    @Before //标注了Before之后表示了在执行目标测试方法前会执行该方法
    public void init() {
        //获取到sqlSession
        sqlSession = MyBatisUtils.getSqlSession();
        //获取到MonsterMapper对象
        userMapper = sqlSession.getMapper(UserMapper.class);
        System.out.println(userMapper.getClass());
    }

    @Test
    public void findAllUser() {
        List<User> allUser = userMapper.findAllUser();
        System.out.println(allUser);
    }
}

image-20240304145105755

6.使用resultMap替换resultType解决,修改UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--指定该xml文件和哪个接口对应-->
<mapper namespace="com.sun.mapper.UserMapper">
    <!--使用resultMap替换resultType,来进行映射类的属性与表之间的映射-->
    <resultMap id="findAllUserResultType" type="User">
        <result column="user_email" property="useremail"/>
        <result column="user_name" property="username"/>
    </resultMap>
    <select id="findAllUser" resultMap="findAllUserResultType">
        SELECT * FROM user
    </select>
</mapper>
7.结果

image-20240304155238444

3.注意事项与细节
  • 如果没有使用resultMap,但是表的列名与映射类的属性不匹配,则返回的结果不会填充,则该位置会是对象属性的默认值
  • 解决列名与属性名不同也可以使用别名,简单来说就是查询出来结果的时候使用as,将结果所在的列名设置成跟属性一致的名字,但是不推荐
  • MyBatis-Plus可以直接使用@TableField注解或者@TableName注解来解决

image-20240304155904444

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

诛吕政变后,为何会是代王刘恒登上皇位?

公元前179年——这一年对于汉帝国而言是非常特殊的一年。在这一年&#xff0c;汉惠帝的所有儿子被秘密杀害。也就在这一年&#xff0c;远在北疆的诸侯王——代王刘恒在汉朝功臣周勃、丞相陈平等人的支持下在长安登基。 自此&#xff0c;汉朝皇位完成了一次“乾坤大挪移”——汉…

10、算数运算符(以 ‘/’、‘%’、‘++’为主去讲解)(Java超详细版本)

算数运算符 一、算数运算符二、“ / ”的使用三、“ % ”的使用四、“ ”的使用⭐ 一、算数运算符 算数运算符是对数值类型的变量进行运算的&#xff0c;在Java程序中使用的非常多的。 二、“ / ”的使用 1、Java中 “ / ” 的运算结果是省略小数部分的整数&#xff0c;不存…

2024年美国市场亚太游戏品牌数字广告洞察报告

来源&#xff1a;Sensor Tower 美国是全球最大的游戏市场之一&#xff0c;也是亚太游戏品牌出海的重要市场。2023年Q2至2024年Q1&#xff0c;美国市​场广告投放额排名前10的亚太游戏品牌&#xff0c;合计支出 超过7.5亿美元&#xff0c;环比上涨23%。 排名第一的米哈游(miHoY…

DES加密解密算法(简单、易懂、超级详细)

目录 一、基础补充 二、什么是DES算法 &#xff08;1&#xff09;对称加密算法 &#xff08;2&#xff09;非对称加密算法 &#xff08;3&#xff09;对称加密算法的应用 三、DES算法的基础操作步骤 1.明文的加密整体过程 2.F轮函数解析 3.密钥的形成过程 四、AC代码 五、D…

电脑怎么压缩视频?win端、Mac端压缩工具分享~

我们经常需要处理和分享视频文件。然而&#xff0c;视频文件往往会占用大量的存储空间&#xff0c;特别是高分辨率和高质量的视频。为了方便存储和分享&#xff0c;我们常常需要将视频文件进行压缩。本文将介绍如何使用电脑系统win端或Mac端自带的视频编辑器、以及常用的剪辑软…

Golang——IO操作

1. 输入输出的底层原理 终端其实是一个文件(Linux下一切皆文件)&#xff0c;相关实例如下&#xff1a; os.Stdin&#xff1a;标准输出的文件实例&#xff0c;类型为*Fileos.Stdout&#xff1a;标准输入的文件实例&#xff0c;类型为*Fileos.Stderr&#xff1a;标准错误输出的文…

元器件的检测及万用表的使用

实验目的&#xff1a; 1. 了解万用表的结构和原理&#xff1b; 2. 识别常用电子元器件&#xff0c;学习使用万用表测量电阻、电感、电容和二极管的方法&#xff1b; 3. 学习使用万用表测量直流电压和直流电流的方法&#xff1b; 4. 理解万用表内阻对测量结果的影响&#xf…

pythonnet调用dll提示DragDrop注册失败

问题描述 解决方案 在引入clr之前&#xff0c;引入pythoncom&#xff0c;并做初始化 # 注意这段代码必须在import clr之前否则无效 import pythoncom pythoncom.CoInitialize() import clr

【文献解析】3D高斯抛雪球是个什么玩意

论文地址&#xff1a;https://arxiv.org/abs/2308.04079 项目&#xff1a;3D Gaussian Splatting for Real-Time Radiance Field Rendering 代码&#xff1a;git clone https://github.com/graphdeco-inria/gaussian-splatting --recursive 一、文章概述 1.1问题导向 辐射…

【学习笔记】HarmonyOS 4.0 鸿蒙Next 应用开发--安装开发环境

开发前的准备 首先先到官网去下载Devco Studio 这个开发工具&#xff0c;https://developer.harmonyos.com/cn/develop/deveco-studio/#download 提供了WIndows和Mac的开发环境&#xff0c;我自己是Windows的开发环境。 所以下载之后直接点击exe进行安装即可。 如果之前安装过…

时间如此珍贵,好的规划是成功的开始!防止时间流失!

时间如同沙子&#xff0c;无论你怎样去抓捏&#xff0c;都无法将其追回。对于我们每个人来说&#xff0c;时间都是一种宝贵的资源&#xff0c;我们需要合理利用它来实现我们的目标和梦想。然而&#xff0c;如果我们没有一个明确的计划&#xff0c;我们的行动将会变得毫无目的和…

使用单片机在图形点阵LCD上绘制波形图

使用单片机在图形点阵LCD上绘制波形图 需求&#xff1a; 假如有一组浮点数据&#xff0c;是通过AD转换得到的&#xff0c;保存在数组MyArray[]中&#xff0c;采集点数为len&#xff0c;采集周期为T&#xff0c;现在想用单片机在LCD上绘制出这组数据对应的波形图&#xff0c;该…

在做题中学习(50):搜索插入位置

35. 搜索插入位置 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a;二分查找 思路&#xff1a;题目是有序的&#xff0c;时间复杂度O(logN),二分没跑了&#xff0c;题目说如果找不到target&#xff0c;返回它应该被插入位置的下标&#xff0c;所以可以分析一下示例2&…

电子书3D翻页制作技巧大揭秘,轻松将文档转化为逼真仿真书!

随着数字化时代的到来&#xff0c;电子书已成为阅读的主流形式之一。然而&#xff0c;普通的电子书往往缺乏纸质书的质感和互动性&#xff0c;让人感到有些遗憾。今天&#xff0c;将为你揭秘电子书3D翻页制作技巧&#xff0c;让你轻松将文档转化为逼真仿真书&#xff01; 1.要制…

中国热门高端dating约会交友软件有哪些?国内权威Dating App红黑排行榜推荐

在dating 软件刷了无数个男人后终于脱单啦&#xff0c;跟大家分享一些我的个人感受 1、二狗 颜值⭐️⭐️⭐️ 真实性 ⭐️⭐️⭐️⭐️⭐️ 用户质量⭐️⭐️⭐️⭐️ ⭕️优点&#xff1a;整体用户质量较高&#xff0c;用户集中在金融、互联网和体制内行业。用户需进行学历、…

Oopsie从80端口到获取root权限的渗透过程

Oopsie 需要用到的工具burpnmapnc手写代码信息收集 由于是靶场的原因单一没有子站所以收集到ip就可以nmap扫描 拿到IP第一件事就是扫描端口 nmap -T4 -sV -sC -sS 10.129.24.79 -T4:提升扫描速度 -sV&#xff1a;查看详细版本 -sC:使用默认类别的脚本进行扫描 可更换其他类别…

ADC模-数转换原理与实现

1. 今日摸鱼计划 今天来学习一下ADC的原理&#xff0c;然后把ADC给实现 ADC芯片:ADC128S102 视频&#xff1a; 18A_基于SPI接口的ADC芯片功能和接口时序介绍_哔哩哔哩_bilibili 18B_使用线性序列机思路分析SPI接口的ADC芯片接口时序_哔哩哔哩_bilibili 18C_基于线性序列机的S…

“情况不明,对子先行”攻略

掼蛋作为一种策略性极强的游戏&#xff0c;不仅考验牌技&#xff0c;更考验玩家的智慧和策略布局。这里主要介绍一下当牌力不足的时候的普通策略—情况不明&#xff0c;对子先行。 当你的牌力不强&#xff0c;或者牌局情况不明朗时&#xff0c;自己手上有有比较多的对子&#x…

【前端】前端数据本地化的多种实现方式及其优劣对比

前端数据本地化的多种实现方式及其优劣对比 在现代Web开发中&#xff0c;提高页面响应速度和改善用户体验是核心目标之一。数据本地化是其中一种实现方式&#xff0c;它通过在客户端存储数据来减少服务器请求&#xff0c;从而加快数据载入速度和改善用户的体验。本文将介绍前端…

面试大全资料分享-工作无忧

找工作啦 面试大全资料分享 关注公众号 回复 面试大全 即可获取下载链接.
最新文章