MyBatis框架-XML映射器

文章目录

    • XML映射器
      • CRUD操作
        • select
          • 根据id查询用户
          • 根据名字和密码查询
          • 方法一:使用对象
          • UserMapper.java
          • UserMapper.xml
          • 测试用例
          • 方法二:使用Map
          • UserMapper.java
          • UserMapper.xml
          • 测试用例
          • 方法三:方法种传递参数
          • UserMapper.java
          • UserMapper.xml
          • 测试用例
        • insert
          • **给数据库增加一个用户**
          • UserMapper.java
          • UserMapper.xml
          • 测试用例
        • update
          • UserMapper.java
          • UserMapper.xml
          • 测试用例
        • delete
          • UserMapper.java
          • UserMapper.xml
          • 测试用例
      • selectKey

XML映射器

MyBatis 的真正强大在于它的语句映射,这是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出):

  • cache – 该命名空间的缓存配置。
  • cache-ref – 引用其它命名空间的缓存配置。
  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
  • sql – 可被其它语句引用的可重用语句块。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。

CRUD操作

select

查询语句是 MyBatis 中最常用的元素之一——光能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。 MyBatis 的基本原则之一是:在每个插入、更新或删除操作之间,通常会执行多个查询操作。因此,MyBatis 在查询和结果映射做了相当多的改进。一个简单查询的 select 元素是非常简单的。

根据id查询用户
public interface UserMapper {//查询user表数据List<User> selectUser();//根据id查询用户User selectUserById(int id);}

UserMapper.xml

<!--id : 与mapper层的接口做映射parameterType : 参数类型resultType : 返回的类型对象
-->
<select id="selectUserById" resultType="com.sin.pojo.User" parameterType="int">select * from user where id = #{id}
</select>

#{id}告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中,

类似于

// 近似的 JDBC 代码,非 MyBatis 代码...
String selectPerson = "SELECT * FROM PERSON WHERE ID=?";
PreparedStatement ps = conn.prepareStatement(selectPerson);
ps.setInt(1,id);

测试用例

@Test
public void selectUserById(){SqlSession session = MyBatisUtil.getSession();UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.selectUserById(2));
}
根据名字和密码查询
方法一:使用对象
UserMapper.java
  • 参数传入对象
//根据用户名和密码查询
User findByUserAndPwd(User user);
UserMapper.xml
<select id="findByUserAndPwd" resultType="com.sin.pojo.User" parameterType="com.sin.pojo.User">select * from user where name = #{name} and pwd = #{pwd}
</select>
测试用例
@Test
public void selectByUserAndPwd(){SqlSession session = MyBatisUtil.getSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = new User();user.setName("张三");user.setPwd("321321");System.out.println(mapper.findByUserAndPwd(user));}
方法二:使用Map
UserMapper.java
//根据用户名和密码查询
User findByUserAndPwd2(Map<String,Object> map);
UserMapper.xml
<select id="findByUserAndPwd2" resultType="com.sin.pojo.User"parameterType="java.util.Map">select * from user where name = #{name} and pwd = #{pwd}
</select>
测试用例
@Test
public void selectByUserAndPwd2(){SqlSession session = MyBatisUtil.getSession();UserMapper mapper = session.getMapper(UserMapper.class);Map<String,Object> map = new HashMap<>();map.put("name","张三");map.put("pwd","321321");System.out.println(mapper.findByUserAndPwd2(map));}
方法三:方法种传递参数
UserMapper.java
  • 在接口方法的参数前加@Param属性
  • Sql语句编写的时候,直接取@Param中设置的值即可,不需要单独设置参数类型
//根据用户名和密码查询
User findByUserAndPwd3(@Param("username") String username, @Param("pwd") String pwd);
UserMapper.xml
<select id="findByUserAndPwd3" resultType="com.sin.pojo.User">select * from user where name = #{username} and pwd = #{pwd}
</select>
测试用例
@Test
public void selectByUserAndPwd3(){System.out.println(mapper.findByUserAndPwd3("张三","321321"));
}
<selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY">

Select 元素的属性

属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。
resultType期望从这条语句中返回结果的类全限定名或别名。 注意,如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身的类型。 resultType 和 resultMap 之间只能同时使用一个。
resultMap对外部 resultMap 的命名引用。结果映射是 MyBatis 最强大的特性,如果你对其理解透彻,许多复杂的映射问题都能迎刃而解。 resultType 和 resultMap 之间只能同时使用一个。
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:false。
useCache将其设置为 true 后,将会导致本条语句的结果被二级缓存缓存起来,默认值:对 select 元素为 true。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
fetchSize这是一个给驱动的建议值,尝试让驱动程序每次批量返回的结果行数等于这个设置值。 默认值为未设置(unset)(依赖驱动)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
resultSetTypeFORWARD_ONLY,SCROLL_SENSITIVE, SCROLL_INSENSITIVE 或 DEFAULT(等价于 unset) 中的一个,默认值为 unset (依赖数据库驱动)。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。
resultOrdered这个设置仅针对嵌套结果 select 语句:如果为 true,则假设结果集以正确顺序(排序后)执行映射,当返回新的主结果行时,将不再发生对以前结果行的引用。 这样可以减少内存消耗。默认值:false
resultSets这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。
insert
给数据库增加一个用户
UserMapper.java
//添加一条用户
int addUser(User user);
UserMapper.xml
<insert id="addUser" parameterType="com.sin.pojo.User">insert into  user(id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
测试用例
@Test
public void addUser(){SqlSession session = MyBatisUtil.getSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = new User(5,"王五","123456");System.out.println(mapper.addUser(user));session.commit();//提交事务,重点!不写的话不会提交到数据库
}
update

修改用户的信息

UserMapper.java
//修改一个用户
int updateUser(User user);
UserMapper.xml
<update id="updateUser" parameterType="com.sin.pojo.User">update user set name = #{name},pwd = #{pwd} where id = #{id}
</update>
测试用例
@Test
public void testUpdateUser(){SqlSession session = MyBatisUtil.getSession();UserMapper mapper = session.getMapper(UserMapper.class);User user = mapper.selectUserById(1);user.setName("赵六");user.setPwd("123456");int i = mapper.updateUser(user);System.out.println(mapper.selectUserById(1));session.commit();//提交事务,session.close();
}
delete

根据id删除一个用户

UserMapper.java
//根据id删除用户
int deleteUserById(int id);
UserMapper.xml
<delete id="deleteUserById" parameterType="com.sin.pojo.User">delete  from user where id = #{id};
</delete>
测试用例
@Test
public void deleteUesrById(){SqlSession session = MyBatisUtil.getSession();UserMapper mapper = session.getMapper(UserMapper.class);System.out.println(mapper.deleteUserById(5));session.commit();//提交事务,List<User> users = mapper.selectUser();for (User user: users){System.out.println(user);}session.close();
}
<insertid="insertAuthor"parameterType="com.sin.pojo.User"flushCache="true"statementType="PREPARED"keyProperty=""keyColumn=""useGeneratedKeys=""timeout="20"><updateid="updateAuthor"parameterType="com.sin.pojo.User"flushCache="true"statementType="PREPARED"timeout="20"><deleteid="deleteAuthor"parameterType="com.sin.pojo.User"flushCache="true"statementType="PREPARED"timeout="20">

Insert, Update, Delete 元素的属性

属性描述
id在命名空间中唯一的标识符,可以被用来引用这条语句。
parameterType将会传入这条语句的参数的类全限定名或别名。这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)。
parameterMap用于引用外部 parameterMap 的属性,目前已被废弃。请使用行内参数映射和 parameterType 属性。
flushCache将其设置为 true 后,只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值:(对 insert、update 和 delete 语句)true。
timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为未设置(unset)(依赖数据库驱动)。
statementType可选 STATEMENT,PREPARED 或 CALLABLE。这会让 MyBatis 分别使用 Statement,PreparedStatement 或 CallableStatement,默认值:PREPARED。
useGeneratedKeys(仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false。
keyProperty(仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn(仅适用于 insert 和 update)设置生成键值在表中的列名,在某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,是必须设置的。如果生成列不止一个,可以用逗号分隔多个属性名称。
databaseId如果配置了数据库厂商标识(databaseIdProvider),MyBatis 会加载所有不带 databaseId 或匹配当前 databaseId 的语句;如果带和不带的语句都有,则不带的会被忽略。

selectKey

<selectKeykeyProperty="id"resultType="int"order="BEFORE"statementType="PREPARED">

selectKey元素属性

属性描述
keyPropertyselectKey 语句结果应该被设置到的目标属性。如果生成列不止一个,可以用逗号分隔多个属性名称。
keyColumn返回结果集中生成列属性的列名。如果生成列不止一个,可以用逗号分隔多个属性名称。
resultType结果的类型。通常 MyBatis 可以推断出来,但是为了更加准确,写上也不会有什么问题。MyBatis 允许将任何简单类型用作主键的类型,包括字符串。如果生成列不止一个,则可以使用包含期望属性的 Object 或 Map。
order可以设置为 BEFOREAFTER。如果设置为 BEFORE,那么它首先会生成主键,设置 keyProperty 再执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 中的语句 - 这和 Oracle 数据库的行为相似,在插入语句内部可能有嵌入索引调用。
statementType和前面一样,MyBatis 支持 STATEMENTPREPAREDCALLABLE 类型的映射语句,分别代表 Statement, PreparedStatementCallableStatement 类型。

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

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

相关文章

如何看待开发者是否需要入坑鸿蒙?

前言 自打华为2019年发布鸿蒙操作系统以来&#xff0c;网上各种声音百家争鸣。尤其是2023年发布会公布的鸿蒙4.0宣称不再支持Android&#xff0c;更激烈的讨论随之而来。 通过本文&#xff0c;我将给大家介绍以下几点&#xff0c;让大家清楚的了解到鸿蒙开发的趋势&#xff1…

win11设置mysql开机自启

目录 命令式 1、打开命令提示符或 PowerShell&#xff1a; 2、使用管理员权限运行命令行工具&#xff1a; 3、设置 MySQL 服务为开机自启动&#xff1a; 4、启动 MySQL 服务&#xff1a; 5、 验证设置是否生效&#xff1a; 操作视图式 1、右击任务栏 ---> 选择任务管…

深入了解DRAM和SDRAM:内存带宽的计算与封装形式的奥秘

SSD SDRAM DDR SDRAM简介 动态随机存取存储器DRAM&#xff08;Dynamic Random Access Memory&#xff0c;DRAM&#xff09;是一种半导体存储器。 其主要的作用原理是利用电荷内存储电荷的数量来代表一个二进制比特&#xff08;bit&#xff09;是1还是0。 由于在现实中品体管…

【物联网之·协议·ZigBee】

系列文章目录 文章目录 前言一、ZigBee技术概述1.1 ZigBee的起源和发展历程1.2 ZigBee的工作原理和网络拓扑结构1.3 ZigBee的应用领域和主要优势 二、ZigBee协议栈2.1 Zigbee的协议栈结构和各层功能2.2 Zigbee协议栈的协议消息和数据格式 三、ZigBee网络配置3.1 Zigbee网络的组…

嵌⼊式⾯试宝典

编程功底问题 1. 简单描述下C语⾔中⼤⼩端的概念 ⼤⼩端是⼀种计算机存储数据的⽅式,它决定了在内存中如何排列多字节数据的字节顺序。 ⼤端:多字节数据的⾼位字节存储在内存的低地址处。 ⼩端:多字节数据的低位字节存储在内存的低地址处。 8051 stc单⽚机是⼩端模式 …

进京证12次不够用怎么办?(北京进京证探头分布,进京证365,进京365)外地车在京如何行驶——躲猫猫外地车在京地图导航

其实想要在北京驾驶外地牌照的车辆主要有两种方式&#xff0c;一种是办理进京证(六环内进京证一年只能办12次&#xff0c;一次有效期7天&#xff0c;所以大多数人是不够用的);另一种就是在非监控区域行驶&#xff0c;可以借助于一些摄像头定位工具&#xff0c;有效躲避摄像头&a…

洗地机哪个牌子好?2024洗地机推荐

洗地机作为一种几乎替代了传统无线吸尘器的清洁工具&#xff0c;近年来在市场上迅速崛起。其优越的清洁效果和智能化设计使其成为许多家庭不可或缺的家电之一。在短短的几年时间里&#xff0c;市场上涌现出了各种各样的品牌和型号&#xff0c;价格也从几百元到数千元不等&#…

LVGL部件

一.标签部件 1.如何创建标签部件以及设置文本 ![2024-01-28T09:54:08.png][3] void my_lvgl(void) {lv_obj_t *lablelv_label_create(lv_scr_act()); //创建一个标签lv_label_set_text(lable,"hello"); //普通更改文字lv_label_set_text_fmt(lab…

【C语言】(9)分支结构

一.if-else 语句 if-else 适用于简单和复杂的条件判断。 a. 基本 if 语句 用途&#xff1a;基本的条件测试。语法&#xff1a;if (condition) {// 代码块 }示例&#xff1a;if (score > 60) {printf("及格\n"); }b. if-else 语句 用途&#xff1a;二选一的条件…

基础小白快速学习c语言 ---c语言的简单介绍

c语言是由一个或者多个函数组成的&#xff0c;函数是由语句组成的&#xff0c;语句要用&#xff1b;结束 c语言开发过程&#xff1a; 1 创建一个源程序 2 预处理并且编程 c语言中的标准输入和标准输出 标准输出&#xff1a;printf printf是c语言标准库中提供的一个函数&…

有哪些原型图设计工具是你应该熟悉的?

今天我们将介绍 5 优秀的原型设计工具及其功能。每个软件都有不同的平台和价格范围。相信你能找到最适合你的原型工具&#xff01; 1、Sketch 以友好的用户而闻名 Sketch&#xff0c;对于设计师来说&#xff0c;有很多实用的功能。这个软件在图形编辑方面很受欢迎&#xff0c;…

【Django开发】前后端分离美多商城项目:项目准备和搭建(附代码,文档)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论django商城项目开发相关知识。本项目利用Django框架开发一套前后端不分离的商城项目&#xff08;4.0版本&#xff09;含代码和文档。功能包括前后端不分离&#xff0c;方便SEO。采用Django Jinja2模板引擎 Vue.js实现…

【webrtc】m98 : vs2019 直接构建webrtc及moduletest工程 2

字数有限制,我们继续 【webrtc】m98 : vs2019 直接构建webrtc及unitest工程 1modules_unittests 构建 Build started... 1>------ Build started: Project: modules_unittests, Configuration: GN Win32 ------ 1>ninja: Entering directory `G:\CDN\rtcCli\m98\src\o…

linux centos 查看端口是否打开与打开端口

查看端口是否打开 talnet talnet ip 端口linux查看防火墙开放情况 firewall-cmd --list-all打开端口 其中permanent表示永久生效&#xff0c;public表示作用域&#xff0c;443/tcp表示端口和类型&#xff0c;执行规则的重载 firewall-cmd --zonepublic --add-port443/tcp …

VitePress-04-文档中的表情符号的使用

说明 vitepress 的文档中是支持使用表情符号的&#xff0c;像 &#x1f602; 等常用的表情都是支持的。 本文就来介绍它的使用方式。 使用语法 语法 &#xff1a; :表情名称: 例如 &#xff1a; :joy: &#x1f602; 使用案例代码 # 体会【表情】的基本使用 > hello world …

Netty的高级用法(一)

前言 我们直到在网络通信中客户端和服务端之间除了要传输数据外&#xff0c;还会进行简单的心跳应答通信&#xff0c;使得客户端和服务端的连接处于一种活跃状态&#xff0c;那么客户端可以发送ONE_WAY和TWO_WAY两种方式的处理&#xff0c;而服务端在处理这两种类型的数据时会…

全民拼购模式深度解析:理解如何叫成败皆得利

每天五分钟讲解一个商业模式&#xff0c;大家好我是啊浩说模式Zeropan_HH 欢迎来到全民拼购模式的奇妙世界&#xff01;今天&#xff0c;我将带领大家深入了解这个在互联网上热度正旺的商业模式&#xff0c;同时分享如何在这个模式中的参与和获益。 近年来&#xff0c;随着社交…

4核16G幻兽帕鲁服务器优惠价格表,阿里云和腾讯云报价

幻兽帕鲁服务器价格多少钱&#xff1f;4核16G服务器Palworld官方推荐配置&#xff0c;阿里云4核16G服务器32元1个月、96元3个月&#xff0c;腾讯云幻兽帕鲁服务器服务器4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64…

构建知识图谱:从技术到实战的完整指南

目录 一、概述二、知识图谱的基础理论定义与分类核心组成历史与发展 三、知识获取与预处理数据源选择数据清洗实体识别 四、知识表示方法知识表示模型RDFOWL属性图模型 本体构建关系提取与表示 五、知识图谱构建技术图数据库选择Neo4jArangoDB 构建流程数据预处理实体关系识别图…

matlab窗函数-hann窗和hamming窗函数

窗函数的作用 在时域上&#xff0c;窗函数可以看作是对原始信号进行截断或调制的加权函数。这些窗函数通常在时域上是有限的宽度&#xff0c;并且具有对称性&#xff0c;如矩形窗、汉宁窗、汉明窗和布莱克曼窗等。例如&#xff0c;汉明窗是一种对称窗函数&#xff0c;它可以用…