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

Mybatis05-参数和返回

一、传参

1-1、简单类型

简单类型包括:

  • byte short int long float double char(基本数据类型)
  • Byte Short Integer Long Float Double Character(包装类)
  • String
  • java.util.Date
  • java.sql.Date
类型用途特点
java.util.Date通用日期时间类,Java 标准库的一部分包含日期 + 时间信息
java.sql.Date专门用于 JDBC,表示 SQL 中的 DATE 类型(只有日期时间会被清零(00:00:00)

 

1、基本类型或单个参数

示例:

Student selectById(Long id);

对应的 Mapper XML:

<select id="selectById" resultType="Student" parameterType="java.lang.Long">SELECT * FROM t_student WHERE id = #{id}
</select>

说明:

  • 只有一个参数时,#{} 中写任意名字都可以(推荐使用参数名)。

  • parameterType 是可选的,但写上更规范。因为Mybatis框架自身带有类型自动判断机制,所以,大部分情况下paramterType属性都是可以省略不写的

SQL语句最终是这样的:

select * from t_student where id = ?

JDBC代码是一定要给?传值的。

怎么传值?ps.setXxx(第几个问号,传什么值);

ps.setLong(1, 1L);

ps.setString(1, "zhangsan");

ps.setDate(1, new Date());

ps.setInt(1, 100); ...

mybatis底层到底调用setXxx的哪个方法,取决于parameterType属性的值。

【注意】:

parameterType的值是可以起别名的,Mybatis本身自定义了许多别名:

具体可以查看配置文件:

配置_MyBatis中文网

1-2、传递 Map 参数

示例:

    @Testpublic void testInsertStudent() throws ParseException {SqlSession sqlSession = SqlSessionUtils.openSession();StudentMapper studentMapper = sqlSession.getMapper(StudentMapper.class);SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");Date birth = simpleDateFormat.parse("1996-09-09");Map<String, Object> map = new HashMap<>();map.put("key1", "王五");map.put("key2", 15);map.put("key3", 1.65);map.put("key4", birth);map.put("key5", '女');int count = studentMapper.insertStudent(map);System.out.println(count);sqlSession.commit();sqlSession.close();}
int insertStudent(Map<String, Object> map);
    <insert id="insertStudent" parameterType="map">insert into t_student(id, name, age, height, birth, sex)value(null, #{key1}, #{key2}, #{key3}, #{key4}, #{key5})</insert>

【注意】:

  • Map 中的 key 对应 #{} 的名字。

  • paramterType可以省略!

1-3、传递 Java 对象(POJO)

示例:

int insertStudent(Student student);
<insert id="insertStudent" parameterType="Student">INSERT INTO t_student(name, age, gender)VALUES(#{name}, #{age}, #{gender})
</insert>

 说明:

  • MyBatis 会自动读取 student.getName()student.getAge()

  • #{} 中写的是属性名

  • parameterType可以省略!

  • parameterType可以写全类名

  • parameterType可以写别名student,应为配置了:

1-4、多个参数

1、方式一: 

mybatis自动创建的map,key是索引,value是参数名。 

【备注】:

1、此时xml中不需要写parameterType,因为,多个参数,类型可能不一致!

2、此方法可读性比较差! 

 

2、方式二:使用 @Param 注解(推荐)

相当于告诉mybatis,自动创建的map,key的名字是通过 @Param 注解指定的!

示例:

 

二、查询语句的返回值

2-1、返回单个 POJO 对象

示例:

Car selectById(String carNum);
    <select id="selectById" resultType="com.wsbazinga.bank.pojo.Car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefrom t_carwhere id = #{id}</select>

2-2、返回 List<POJO>

示例:

List<Car> selectAll();
    <select id="selectAll" resultType="car">selectid,car_num as carNum,brand,guide_price as guidePrice,produce_time as produceTime,car_type as carTypefromt_car</select>

【注意】:

若是返回的结果是list,但是返回参数却是pojo,则会报错!TooManyResultException

2-3、返回 Map

若是返回的数据,没有合适的实体类对应的话,可以采用map集合接收,字段名叫key,字段值叫value。

示例:

Map<String, Object> selectReMap(Long id);

【注意】:

此时返回的结果要是单条数据!

2-4、返回 List<Map>

若是返回的数据,没有合适的实体类对应的话,可以采用map集合接收。

示例:

List<Map<String, Object>> selectReMap2(String brand);

2-5、返回值类型是 Map<String, Map>

这种情况表示:

  • 最外层是一个 Mapkey 是某个字段的值(例如 idname 等)

  • value 是一条记录,用 Map<String, Object> 表示字段名和字段值

【目的】:

方便查找数据!

MyBatis 提供了 @MapKey 注解,让你将某一列作为 Map 的 key。 

示例:

2-6、使用 resultMap(复杂映射)

查询结果的列名,和java对象的属性名对应不上怎么办?

方式1、起别名:

方式2:使用resultMap进行结果映射

Car selectReResMap(Long id);

 

方式3:是否开启驼峰命名自动映射

前提:

java命名规范:首字母小写,后面每个单词,首字母大写。

sql命名规范:全部小写,单词之间下划线分割。

实体类中的属性名数据库表的列名
carNumcar_num
carTypecar_type

开启该功能,在mybatis-config.xml中配置:

<settings><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

2-7、MyBatis 查询总记录条数

当然可以!MyBatis 查询总记录条数是非常常见的需求,通常用于:

  • 分页(PageHelper、手动分页)

  • 数据分析(如统计注册用户数量)

  • 判断是否存在数据(返回条数是否大于0)


2-7-1、基本查询:使用 COUNT(*)


1. Mapper 接口定义

int countAllStudents();

2. 对应 Mapper XML

<select id="countAllStudents" resultType="int">SELECT COUNT(*) FROM t_student
</select>

3. 使用方式

int count = studentMapper.countAllStudents();
System.out.println("总人数:" + count);

2-7-2、带条件查询总数(如:查询年龄大于20的学生数量)


1. Mapper 方法

int countByAge(int age);

2. Mapper XML

<select id="countByAge" resultType="int" parameterType="int">SELECT COUNT(*) FROM t_student WHERE age &gt; #{age}
</select>

注意:XML 中 > 要写成 &gt;


2-7-3、返回类型可以是 intlong

SQL推荐返回类型
COUNT(*)long(更保险,尤其是大表)
业务能确保不会超过 21 亿int
Long count = studentMapper.countSomething();
http://www.dtcms.com/a/279358.html

相关文章:

  • 以太网供电(PoE)电源
  • 编程语言设计目的与侧重点全解析(主流语言深度总结)
  • vue中使用西瓜播放器xgplayer (封装)+xgplayer-hls 播放.m3u8格式视频
  • Spark 单机模式安装与测试全攻略​
  • STM32小实验1--点亮LED
  • # 电脑待机后出现死机不能唤醒怎么解决?
  • 【终极指南】ChatGPT/BERT/DeepSeek分词全解析:从理论到中文实战
  • 2025年人工智能与网络安全国际会议(IACAINS 2025)
  • vim扩展
  • Python Web框架对比:Flask vs FastAPI
  • Kubernetes控制器详解
  • 重复频率较高的广告为何一直在被使用?
  • JAVA经典单例模式
  • 纯CSS轮播
  • 动手学深度学习13.9. 语义分割和数据集 -笔记练习(PyTorch)
  • 文件摆渡系统:如何攻克跨网文件交换难点,实现安全合规传输?
  • ISO-IEC-IEEE 42010架构规范
  • 用Finalshell连接服务器后出现文件目录不显示,且刷新报错空指针问题记录
  • 【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA
  • 探索文本切分的多种方法与应用场景
  • 学习 Flutter (三):玩安卓项目实战 - 上
  • 152.Vue3中使用OpenLayers+Turf实现遮罩布挖洞效果
  • MCP终极篇!MCP Web Chat项目实战分享
  • 消费 Kafka 一个TOPIC数据,插入到另一个KAFKA的TOPIC
  • c#如何将不同类型的数据存储到一起
  • 项目进度依赖纸面计划,如何提升计划动态调整能力
  • 基于FinRL深度强化学习框架的股票预测和回测交易
  • 迁移学习:知识复用的智能迁移引擎 | 从理论到实践的跨域赋能范式
  • 什么是神经网络,常用的神经网络,如何训练一个神经网络
  • python 循环遍历取出偶数