MyBatis获取参数值的两种方式

5、MyBatis获取参数值的两种方式
MyBatis获取参数值的两种方式:KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{} 5.1、单个字面量类型的…{}和#{}以任意的名称获取参数的值,注意${}需要手动加单引号
${}
#{}
测试代码:
实验结果:

5.2、多个字面量类型的参数
若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;以
param1,param2…为键,以参数为值;因此只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:

5.3、map集合类型的参数
若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在
map中
只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:

5.4、实体类类型的参数
若mapper接口中的方法参数为实体类对象时
此时可以使用KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{},通过访问实体类对象中的属…{}需要手动加单引号
测试代码:
实验结果:

5.5、使用@Param标识参数
可以通过@Param注解标识mapper接口中的方法参数
此时,会将这些参数放在map集合中,以@Param注解的value属性值为键,以参数为值;以
param1,param2…为键,以参数为值;只需要通过KaTeX parse error: Expected 'EOF', got '#' at position 4: {}和#̲{}访问map集合的键就可以获…{}需要手动加单引号
测试代码:
实验结果:

尝试举一反三、尽可能测试你脑子里面的想法

实验目录的结构
在这里插入图片描述

UserMapper.java

package com.softeem.mapper;import com.softeem.pojo.User;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;import java.util.HashMap;
import java.util.List;
import java.util.Map;// UserMapper -> UserDao
public interface UserMapper {/*** 添加用户信息*/public int insertUser(User user);/** 删除用户*/public int deleteUser(int id);/*** 修改用户* */public int updateUser(User user);//单个字面量类型的参数/*** 查询一个用户对象* @return user对象*/public User getUserById(int id);/*** 查询多条数据* @return 返回List<User>*/public List<User> getUserList();//多个字面量类型的参数public List<User> getUserByNameAndEmail(String username,String email);//map集合类型的参数public List<User> getUserByNameAndSex(Map map);public List<User> getUserByAgeAndSex(@Param("myage") int age,@Param("mysex") String sex);public List<User> page(@Param("user") User user,@Param("pageNo") int pageNo ,@Param("pageSize") int pageSize);/***查询用户的总记录数*@return*在MyBatis中,对于Java中常用的类型都设置了类型别名*例如: java.lang.Integer-->int|integer*例如: int-->_int|_integer*例如: Map-->map  ,  List-->list*/int getCount();/***根据用户id查询用户信息为map集合*@param id*@return*///@MapKey("empno")Map<String, Object> getUserToMap(int id);}

User.java

package com.softeem.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {private Integer id;private String username;private String password;private Integer age;private String gender;private String email;}

UserMapper.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)保持一致-->
<mapper namespace="com.softeem.mapper.UserMapper"><!-- mapper接口中方法的方法名和映射文件中编写SQL的标签的id属性保持一致--><insert id="insertUser" parameterType="com.softeem.pojo.User">insert into t_user values(null,#{username},#{password},#{age},#{sex},#{email})</insert><!--int deleteUser();--><delete id="deleteUser" parameterType="int">delete from t_user where id = #{id}</delete><!--int updateUser();--><update id="updateUser" parameterType="com.softeem.pojo.User">update t_user set username=#{username},password=#{password},age=#{age},sex=#{sex},email=#{email} where id = #{id}</update><!--查询方法与增删改方法不一样.查询一定返回一个结果集的.单个字面量类型的参数:parameterType="int" 可以省略方法中的(int id) 不一定非要写id 可以是适合一个值--><!--User getUserById();--><select id="getUserById" resultType="com.softeem.pojo.User" parameterType="int"><!-- ${id}等于字符串拼接  #{id}等于?占位符 -->select * from t_user where id = ${id}</select><!--List<User> getUserList();--><select id="getUserList" resultType="com.softeem.pojo.User">select * from t_user</select><!-- 多个字面量类型的参数: 会自动封装成map对象 使用 arg0 arg1 or param1 param2 做为key来获取值--><!-- List<User> getUserByNameAndEmail(String username, String email);--><select id="getUserByNameAndEmail" resultType="com.softeem.pojo.User" parameterType="map">select * from t_user where username = #{param1} and email = #{param2}</select><select id="getUserByNameAndSex" resultType="com.softeem.pojo.User" parameterType="map">select * from t_user where username = #{username} and sex = #{sex}</select><select id="getUserByAgeAndSex" resultType="com.softeem.pojo.User"parameterType="com.softeem.pojo.User">select * from t_user where age=#{myage} and sex=#{mysex}</select><select id="page" resultType="com.softeem.pojo.User" parameterType="map">select * from t_user where sex = #{user.sex} limit #{pageNo},#{pageSize}</select><select id="getCount" resultType="int">select count(*) from t_user</select><select id="getUserToMap" resultType="java.util.Map" parameterType="int">select e.*,d.dname,d.loc from emp e , dept dwhere e.deptno = d.deptno and e.empno = #{id};</select></mapper>

jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mytest19?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456

mybatis-config

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><!--引入properties文件--><properties resource="jdbc.properties" /><settings>
<!--        开启驼峰标识, 数据库为下划线命名规则, 而实体类为驼峰标识, 不开启此选项无法查询出数据--><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--设置类型别名--><typeAliases><!--typeAlias:设置某个类型的别名属性:type:设置需要设置别名的类型alias:设置某个类型的别名,若不设置该属性,那么该类型拥有默认的别名,即类名且不区分大小写-->
<!--        <typeAlias type="com.softeem.pojo.User"></typeAlias>--><!--以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
<!--        com.softeem.mybatis.pojo.User -> user--><package name="com.softeem.pojo"/></typeAliases><!--设置连接数据库的环境--><!--environments:配置多个连接数据库的环境属性:default:设置默认使用的环境的id--><environments default="development"><!--environment:配置某个具体的环境属性:id:表示连接数据库的环境的唯一标识,不能重复--><environment id="development"><!--transactionManager:设置事务管理方式属性:type="JDBC|MANAGED"JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事 务的提交或回滚需要手动处理MANAGED:被管理,例如Spring--><transactionManager type="JDBC"/><!--dataSource:配置数据源属性:type:设置数据源的类型type="POOLED|UNPOOLED|JNDI"POOLED:表示使用数据库连接池缓存数据库连接UNPOOLED:表示不使用数据库连接池JNDI:表示使用上下文中的数据源--><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="peijie"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://192.168.1.10:3306/mytest20?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--引入映射文件--><mappers>
<!--        <mapper resource="mappers/UserMapper.xml"/>--><!--以包为单位引入映射文件要求:1、mapper接口所在的包要和映射文件所在的包一致2、mapper接口要和映射文件的名字一致--><package name="com.softeem.mapper"/></mappers>
</configuration>

UserMapperTest.java

package com.softeem.mappertest;import com.softeem.mapper.UserMapper;
import com.softeem.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class UserMapperTest {private UserMapper userMapper ;@Beforepublic void init() throws IOException {//InputStream in = UserMapperTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");//读取MyBatis的核心配置文件InputStream in = Resources.getResourceAsStream("mybatis-config.xml");//创建SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//通过核心配置文件所对应的字节输入流创建工厂类SqlSessionFactory,生产SqlSession对象SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);//创建SqlSession对象,此时通过SqlSession对象所操作的sql都必须手动提交或回滚事务//SqlSession sqlSession = sqlSessionFactory.openSession(false);//创建SqlSession对象,此时通过SqlSession对象所操作的sql都会自动提交SqlSession sqlSession = sqlSessionFactory.openSession(true);//通过代理模式创建UserMapper接口的代理实现类对象userMapper = sqlSession.getMapper(UserMapper.class);}@Testpublic void inserUserTest(){// System.out.println("userMapper = " + userMapper);User user = new User();user.setUsername("张三");user.setPassword("123");user.setSex("男");user.setAge(20);user.setEmail("123@q.com");int i = userMapper.insertUser(user);System.out.println("影响行i = " + i);}@Testpublic void deleteUserTest(){int i = userMapper.deleteUser(17);System.out.println("影响行i = " + i);}@Testpublic void updateUserTest(){User user = userMapper.getUserById(1);user.setUsername("张学友");int i = userMapper.updateUser(user);System.out.println("影响行i = " + i);}@Testpublic void getUserByIdTest(){User user = userMapper.getUserById(5);System.out.println("user = " + user);}@Testpublic void getUserListTest(){List<User> userList = userMapper.getUserList();//System.out.println("user = " + user);for (User user : userList) {System.out.println("user = " + user);}}@Testpublic void getUserByNameAndEmailTest(){List<User> users = userMapper.getUserByNameAndEmail("abc", "abc@qq.com");users.forEach(System.out::println);}@Testpublic void getUserByNameAndSex(){Map map = new HashMap( );map.put("username" , "abc");map.put("sex" , "男");List<User> users = userMapper.getUserByNameAndSex(map);users.forEach(System.out::println);}@Testpublic void getUserByAgeAndSexTest(){List<User> user = userMapper.getUserByAgeAndSex(20, "男");user.forEach(System.out::println);}@Testpublic void pageTest(){User user = new User();user.setSex("男");List<User> users =userMapper.page(user, (2-1)*5, 5);users.forEach(System.out::println);}@Testpublic void getCount(){int count = userMapper.getCount();System.out.println("count = " + count);}@Testpublic void getUserToMapTest(){Map<String, Object> userToMap = userMapper.getUserToMap(7369);System.out.println("userToMap = " + userToMap);}}

根据文中的相关的注释,足以理解mybatis获取参数的两种方式已经区别和相关的使用方式,动手实践一下把!

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

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

相关文章

CocosCreator3.8研究笔记(十五)CocosCreator 资源管理Asset Bundle

在资源管理模块中有一个很重要的功能&#xff1a; Asset Bundle&#xff0c;那什么是Asset Bundle &#xff1f;有什么作用&#xff1f;怎么使用 Asset Bundle呢 &#xff1f; 一、什么是Asset Bundle &#xff1f;有什么作用&#xff1f; 在日常游戏开发过程中&#xff0c;为了…

TCP详解之滑动窗口

TCP详解之滑动窗口 引入窗口概念的原因 我们都知道 TCP 是每发送一个数据&#xff0c;都要进行一次确认应答。当上一个数据包收到了应答了&#xff0c; 再发送下一个。 这个模式就有点像我和你面对面聊天&#xff0c;你一句我一句。但这种方式的缺点是效率比较低的。 如果你…

TS泛型的使用

函数中使用泛型&#xff1a; function identity<T>(arg: T): T {return arg; }let result identity<number>(10); // 传入number类型&#xff0c;返回number类型 console.log(result); // 输出: 10let value identity<string>(Hello); // 传入string类型&a…

TCP详解之重传机制

TCP详解之重传机制 TCP 实现可靠传输的方式之一&#xff0c;是通过序列号与确认应答。 在 TCP 中&#xff0c;当发送端的数据到达接收主机时&#xff0c;接收端主机会返回一个确认应答消息&#xff0c;表示已收到消息。 但在错综复杂的网络&#xff0c;并不一定能如上图那么顺…

阿里云无影云电脑详细介绍_无影优势价格和使用

什么是阿里云无影云电脑&#xff1f;无影云电脑&#xff08;原云桌面&#xff09;是一种快速构建、高效管理桌面办公环境&#xff0c;无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景&#xff0c;阿里云百科分享无影云桌面的详细介绍、租用价格、…

【CentOS7】vsftpd学习笔记

2023年9月14日&#xff0c;周四下午 目录 安装vsftpd添加账号给账户设置新密码开放21号端口关闭21号端口查看vsftpd的运行状态启动vsftpd关闭vsftpd查看CentOS7的IP地址在Windows测试你的运行在CentOS7的用vftpd构建的FTP服务器查看Windows自带的ftp程序有哪些可用的命令 安装…

【C++】list的模拟实现【完整理解版】

目录 一、list的概念引入 1、vector与list的对比 2、关于struct和class的使用 3、list的迭代器失效问题 二、list的模拟实现 1、list三个基本函数类 2、list的结点类的实现 3、list的迭代器类的实现 3.1 基本框架 3.2构造函数 3.3 operator* 3.4 operator-> 3…

FFmpeg入门之Windows/Linux下FFmpeg源码编译

1.源码下载: git clone https://github.com/FFmpeg/FFmpeg.git windows : macos: ubuntu: 2.编译FFmpeg CompilationGuide – FFmpeg windows: 1.下载yasm并安装 : Download - The Yasm Modular Assembler Project 下载后复制到c:/windows 2.下载SDL 3.下载H264/265源码 git…

Scrum敏捷开发流程及敏捷研发关键环节

Scrum是一个迭代式增量软件开发过程&#xff0c;是敏捷方法论中的重要框架之一。它通常用于敏捷软件开发&#xff0c;包括了一系列实践和预定义角色的过程骨架。Scrum中的主要角色包括Scrum主管&#xff08;Scrum Master&#xff09;、产品负责人&#xff08;Product Owner&…

《C++ primer plus》精炼(OOP部分)——对象和类(5)

“学习是照亮心灵的火炬&#xff0c;它永不熄灭&#xff0c;永不止息。” 文章目录 类的自动和强制类型转换原始类型转换为自定义类型将自定义类型转换为原始类型 类的自动和强制类型转换 原始类型转换为自定义类型 可以用一个参数的构造函数来实现&#xff0c;例如&#xff…

2023上半年软件设计师上午题目总结

1 在计算机中系统总线用于连接 主存及外设部件 2 在由高速缓存、主存、硬盘构成的三级存储体系中&#xff0c;CPU执行指令时需要读取数据&#xff0c;DMA控制器和中断CPU发出的数据地址是 主存物理地址 。 DMA&#xff08;Direct Memory Access&#xff09;控制器是计算机硬…

卡尔曼滤波(Kalman Filter)原理浅析-数学理论推导-1

目录 前言数学理论推导1. 递归算法2. 数学基础结语参考 前言 最近项目需求涉及到目标跟踪部分&#xff0c;准备从 DeepSORT 多目标跟踪算法入手。DeepSORT 中涉及的内容有点多&#xff0c;以前也就对其进行了简单的了解&#xff0c;但是真正去做发现总是存在这样或者那样的困惑…

Obsidian配置

插件 1&#xff1a;Annotator pdf批注插件&#xff0c;使用方法&#xff1a;新建一个markdown文件&#xff0c;在文件的头部必须时开头添加以下内容&#xff1a; --- annotation-target: xxx.pdf ---2&#xff1a;Hidden Folder 用正则表达式隐藏文件夹的&#xff0c;我的设…

UART 协议

文章目录 电气层硬件拓扑基本原理协议空闲位起始位数据位奇偶校验位无校验奇校验偶校验mark parityparity 停止位 波特率优缺点优点缺点 参考 UART(universal asynchronous receiver-transmitter) 通用异步收发器 分类特点导线2速度9600&#xff0c; 19200&#xff0c; 38400&…

Golang gorm manytomany 多对多 更新、删除、替换

Delete 移除 只删除中间表的数据 删除原有的 var a Article1db.Preload("Tag1s").Take(&a, 1)fmt.Printf("%v", a) {1 k8s [{1 cloud []} {2 linux []}]}mysql> select * from article1; ------------ | id | title | ------------ | 1 | k8s …

VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST SCSI设备的模拟是由QEMU和HOST共同实现的&#xff0c;QEMU模拟VHOST SCSI设备配置空间等&#xff0c;而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。 在QEMU中VHOST SCSI设备继承关系如下&#xff1a; 其它设备以及对应class_init函数和realize具现化实现与V…

链表-真正的动态数据结构

创建节点 public class Node {T val;Node next;public Node(T val, Node next) {this.val val;this.next next;}public Node() {this(null, null);}public Node(T val) {this(val, null);}} 创建一个空链表 //创建链表public Node header;private int size;public MyLinkedLi…

做一个有灵魂的软件测试员

有没有觉得自己每天的工作千篇一律&#xff0c;每天一上班就盼着下班&#xff1f; 一个月似乎能令自己开心的时间也就是发工资的那一天&#xff1f; 自己的工作生活总感觉被人牵着走&#xff0c;兜兜转转过了一年又一年&#xff1f; 测试员的工作性质决定了与重复、枯燥和乏…

知识库管理工具哪个好?我建议你可以试一下这个!

对于很多企业/用户来说&#xff0c;在职业成长和个人发展的过程中&#xff0c;是需要借助知识库管理工具来进行知识内容沉淀的。 随着工具市场的发展&#xff0c;各种知识库管理工具层出不穷&#xff0c;今天我就结合数据安全、知识管理体系、简单实用三个方面出发&#xff0c;…

HTTP协议(超级详细)

HTTP协议介绍 基本介绍&#xff1a; HTTP&#xff1a;超文本传输协议&#xff0c;是从万维网服务器传输超文本到本地浏览器的传送协议HTTP是一种应用层协议&#xff0c;是基于TCP/IP通信协议来传送数据的&#xff0c;其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现&#xff0…