MyBatis框架:创建Mapper接口和映射文件,实现基本增删改查

news2025/1/12 2:41:54

目录

1、Mapper接口和映射文件关系

2、Mapper接口和映射文件的命名规则

2.1 Mapper接口的命名规则

2.2 映射文件的命名规则

3、Mapper接口和映射文件的创建及增删改查的实现

3.1 Mapper接口和映射文件的创建

3.2 增删改查的实现

3.2.1表结构

3.2.2 创建表User对应的实体类

3.3.3 创建表User对应的Mapper接口

3.3.4 创建UserMapper接口对应的映射文件,并实现Sql语句

4、MyBatis核心配置文件关联Mapper接口和映射文件

5、测试Mapper接口中的方法

6、测试结果


1、Mapper接口和映射文件关系

个人理解为:Mapper接口类似于以前的Dao接口,映射文件类似于实现Dao接口中的各个方法。

在Mapper接口中定义了对数据库的各种操作方法,这些方法的实现需要在映射文件编写各种SQL语句。

2、Mapper接口和映射文件的命名规则

一个Mapper接口(映射文件)对应一个实体类,对应一张表的操作方法(SQL语句)。Mapper接口用于声明操作数据库的方法; MyBatis映射文件用于编写SQL,访问以及操作表中的数据。

MyBatis的Mapper接口的位置是src/main/项目名/mappers目录下;映射文件存放的位置是src/main/resources/mappers目录下。

2.1 Mapper接口的命名规则

表所对应的实体类的类名+Mapper

例如:表t_user,对应的实体类为User,所对应的Mapper为UserMapper。

2.2 映射文件的命名规则

表所对应的实体类的类名+Mapper.xml

例如:表t_user,映射的实体类为User,所对应的映射文件为UserMapper.xml 。

3、Mapper接口和映射文件的创建及增删改查的实现

3.1 Mapper接口和映射文件的创建

Mapper接口的创建和普通的Java接口创建方法相同。

映射文件的创建如下,mapper标签中的namespace属性是mapper接口的路径。

<?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">
<mapper namespace="Mapper接口路径">

</mapper>

3.2 增删改查的实现

下面以表t_user为例创建Mapper接口和映射文件,实现基本的增删改查。

3.2.1表结构

t_user表的结构如查下所示:

3.2.2 创建表User对应的实体类

public class User {
    private Integer id;
    private String userName;
    private String password;
    private Integer age;
    private char gender;

    public User() {
    }

    public User(Integer id, String userName, String password, Integer age, char gender) {
        this.id = id;
        this.userName = userName;
        this.password = password;
        this.age = age;
        this.gender = gender;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }
}

3.3.3 创建表User对应的Mapper接口

import com.review.mybatis.pojo.User;

public interface UserMapper {
    //添加用户
    int insertUser(User user);
    //根据用户名和密码删除用户
    int deleteUser(String username,String password);
    //修改用户信息
    int modifyUser(User user,Integer id);
    //根据用户名查询用户信息
    User getUserByUsername(String username);
}

3.3.4 创建UserMapper接口对应的映射文件,并实现Sql语句

MyBatis中可以面向接口操作数据,要保证两个一致:

1、mapper接口的全类名和映射文件的命名空间(namespace)保持一致

2、mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致

<?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">
<mapper namespace="com.review.mybatis.mapper.UserMapper">
<!--    int insertUser(User user);-->
    <insert id="insertUser" >
        insert into t_user(id,userName,password,age,gender) values(null,#{userName},#{password},#{age},#{gender})
    </insert>
<!--    int deleteUser(String username,String password);-->
    <delete id="deleteUser">
        delete from t_user where username=#{arg0} and password=#{arg1}
    </delete>
<!--    int modifyUser(User user,Integer id);-->
    <update id="modifyUser" >
        update t_user set username=#{arg0.userName},password=#{arg0.password},age=#{arg0.age},gender=#{arg0.gender} where id=#{arg1}
    </update>
<!--    User getUserByUsername(String username);-->
    <select id="getUserByUsername" resultType="User">
        select id,username,password,age,gender from t_user where username=#{arg0}
    </select>
</mapper>

上述代码中mapper接口和映射文件要保证一致:

①mapper接口的全类名和映射文件的namespace一致

②mapper接口的方法的方法名和映射文件中的sql的id保持一致

执行UserMapper接口中的方法时,通过映射文件中属性id绑定的方法名执行Sql语句。

对于查询操作:resultType:设置结果类型,记查询的数据要转换成的java类型,代码中将数据转成User类型

MyBatis获取参数值的两种方式:${}和#{}。

${}的本质就是字符串拼接,#{}的本质就是占位符赋值;${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号。

映射文件中无法识别Mapper接口方法中的形参,若mapper接口中的方法参数为一个时,可以用任何字符串表示该参数;若mapper接口中的方法参数为多个时 此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1...为键,以参数为值;以 param1,param2...为键,以参数为值;因此只需要通过${}和#{}访问map集合的键就可以获取相对应的值。

4、MyBatis核心配置文件关联Mapper接口和映射文件

通过包设置类型别名,指定包下所有的类型将全部拥有默认的别名,即类名且不区分大小写,方便UserMapper.xml文件中resultType属性的设置:

resultType=”User“等同于resultType="com.review.mybatis.pojo.User"

通过包设置类型别名如下所示:

<typeAliases>
    <package name="com.review.mybatis.pojo"/>
</typeAliases>

以包的方式引入映射文件,在通过Mapper接口调用方法时,通过MyBatis核心配置文件查找到映射文件的位置,从而执行sql语句。但是以包的方式引入映射文件必须满足两个条件:
1、mapper接口和映射文件所在的包必须一致
2、mapper接口的名字和映射文件的名字必须一致

如下所示:

    <mappers>
        <package name="com.review.mybatis.mapper"/>
    </mappers>

 完整的MyBatis核心配置文件如下:

<?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>
    <!--
        MyBatis核心配置文件中的标签必须要按照指定的顺序配置:
        properties?,settings?,typeAliases?,typeHandlers?,
        objectFactory?,objectWrapperFactory?,reflectorFactory?,
        plugins?,environments?,databaseIdProvider?,mappers?
    -->
    <properties resource="jdbc.properties"/>
    <typeAliases>
        <package name="com.review.mybatis.pojo"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"/>
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>

        <environment id="test">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
                <property name="username" value="root"/>
                <property name="password" value="123456789"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.review.mybatis.mapper"/>
    </mappers>
</configuration>

MyBatis配置文件:配置连接数据库的环境,实现数据库连接_qq_46053741的博客-CSDN博客

5、测试Mapper接口中的方法

创建一个测试类,测试Mapper接口中的方法:

import com.review.mybatis.mapper.UserMapper;
import com.review.mybatis.pojo.User;
import com.review.mybatis.utils.JdbcUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;


public class UserMapperTest {

    @Test
    public void insertUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isInsert=0;
        isInsert=userMapper.insertUser(new User(null,"小黑子","1234",34,'男'));
        if(isInsert>0){
            System.out.println("数据添加成功");
        }else{
            System.out.println("数据添加失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void deleteUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        int isDelete=0;
        isDelete=userMapper.deleteUser("蔡徐坤","123456");
        if(isDelete>0){
            System.out.println("数据删除成功");
        }else{
            System.out.println("数据删除失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void modifyUser() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=new User(3,"小黑子","1234",30,'男');
        int isModify=0;
        isModify=userMapper.modifyUser(user,3);
        if(isModify>0){
            System.out.println("数据修改成功");
        }else{
            System.out.println("数据修改失败");
        }
        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }

    @Test
    public void getUserByUsername() {
        SqlSession sqlSession= JdbcUtil.getSqlSession();
        //获取UserMapper的代理实现类对象
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
        User user=userMapper.getUserByUsername("小黑子");

        System.out.println(user);

        JdbcUtil.closeSqlSessionAndCommit(sqlSession);
    }
}

代码中UserMapper接口无法实例化对象,因此采用UserMapper的代理实现类对象
      

UserMapper userMapper=sqlSession.getMapper(UserMapper.class);

6、测试结果

int insertUser(User user)测试结果:
控制台:

数据库:


int modifyUser(User user,Integer id)测试结果:
控制台:

数据库:

User getUserByUsername(String username)测试结果:
控制台:

int deleteUser(String username,String password)测试结果: 
控制台:

数据库: 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excel 之 VBA

1、excel和VBA 高效办公&#xff0c;把重复性的工作写成VBA代码&#xff08;VB代码的衍生物&#xff0c;语法和VBA相同&#xff09;。 首先打开开发工具模式&#xff0c;如果没有选显卡&#xff0c;需要手动打开 打开程序编辑界面 快捷键 altF11一般操作 程序调试&#xf…

详解JAVA远程debug

目录 1.什么是远程debug&#xff1f; 2.远程debug普通JAVA程序 环境 测试程序 程序启动指令 编译器配置 3.远程debug JAVA Web程序 4.远程debug spring boot程序 1.什么是远程debug&#xff1f; 远程debug&#xff0c;也就是可以在本地debug远端部署的程序&#xff0c…

深入浅出:MyBatis的使用方法及最佳实践

这里写目录标题 添加MyBatis框架⽀持配置连接字符串和MyBatis配置连接字符串配置 MyBatis 中的 XML 路径 添加业务代码创建数据库和表添加用户实体类添加 mapper 接⼝添加 UserMapper.xml添加 Service层添加 Controller层 增删改操作增加操作删除操作修改操作 添加MyBatis框架⽀…

vue3+ts+vite全局配置Element-Plus主题色

概述 我找了很多博客&#xff0c;想全局配置Elmenet-Plus组件主题色&#xff0c;但都没有效果。所以有了这篇博客&#xff0c;希望能对你有所帮助&#xff01;&#xff01;&#xff01; 文章目录 概述一、先看效果二、创建全局颜色文件2.1 /src/styles 下新建 element-plus.sc…

王道机组难题分析

第四章 指令系统 大端方式&#xff1a;就是高地址存放高位&#xff0c; LSB的意思是&#xff1a;全称为Least Significant Bit&#xff0c;在二进制数中意为最低有效位 MSB的意思是&#xff1a;全称为Most Significant Bit&#xff0c;在二进制数中属于最高有效位 操作数可以理…

设备工单管理系统如何实现工单流程自动化?

设备工单管理系统属于工单系统的一种&#xff0c;基于其丰富的功能&#xff0c;它可以同时处理不同的多组流程&#xff0c;旨在有效处理发起人提交的事情&#xff0c;指派相应人员完成服务请求和记录全流程。该系统主要面向后勤管理、设备维护、物业管理、酒店民宿等服务行业设…

微服务07-分布式缓存

前提: 单机的Redis存在四大问题: 解决办法:基于Redis集群解决单机Redis存在的问题 1、Redis持久化 Redis有两种持久化方案: RDB持久化AOF持久化1.1 RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所…

redis的基础命令01

1、操作库的指令 1、清除当前库---flushdb 2、清除所有库---flushAll 2、操作key的指令 最常用的指令get、set 1&#xff09;set key value 2&#xff09;get key 基础指令 1、del 删除单个&#xff1a;del key 、批量删除&#xff1a;del key1 key2 key3 2、exists 判断key是否…

jpa查询返回自定义对象、返回指定VO、POJO

jpa查询返回自定义对象、返回指定VO、POJO jpa查询返回自定义对象、返回指定VO、POJO&#xff0c;JPA查询前会做大量处理&#xff0c;还有线程通知的操作。若并发大&#xff0c;处理性能直线下降。但是jpa就因为做了大量处理&#xff0c;对多数据库兼容极好&#xff0c;操作方…

QT之UDP通信

QT之UDP通信 UDP不分客户端口服务器,只需要使用一个类QUdpSocket QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = udp TEMPLATE = app# The following define makes your compiler emit warnings if you use # any feature of Qt …

通义大模型:打造更智能、更灵活的自然语言处理技术

大家好&#xff0c;今天我想向大家介绍一款备受瞩目的自然语言处理技术——通义大模型。作为一种基于深度学习的人工智能技术&#xff0c;通义大模型能够模拟人类的思维方式&#xff0c;实现更智能、更灵活的自然语言处理&#xff0c;为我们的生活和工作带来了极大的便利。 在…

Java解决四大查找(一)

Java解决四大查找 一.线性查找1.1 题目1.2 思路分析1.3 代码演示 二.二分查找(双指针法)2.1 题目2.2 思路分析(图解加文字)2.3 代码演示 一.线性查找 1.1 题目 在数组{1&#xff0c;8&#xff0c;1024&#xff0c;521&#xff0c;1889}中查找数字8&#xff0c;如果有&#xff…

数学建模(二)线性规划

课程推荐&#xff1a;6 线性规划模型基本原理与编程实现_哔哩哔哩_bilibili 在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支&#xff1a;数学规划。而线性规划(Linear Program…

基于 FPGA 的电机控制

FPGA 非常适合精密电机控制&#xff0c;在这个项目中&#xff0c;我们将创建一个简单的电机控制程序&#xff0c;在此基础上可以构建更复杂的应用。 需要的硬件 Digilent Pmod HB3 介绍 我们可以用一个简单的 8 位微控制器来控制电机&#xff0c;输出一个简单的脉宽调制波形。然…

201、仿真-基于51单片机PT100测温设计铂电阻温度计设计Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、设计功能 二、Proteus仿真图 三、原理图 四、程序源码 资料包括&#xff1a; 方案选择 单片机的选择 方案一&#xff1a;STM32系列单片机控制&#xff0c;该型号单片机为LQFP44封装&#xff0c;内部资源足够用于本次设…

Linux学习之sed保持空间

echo 1#sed#s >> holdSpaceTest.txt echo 2#deep#d >> holdSpaceTest.txt echo 3#good#g >> holdSpaceTest.txt echo 4#hood#h >> holdSpaceTest.txt把下边的内容写入到holdSpaceTest.txt中&#xff1a; 1#sed#s 2#deep#d 3#good#g 4#hood#htac holdS…

windows任务栏右下角不显示网络图标解决方法

1、背景 我运行windows诊断服务之后&#xff0c;然后重启了一把电脑&#xff0c;结果发现电脑无法上网了&#xff0c;进一步发现任务栏右下角的网络显示图标也没有了&#xff0c;网络状态显示也是一条横线。 几经折腾终于给解决了&#xff0c;遇到了不少坑&#xff0c;记录一…

2022年09月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:指定顺序输出 依次输入3个整数a、b、c,将他们以c、a、b的顺序输出。 时间限制:1000 内存限制:65536 输入 一行3个整数a、b、c,以空格分隔。 0 < a,b,c < 108 输出 一行3个整数c、a、b,整数之间以一个空格分隔。 样例输入 1 2 3 样例输出 3 1 2 以下是使用C语言…

腾讯出品Pag动画框架在Android端的使用-初级

Pag动画框架作为一个第三方框架&#xff0c;它的优缺点与Lottie是相似&#xff0c;此处不过多赘述。如果你们的项目中打算用了&#xff0c;肯定是经过了一定的调研的。Pag动画框架分几个版本&#xff0c;有免费的有收费的。我们目前用的社区免费版&#xff0c;只用来展示Pag动画…

Vue2到3 Day5 全套学习内容,众多案例上手(内付源码)

简介&#xff1a; Vue2到3 Day1-3 全套学习内容&#xff0c;众多案例上手&#xff08;内付源码&#xff09;_星辰大海1412的博客-CSDN博客本文是一篇入门级的Vue.js介绍文章&#xff0c;旨在帮助读者了解Vue.js框架的基本概念和核心功能。Vue.js是一款流行的JavaScript前端框架…