从头开始学MyBatis—02基于xml和注解分别实现的增删改查

首先介绍此次使用的数据库结构,然后引出注意事项。

通过基于xml和基于注解的方式分别实现了增删改查,还有获取参数值、返回值的不同类型对比,帮助大家一次性掌握两种代码编写能力。

目录

数据库

数据库表

实体类

对应的实体类如下:

注意事项

1)两种占位符的说明

①#{}

②${}

2)增、删、改的返回值说明

3)查询操作

①必须指定resultType或是resultMap

4)对应关系

①数据库名与类名不一致的情况

②字段名与属性名不一致的情况

1.获取参数值的方式

1.1基于xml

1.1.1单个参数

①mapper

②xml

③test

④结果

1.1.2多个参数

①mapper

②xml

写法一

写法二

③test

④结果

1.1.3map参数

①mapper

②xml

③test

④结果

1.1.4实体类参数

①mapper

②xml

③test

④结果

1.1.5使用@Param标识参数

①mapper

写法一

写法二

错误写法

②xml

③test

④结果

1.2基于注解

1.2.1单个参数

①mapper

写法一

写法二

②test

③结果

1.2.2多个参数

①mapper

 ②test

③结果

1.2.3map参数

①mapper

②test

③结果

1.2.4实体类参数

①mapper

②test

③结果

1.2.5使用@Param标识参数

①mapper

写法一

写法二

②test

③结果

2.各种操作功能

2.1基于xml

2.1.1增

①mapper

②mapper.xml

③test

④结果

主键id自增并返回值

mapper

mapper.xml

test

结果

2.1.2删

①mapper

②mapper.xml

③test

④结果

删除前

删除后

2.1.3改

①mapper

②mapper.xml

③test

④结果

修改前

修改后

2.1.4查

①mapper

②mapper.xml

③test

④结果

2.2基于注解

2.2.1增

①mapper

②test

③结果

主键id自增并返回结果

mapper

test

结果

2.2.2删

①mapper

②test

③结果

删除前

删除后

2.2.3改

①mapper

②test

③结果

修改前

修改后

2.2.4查

①mapper

②test

③结果

3.各种返回值类型

3.1基于xml

①查询单条数据

②查询多条数据

3.2基于注解

①查询单条数据

②查询多条数据


数据库

数据库表

此次实验的数据库表结构如下,包含主键id和三个属性

实体类

对应的实体类如下:

import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** ClassName: Book* Package: com.ykx.domain* Description: mybatis学习的数据库表tbl_book对应的实体类*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tbl_book")
public class Book {private Integer id;private String type;private String name;private String description;
}

注意事项

1)两种占位符的说明

①#{}

传入的参数当成一个字符串,会给传入的参数加单引号

能够很大程度上防止sql注入

一般用于替换某个值

②${}

将传入的参数值直接显示生成在sql中,不会自动加引号

预编译之前就已经被变量替换,无法防止sql注入

一般用于替换表、字段名

2)增、删、改的返回值说明

返回值固定位Integer,表示受影响的行数

3)查询操作

①必须指定resultType或是resultMap

不配置别名的时候,值为类的全类名

返回值是集合的时候,只需指定集合的泛型即可,如

List<Book> getAll();<select id="getAll" resultType="com.ykx.pojo.Book">select * from tbl_book
</select>

4)对应关系

①数据库名与类名不一致的情况

②字段名与属性名不一致的情况

1.获取参数值的方式

MyBatis 提供了多种传递参数的方式到 SQL 。

理解参数传递的机制有助于提高代码的可读性、灵活性。

1.1基于xml

1.1.1单个参数

①mapper
Book getById(Integer id);
②xml

在单个字面量参数的情况下,{}内的名称可以任意取

如下面的代码可以把#{id} 改成 #{ID}亦或是其他

<select id="getById" resultType="com.ykx.domain.Book">select * from tbl_book where id = #{id}
</select>
③test
@Test
public void testSelect(){Book book = bookMapperXML.getById(1);System.out.println(book);
}
④结果

1.1.2多个参数

①mapper
Book check(String type,String name);
②xml
写法一
<select id="check" resultType="com.ykx.domain.Book">select * from tbl_book where type = #{type} and name = #{name}
</select>
写法二
<select id="check" resultType="com.ykx.domain.Book">select * from tbl_book where type = #{param1} and name = #{param2}
</select>
③test
@Test
public void testCheck(){Book book = bookMapperXML.check("java","mybatis数据");System.out.println(book);
}
④结果

1.1.3map参数

①mapper
Book checkByMap(Map<String,String> map);
②xml
<select id="checkByMap" resultType="com.ykx.domain.Book">select * from tbl_book where type = #{type} and name = #{name}
</select>
③test
@Test
public void testCheckByMap(){Map<String,String> map = new HashMap<>();map.put("type","java");map.put("name", "mybatis数据");Book book = bookMapperXML.checkByMap(map);System.out.println(book);
}
④结果

1.1.4实体类参数

①mapper
Integer insert(Book book);
②xml
<insert id="insert">insert into tbl_book (type,name,description) values(#{type},#{name},#{description})
</insert>
③test
@Test
public void testInsert(){Book book = new Book(null,"计算机视觉","三维重建","基于深度学习的三维重建");Integer ans = bookMapperXML.insert(book);System.out.println("受影响的行数:" + ans);
}
④结果

1.1.5使用@Param标识参数

 在字段名和属性名对不上或是参数名和字段名对不上的时候很有用

①mapper
写法一
Book check(@Param("type") String type, @Param("name") String name);
写法二
Book check(@Param("type") String type2, @Param("name") String name2);
错误写法
Book check(String type2, String name2);
②xml
<select id="check" resultType="com.ykx.domain.Book">select * from tbl_book where type = #{type} and name = #{name}
</select>
③test
@Test
public void testCheck(){Book book = bookMapperXML.check("java","mybatis数据");System.out.println(book);
}
④结果

1.2基于注解

1.2.1单个参数

①mapper

单个参数的情况下,接口的参数名和注解里的sql语句参数可以不一致

写法一
@Select("select * from tbl_book where id = #{id}")
Book getById(Integer id);
写法二
@Select("select * from tbl_book where id = #{aa}")
Book getById(Integer id);
②test
@Test
public void testSelect(){Book book = bookMapper.getById(78);System.out.println(book);
}
③结果

1.2.2多个参数

①mapper

注:在未使用@Param的情况下,参数名不对应或是顺序不一样会导致查询失败

@Select("select * from tbl_book where type = #{type} and name = #{name}")
Book getOne(String type,String name);
 ②test
@Test
public void testGetOne(){Book book = bookMapper.getOne("计算机视觉","三维重建");System.out.println(book);
}
③结果

1.2.3map参数

①mapper
@Select("select * from tbl_book where type = #{type} and name = #{name}")
Book getByMap(Map<String, String> map);
②test

注:map里的key值要和#{}里的值对应,否则出现查询失败的情况

@Test
public void testByMap(){Map<String,String> map = new HashMap<>();map.put("type","java");map.put("name", "mybatis数据");Book book = bookMapper.getByMap(map);System.out.println(book);
}
③结果

1.2.4实体类参数

①mapper
@Insert("insert into tbl_book (id,type,name,description) " +"values(#{id},#{type},#{name},#{description})")
Integer insert(Book book);
②test
@Test
public void testInsert(){Book book = new Book(null,"新增数据","测试新增","不带id的新增测试");Integer ans = bookMapper.insert(book);System.out.println("受影响的行数:" + ans);
}
③结果

1.2.5使用@Param标识参数

只需要#{}里的值和@Param()里的值一样就行

①mapper
写法一
@Select("select * from tbl_book where type = #{type} and name = #{name}")
Book getOne(@Param("type") String type,@Param("name") String name);
写法二
@Select("select * from tbl_book where type = #{type} and name = #{name}")
Book getOne(@Param("type") String typeaa,@Param("name") String nameaa);
②test
@Test
public void testGetOne(){Book book = bookMapper.getOne("计算机视觉","三维重建");System.out.println(book);
}
③结果

2.各种操作功能

2.1基于xml

2.1.1增

①mapper
//增:实体对象新增数据
Integer insert(Book book);
②mapper.xml
<insert id="insert">insert into tbl_book (id,type,name,description) values(#{id},#{type},#{name},#{description})
</insert>

:这里设置了id主键自增的话,可以不设置和传入id

③test
//增:实体对象新增数据
@Test
public void testInsert(){Book book = new Book(71,"计算机视觉","三维重建","基于深度学习的三维重建");Integer ans = bookMapperXML.insert(book);System.out.println("受影响的行数:" + ans);
}
④结果

主键id自增并返回值

关键点:在xml里需要带上useGeneratedKeys和keyProperty

mapper
Integer autoId(Book book);
mapper.xml
<insert id="autoId" useGeneratedKeys="true" keyProperty="id">insert into tbl_book (type,name,description) values(#{type},#{name},#{description})
</insert>
test
//增:主键自增且返回值
@Test
public void testAutoId(){Book book = new Book(null,"测试id自增","返回主键id","是否成功获取id的值");Integer ans = bookMapperXML.autoId(book);System.out.println("受影响的行数:" + ans);System.out.println("获取主键自增的id值:" + book.getId());
}
结果

2.1.2删

①mapper
//删:根据id删除数据
Integer delete(Integer id);
②mapper.xml
<delete id="delete">delete from tbl_book where id = #{id};
</delete>
③test
//删:根据id删除数据
@Test
public void testDelete(){Integer ans = bookMapperXML.delete(68);System.out.println("受影响的行数:" + ans);
}
④结果

删除前

删除后

2.1.3改

①mapper
//改:根据id修改数据
Integer update(Book book);
②mapper.xml
<update id="update">update tbl_book set type = #{type},name = #{name},description = #{description} where id = #{id};
</update>
③test
//改:根据id修改数据
@Test
public void testUpdate(){Book book = new Book(58,"测试修改","mybatis修改","基于xml的修改操作");Integer ans = bookMapperXML.update(book);System.out.println("受影响的行数:" + ans);
}
④结果

修改前

修改后

2.1.4查

①mapper
@Mapper
public interface BookMapperXML {//查:根据id查询数据Book getById(Integer id);//查:查询所有数据List<Book> getAll();}
②mapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ykx.mapper.BookMapperXML"><select id="getById" resultType="com.ykx.domain.Book">select * from tbl_book where id = #{id}</select><select id="getAll" resultType="com.ykx.domain.Book">select * from tbl_book</select>
</mapper>
③test
@SpringBootTest
public class XMLMybatisTest {@Autowiredprivate BookMapperXML bookMapperXML;//查:根据id查询数据@Testpublic void testSelect(){Book book = bookMapperXML.getById(1);}//查:查询所有数据@Testpublic void testGetAll(){List<Book> books = bookMapperXML.getAll();for(Book book : books){System.out.println(book);}}}
④结果

2.2基于注解

2.2.1增

①mapper
@Insert("insert into tbl_book (id,type,name,description) " +"values(#{id},#{type},#{name},#{description})")
Integer insert(Book book);
②test
//增:实体对象新增数据
@Test
public void testInsert(){Book book = new Book(11,"新增数据","测试新增","带id的新增测试");Integer ans = bookMapper.insert(book);System.out.println("受影响的行数:" + ans);
}
③结果

主键id自增并返回结果

关键点:在mapper对应的方法上面加上@Options注解,并设置useGeneratedKeys和keyProperty的属性值。这个只能搭配insert语句使用!

mapper
@Options(useGeneratedKeys = true,keyProperty = "id")
@Insert("insert into tbl_book (type,name,description) " +"values(#{type},#{name},#{description})")
Integer autoId(Book book);
test
//增:主键自增且返回值
@Test
public void testAutoId(){Book book = new Book(null,"新增数据2","测试新增2","不带id的新增测试");Integer ans = bookMapper.autoId(book);System.out.println("受影响的行数:" + ans);System.out.println("获取主键自增的id值:" + book.getId());
}
结果

2.2.2删

①mapper
//删:根据id删除数据
@Delete("delete from tbl_book where id = #{id}")
Integer delete(Integer id);
②test
//删:根据id删除数据
@Test
public void testDelete(){Integer ans = bookMapper.delete(8);System.out.println("受影响的行数:" + ans);
}
③结果

删除前

删除后

2.2.3改

①mapper
//改:根据id修改数据
@Update("update tbl_book set type = #{type}, name = #{name}, description = #{description} where id = #{id}")
Integer update(Book book);
②test
//改:根据id修改数据
@Test
public void testUpdate(){Book book = new Book(62,"测试修改","mybatis修改","基于注解的修改操作");Integer ans = bookMapper.update(book);System.out.println("受影响的行数:" + ans);
}
③结果
修改前

修改后

2.2.4查

①mapper
//查:根据id查询数据
@Select("select * from tbl_book where id = #{id}")
Book getById(Integer id);//查:查询所有数据
@Select("select * from tbl_book")
List<Book> getAll();
②test
//查:根据id查询数据
@Test
public void testSelect(){Book book = bookMapper.getById(71);System.out.println(book);
}//查:查询所有数据
@Test
public void testGetAll(){List<Book> books = bookMapper.getAll();for(Book book : books){System.out.println(book);}
}
③结果

3.各种返回值类型

对于增、删、改操作一般返回值类型为integer,表示数据表受影响的行数。对于查询操作,一般返回值类型为实体类或是集合类型。

前面已经对增、删、改返回integer进行了测试,这里就不再赘述,下面对查询操作的返回值进行一个总结。

3.1基于xml

①查询单条数据

mapper层接口用对应的实体类接收

//查:根据id查询数据
Book getById(Integer id);

xml文件设置resultType为具体的实体类类型

<select id="getById" resultType="com.ykx.domain.Book">select * from tbl_book where id = #{id}
</select>

②查询多条数据

mapper层接口用List集合接收,其泛型为对应的实体类类型

//查:查询所有数据
List<Book> getAll();

xml文件设置resultType为具体的实体类类型

<select id="getAll" resultType="com.ykx.domain.Book">select * from tbl_book
</select>

3.2基于注解

①查询单条数据

mapper层接口的返回值类型设置为对应的实体类类型即可

//查:根据id查询数据
@Select("select * from tbl_book where id = #{id}")
Book getById(Integer id);

②查询多条数据

mapper层接口的返回值类型设置为List集合,其泛型为对应的实体类类型即可

//查:查询所有数据
@Select("select * from tbl_book")
List<Book> getAll();

原创内容 未经同意禁止转载 如有引用请标明出处

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode每日一题】——912.排序数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 优先队列 二【题目难度】 中等 三【题目编号】 912.排序数组 四【题目描述】 给你一个整数…

H5 three.js 实现六年级观察物体

o(&#xffe3;▽&#xffe3;)ブ 我又带着新的demo来啦~ 预览 功能点 立方体的阴影 立方体的添加 位置记录 最大限制 三视图展示 立方体的移除 答题模式 随机出题 题库出题 源码 注释算是比较全了&#xff0c;可能部分会有点绕&#xff0c;还能够再优化一下~ <!DOCTYPE …

【第35章】Spring Cloud之Seata-Server快速入门

文章目录 前言一、准备1. 架构图2. 工作机制3. Seata术语4. 事务模式4.1 Seata AT 模式(依赖数据库)4.2 Seata TCC 模式(不依赖数据库)4.3 Seata Saga 模式(支持长事务)4.4 Seata XA 模式(支持XA 协议) 二、安装1. 下载2. 解压3. 重要属性4. 修改配置4.1 配置中心4.2 注册中心4…

C语言 13 指针

指针可以说是整个 C 语言中最难以理解的部分了。 什么是指针 还记得在前面谈到的通过函数交换两个变量的值吗&#xff1f; #include <stdio.h>void swap(int, int);int main() {int a 10, b 20;swap(a, b);printf("a %d, b %d", a, b); }void swap(int …

循环神经网络RNN+长短期记忆网络LSTM 学习记录

循环神经网络&#xff08;RNN) RNN的的基础单元是一个循环单元&#xff0c;前部序列的信息经处理后&#xff0c;作为输入信息传递到后部序列 x为输入向量&#xff0c;y为输出向量&#xff0c;a为上一隐藏层的a与x通过激活函数得到的值&#xff0c;简言之&#xff0c;每一层神…

华为 HCIP-Datacom H12-821 题库 (23)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.以下关于 VRRP 基本概念的描述&#xff0c;错误的是哪些选项&#xff1f; A、一个虚拟路由器…

S32K3 工具篇6:如何将RTD EB工程导入到S32DS

S32K3 工具篇6&#xff1a;如何将RTD EB工程导入到S32DS 1. MCAL_Plugins->Link Source Resource Filters2. Includes3. Preprocessor4. Linker5. optimization6. main.c 这个主题实际上&#xff0c;之前已经有多人写过&#xff0c;并且写的很好&#xff0c;只是实际操作中&…

qt-creator-10.0.2之后版本的jom.exe编译速度慢下来了

1、Qt的IDE一直在升级&#xff0c;qt-creator的新版本下载地址 https://download.qt.io/official_releases/qtcreator/ 2、本人一直用的是qt-creator-10.0.2版本&#xff0c;官网历史仓库可以下载安装包qt-creator-opensource-windows-x86_64-10.0.2.exe https://download.qt…

URP 线性空间 ui资源制作规范

前言&#xff1a; 关于颜色空间的介绍&#xff0c;可参阅 unity 文档 Color space URP实现了基于物理的渲染&#xff0c;为了保证光照计算的准确&#xff0c;需要使用线性空间&#xff1b; 使用线性空间会带来一个问题&#xff0c;ui资源在unity中进行透明度混合时&#xff…

COMP 6714-Info Retrieval and Web Search笔记week1

哭了哭了&#xff0c;这周唯一能听懂的就这门 目录 IR&#xff08;Information Retrieval)是什么&#xff1f;IR的基本假设Unstructured (text) vs. structuredDocuments vs. Database Records比较文本&#xff08;Comparing Text&#xff09;IR的范围(Dimensions of IR)IR的任…

YoloV10改进策略:上采样改进|动态上采样|轻量高效,即插即用(适用于分类、分割、检测等多种场景)

摘要 本文使用动态上采样改进YoloV10,动态上采样是今天最新的上采样改进方法,具有轻量高效的特点,经过验证,在多个场景上均有大幅度的涨点,而且改进方法简单,即插即用! 论文:《DySample:Learning to Upsample by Learning to Sample》 论文:https://arxiv.org/pdf/…

fmql之ubuntu移植

官方资料&#xff1a;ubuntu18的压缩包 目的&#xff1a;放到SD卡中启动ubuntu&#xff08;官方是放在emmc中&#xff09; 教程&#xff1a;99_FMQL45_大黄蜂开发板跑ubuntu18.04.docx 所需文件 其中&#xff0c;format_emmc_ext4.txt对emmc的分区是512M&#xff08;放上述文…

C++ | Leetcode C++题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution { public:int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;}else if (n % 4 1) {ans 2;n / 2;}else {if (n 3) {ans 2;n 1;}else {ans 2;n n / 2 1;}}}return ans;} };

如何查看串口被哪个程序占用?截止目前最方便的方法

痛点&#xff1a;串口因为某种原因被占用&#xff0c;如何找到罪魁祸首&#xff1f; 做开发的小伙伴们&#xff0c;经常会遇到这样的问题&#xff1a;串口因为某种原因被占用&#xff0c;导致无法通讯&#xff0c;但是又找不到被哪个程序占用。只有重启电脑&#xff0c;才能解…

CSS“多列布局”(补充)——WEB开发系列35

多列布局是一种非常常见的布局方式&#xff0c;适用于内容丰富的页面&#xff0c;如新闻网站、杂志或博客。 一、CSS多列布局概述 CSS多列布局允许我们将内容分成多个垂直列&#xff0c;使页面布局更加灵活和多样化。多列布局的主要属性包括 ​​column-count​​、​​column…

「数组」堆排序 / 大根堆优化(C++)

目录 概述 核心概念&#xff1a;堆 堆结构 数组存堆 思路 算法过程 up() down() Code 优化方案 大根堆优化 Code(pro) 复杂度 总结 概述 在「数组」快速排序 / 随机值优化|小区间插入优化&#xff08;C&#xff09;中&#xff0c;我们介绍了三种基本排序中的冒泡…

Java工具插件

一、springboot集成mqtt订阅 阿里云MQTT使用教程_复杂的世界311的博客-CSDN博客_阿里云mqtt 阿里云创建MQTT服务 先找到产品与服务,然后选择物联网平台,找到公共实例,创建一个产品。 创建产品 然后在左侧下拉栏找到设备管理,在设备管理下拉栏找到设备,然后添加设备。添加…

博客建站9 - hexo网站如何提升markdown文档的编辑效率和体验

1. 本网站的系统架构2. 场景概述3. 影响效率的问题和解决方案 3.1. 图片插入-根据文章来分类管理 3.1.1. 效率问题3.1.2. 解决方案 3.2. 图片插入-从剪贴板中插入图片 3.2.1. 效率问题3.2.2. 解决方案 3.3. 图片插入-在VSCode中预览图片 3.3.1. 效率问题3.3.2. 解决方案 3.4. 提…

【软考】设计模式之责任链模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。2.将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为…

个人学习笔记7-5:动手学深度学习pytorch版-李沐

#人工智能# #深度学习# #语义分割# #计算机视觉# #神经网络# 计算机视觉 13.10 转置卷积 例如&#xff0c;卷积层和汇聚层&#xff0c;通常会减少下采样输入图像的空间维度&#xff08;高和宽&#xff09;。然而如果输入和输出图像的空间维度相同&#xff0c;在以像素级分类…