当前位置: 首页 > news >正文

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

目录

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 mapperPUBLIC "-//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;}@Overridepublic 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 mapperPUBLIC "-//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 configurationPUBLIC "-//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 {@Testpublic 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);}@Testpublic 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);}@Testpublic 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);}@Testpublic 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)测试结果:

控制台:

数据库:

​​​​​​​​​​​​​​

相关文章:

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

目录 1、Mapper接口和映射文件关系 2、Mapper接口和映射文件的命名规则 2.1 Mapper接口的命名规则 2.2 映射文件的命名规则 3、Mapper接口和映射文件的创建及增删改查的实现 3.1 Mapper接口和映射文件的创建 3.2 增删改查的实现 3.2.1表结构 3.2.2 创建表User对应的实…...

【JS】怎么提取object类的内容

需求&#xff1a;在网页端中通过getElementsByClassName获取到一个元素&#xff0c;想提取其中的数字内容做个if判断&#xff0c;奈何一直提取不了 开始获取元素时&#xff0c;以为默认就是字符类型&#xff1b;但使用操作字符的函数就失败&#xff0c;然后就考虑数据类型是不是…...

分布式系统的 38 个知识点

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…...

机器学习基础(二)

线性回归 误差是独立并且具有相同的分布通常认为服从均值为0方差为的高斯分布。 损失函数(loss Function)/代价函数(Cost Function) 其实两种叫法都可以,损失函数(loss function)或代价函数(cost function)是将随机事件或其有关随机变量的取值映射为非负实数以表示该随…...

Java 实现Rtsp 转rtmp,hls,flv

服务支撑&#xff1a;FFmpeg srs(流媒体服务器) 整个流程是 FFmpeg 收流转码 推 rtmp 到流媒体服务 流媒体服务再 分发流到公网 搭建流媒体服务: 1. SRS (Simple Realtime Server) | SRS &#xff08;本例子使用的是SrS 安装使用docker &#xff09; 2.GitHub - ZLMedi…...

机器学习基础(三)

逻辑回归 场景 垃圾邮件分类 预测肿瘤是良性还是恶性 预测某人的信用是否良好 正确率与召回率 正确率与召回率(Precision & Recall)是广泛应用于信息检索和统计学分类领域的两个度量值,用来评价结果的质量。 一般来说,正确率就是检索出来的条目有多少是正确的,召回率就…...

Kubeadm安装K8s集群

一、硬件环境 准备3台Linux服务器&#xff0c;此处用Vmware虚拟机。 主机名CPU内存k8smaster2核4Gk8snode12核4Gk8snode22核4G 二、系统前置准备 配置三台主机的hosts文件 cat << EOF > /etc/hosts 192.168.240.130 k8smaster 192.168.240.132 k8snode1 192.168.…...

【C++】开源:spdlog跨平台日志库配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍spdlog日志库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…...

[Azkaban] No active executors found

没有找到活动的executors&#xff0c;需在MySQL数据库里设置端口为12321的executors表的active为1&#xff1a; select * from executors;如果显示active0 则需要进行处理&#xff1a; update azkaban.executors set active1;当active0&#xff0c;更新为1时&#xff0c;用 n…...

无涯教程-Perl - recv函数

描述 This function receives a message on SOCKET attempting to read LENGTH bytes, placing the data read into variable SCALAR.The FLAGS argument takes the same values as the recvfrom( ) system function, on which the function is based. When communicating wit…...

算法练习-搜索 相关

文章目录 迷宫问题 迷宫问题 定义一个二维数组 m行 * n列 &#xff0c;如 4 5 数组下所示&#xff1a; int arr[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, }; 它表示一个迷宫&#xff0c;1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只…...

PyQt5控件布局管理

Qt Designer提供了四种窗口布局&#xff1a;Vertical Layout(垂直布局) &#xff0c;Horizontal Layout(水平布局)&#xff0c;Grid Layout(栅格布局)&#xff0c;Form Layout(表单布局)&#xff0c;以及一种隐藏的布局—绝对布局 一般进行布局有两种方式&#xff1a; 一是通…...

TypeScript 一分钟让你理解泛型是什么

TypeScript 一分钟让你理解 泛型是什么 TS的泛型是指在定义函数、接口或类型时&#xff0c;不预先指定具体的类型&#xff0c;而是在使用时指定类型限制的一种特性。 泛型和函数中的参数比较类似&#xff0c;我们定义一个函数的时候有时会给它留一个参数名&#xff0c;在使用这…...

PatchMatchNet 训练dtu数据集、训练曲线查看、实操教程图图文详解、

文章目录 1 查看要求 下载数据集2 训练2.1 路径配置2.2 训练2.3 模型输出 与 训练曲线查看2.4 输出训练 log文件1 查看要求 下载数据集 在代码文件加下打开 README.md文件找到训练说明,查看那要求、下载训练集、训练方法 ## Training Download pre-processed [DTUs trainin…...

怎样制定测试计划和设计测试用例?

测试工作贯穿于整个软件开发生命周期&#xff0c;是一项庞大而复杂的工作&#xff0c;需要制订一个完整且详细的测试计划作为指导。测试计划是整个测试工作的导航图&#xff0c;但它并不是一成不变的&#xff0c;随着项目推进或需求变更&#xff0c;测试计划也会不断发生改变&a…...

教你如何为博客网站申请阿里云的免费域名HTTPS证书

如何为博客网站申请阿里云的免费域名HTTPS证书 文章目录 如何为博客网站申请阿里云的免费域名HTTPS证书前置条件&#xff1a;步骤1 例如阿里云控制台&#xff0c;选择SSL证书步骤2 申请购买免费证书步骤3 创建证书步骤3.1 证书申请步骤3.2 DNS域名验证 步骤4 等待证书审核成功&…...

在线Word怎么转换成PDF?Word无法转换成PDF文档原因分析

不同的文件格式使用方法是不一样的&#xff0c;而且也需要使用不同的工具才可以打开编辑内容&#xff0c;针对不同的场合用户们难免会用到各种各样的文件格式&#xff0c;要想在不修改内容的前提下提高工作效率&#xff0c;那就需要用到文件格式转换&#xff0c;那么在线Word怎…...

计算机网络:网络通信相关概念入门

目录 一、网络发展背景二、理解网络通信三、理解IP地址1.简述IP地址2.IP地址的版本3.提高地址利用率的技术 四、理解端口1.简述端口2.使用端口的原因 五、理解网络通信协议 一、网络发展背景 网络发展背景&#xff1a; 最初的计算机是单机&#xff0c;那么单机是这样传输数据的…...

Spring-2-透彻理解Spring 注解方式创建Bean--IOC

今日目标 学习使用XML配置第三方Bean 掌握纯注解开发定义Bean对象 掌握纯注解开发IOC模式 1. 第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1.1 XML管理Druid连接池(第三方Bean)对象【重点】 数据库准备 -- 创建数据库 create …...

LeetCode150道面试经典题--单词规律(简单)

1.题目 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 2.示例 pattern"abba" s "c…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...