MyBatis参数处理和查询语句专题

news2024/11/13 8:10:42

MyBatis参数处理和查询语句专题

  • 一、MyBatis参数处理
    • 1.单个简单类型参数
    • 2.单个Map参数
    • 3.单个实体类参数
    • 4.多参数
    • 5.@Param注解(命名参数)
  • 二、MyBatis查询语句专题
    • 1.结果映射
      • (1)as 给列起别名
      • (2)使⽤resultMap进⾏结果映射
      • (3)是否开启驼峰命名⾃动映射(配置settings)
    • 2.返回实体类
    • 3.返回List
    • 4.返回Map
    • 5.返回List<Map>
    • 6. 返回Map<String,Map>
    • 7.返回总记录条数


一、MyBatis参数处理

1.单个简单类型参数

  • 简单类型包括:
    • byte short int long float double char
    • Byte Short Integer Long Float Double Character
    • java.lang.String
    • java.util.Date
    • java.sql.Date
  • 通过测试得知,简单类型对于 mybatis 来说都是可以⾃动类型识别的:
    • 也就是说对于 mybatis 来说,它是可以⾃动推断出 ps.setXxxx() ⽅法的。ps.setString() 还是 ps.setInt()。它可以⾃动推断。
    • 其实SQL映射⽂件中的配置⽐较完整的写法是:
      <select id="selectByName" resultType="student" parameterType="java.lang.String">
      	select * from t_student where name = #{name, javaType=String, jdbcType=VARCHAR}
      </select>
      
  • 其中 sql 语句中的 javaType,jdbcType,以及 select 标签中的 parameterType 属性,都是⽤来帮助 mybatis 进⾏类型确定的。不过这些配置多数是可以省略的。因为 mybatis 它有强⼤的⾃动类型推断机制。
    • javaType:可以省略
    • jdbcType:可以省略
    • parameterType:可以省略
    • 如果参数只有⼀个的话,#{} ⾥⾯的内容就随便写了。对于 ${} 来说,注意加单引号。
  • Mybatis 内置的一些别名:参考官方手册 ===> https://mybatis.net.cn/configuration.html#typeAliases

在这里插入图片描述
在这里插入图片描述

2.单个Map参数

  • 这种⽅式是⼿动封装 Map 集合,将每个条件以 key 和 value 的形式存放到集合中。然后在使⽤的时候通过 #{map集合的key} 来取值。

3.单个实体类参数

  • 这⾥需要注意的是:#{} ⾥⾯写的是属性名字。这个属性名其本质上是:set/get ⽅法名去掉 set/get 之后的名字。

4.多参数

<select id="selectByNameAndSex" resultType="student">
	<!--select * from t_student where name = #{name} and sex = #{sex}-->
	<!--select * from t_student where name = #{arg0} and sex = #{arg1}-->
	<!--select * from t_student where name = #{param1} and sex = #{param2}-->
	select * from t_student where name = #{arg0} and sex = #{param2}
</select>
  • arg0 是第⼀个参数、param1是第⼀个参数、arg1 是第⼆个参数、param2是第⼆个参数
  • 实现原理:实际上在mybatis底层会创建⼀个map集合,以arg0/param1为key,以⽅法上的参数为value,例如以下代码:
    Map<String,Object> map = new HashMap<>();
    map.put("arg0", name);
    map.put("arg1", sex);
    map.put("param1", name);
    map.put("param2", sex);
    // 所以可以这样取值:#{arg0} #{arg1} #{param1} #{param2}
    // 其本质就是#{map集合的key}
    
  • 注意:使⽤ mybatis3.4.2 之前的版本时:要⽤#{0}和#{1}这种形式。

5.@Param注解(命名参数)

  • 可以不⽤ arg0 arg1 param1 param2,这个 map 集合的 key 我们可以使⽤ @Param 注解自定义。这样可以增强可读性。
  • 核⼼:@Param(“这⾥填写的其实就是map集合的key”)。
<!-- ArticleMapper.xml 文件 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gdb.mybatis.param.mapper.ArticleMapper">

    <select id="selectForUserIdAndTitle" resultType="Article">
        select * from article where user_id = #{userId} and title = #{title}
    </select>
</mapper>
//ArticleMapper接口 
package com.gdb.mybatis.param.mapper;

import com.gdb.mybatis.param.pojo.Article;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface ArticleMapper {
    List<Article> selectForUserIdAndTitle(@Param("userId") Integer userId, @Param("title") String title);
}
//测试代码
package com.gdb.mybatis.param.test;

import com.gdb.mybatis.param.mapper.ArticleMapper;
import com.gdb.mybatis.param.pojo.Article;
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.Test;

import java.util.List;

public class TestParam {
    @Test
    public void testParamAnnotation() throws Exception{
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"), "development");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);
        List<Article> articles = mapper.selectForUserIdAndTitle(9874, "JavaWeb");
        System.out.println(articles);
        sqlSession.close();
    }
}

在这里插入图片描述

  • 这里可以看到有部分属性为 null,这个问题可以看第二部分 MyBatis查询语句专题。

二、MyBatis查询语句专题

1.结果映射

(1)as 给列起别名

    <select id="selectArticleForId" resultType="Article">
        select id,
               user_id     as userId,
               title,
               summary,
               read_count  as readCount,
               create_time as createTime,
               update_time as updateTime
        from article
        where id = #{id};
    </select>

(2)使⽤resultMap进⾏结果映射

<!--
 resultMap:
 id:这个结果映射的标识,作为select标签的resultMap属性的值。
 type:结果集要映射的类。可以使⽤别名。
-->
<resultMap id="ArticleResultMap" type="Article">
	<!--对象的唯⼀标识,官⽅解释是:为了提⾼mybatis的性能。建议写上。-->
	<id property="id" column="id"/>
	<result property="userId" column="user_id"/>
	<!--当属性名和数据库列名⼀致时,可以省略。但建议都写上。-->
	<!--javaType⽤来指定属性类型。jdbcType⽤来指定列类型。⼀般可以省略。-->
	<result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
	<result property="summary" column="summary"/>
	<result property="readCount" column="read_count"/>
	<result property="createTime" column="create_time"/>
	<result property="updateTime" column="update_time"/>
</resultMap>
<!--resultMap属性的值必须和resultMap标签中id属性值⼀致。-->
<select id="selectAllByResultMap" resultMap="ArticleResultMap">
	select * from article
</select>

(3)是否开启驼峰命名⾃动映射(配置settings)

  • 使⽤这种⽅式的前提是:属性名遵循Java的命名规范,数据库表的列名遵循SQL的命名规范。
  • Java命名规范:⾸字⺟⼩写,后⾯每个单词⾸字⺟⼤写,遵循驼峰命名⽅式。
  • SQL命名规范:全部⼩写,单词之间采⽤下划线分割。
<!--放在properties标签后⾯-->
<settings>
	<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

2.返回实体类

  • 查询结果是⼀条的话可以使⽤List集合接收。

  • 启用驼峰命名方式,完成数据库表字段到Java类属性的映射。

    <select id="SelectArticleForIdRetPojo" resultType="Article">
        select * from article where id = #{id}
    </select>
    
  • ArticleMapper.java

    • 注意:这里要使用 MapKey 注解来指定大 Map 的 key。
    Article SelectArticleForIdRetPojo(Integer id);
    
  • 测试程序

    @Test
    public void SelectArticleForIdRetPojo() throws IOException {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"), "development");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);
        Article article = mapper.SelectArticleForIdRetPojo(1);
        System.out.println(article);
        sqlSession.close();
    }
    

3.返回List

  • 当查询的记录条数是多条的时候,必须使⽤集合接收。如果使⽤单个实体类接收会出现异常。

4.返回Map

  • 当返回的数据,没有合适的实体类对应的话,可以采⽤Map集合接收。字段名做key,字段值做value。
  • 查询如果可以保证只有⼀条数据,则返回⼀个Map集合即可。(如果返回结果不是一条记录,使用一个 Map 集合来接收会出现异常。)

5.返回List

  • 查询结果条数⼤于等于1条数据,则可以返回⼀个存储 Map 集合的 List 集合 List<Map>。

  • ArticleMapper.xml

    <select id="selectAllRetListMap" resultType="map">
        select * from article
    </select>
    
  • ArticleMapper.java

    • 注意:这里要使用 MapKey 注解来指定大 Map 的 key。
    List<Map<String,Object>> selectAllRetListMap();
    
  • 测试程序

    @Test
    public void selectAllRetListMap() throws IOException {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"), "development");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);
        List<Map<String, Object>> list = mapper.selectAllRetListMap();
        System.out.println(list);
        sqlSession.close();
    }
    

6. 返回Map<String,Map>

  • 拿 Article 的 id 做 key,以后取出对应的 Map 集合时更⽅便。

  • ArticleMapper.xml

    <select id="selectAllArticleRetBigMap" resultType="map">
        select * from article
    </select>
    
  • ArticleMapper.java

    • 注意:这里要使用 MapKey 注解来指定大 Map 的 key。
    @MapKey("id")
    Map<String, Map<String, String>> selectAllArticleRetBigMap();
    
  • 测试程序

    @Test
    public void selectAllArticleRetBigMap() throws IOException {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"), "development");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);
        Map<String, Map<String, String>> stringMapMap = mapper.selectAllArticleRetBigMap();
        System.out.println(stringMapMap);
        sqlSession.close();
    }
    

7.返回总记录条数

  • ArticleMapper.xml

    <select id="selectForRowCount" resultType="_int">
        select count(*) from article;
    </select>
    
  • ArticleMapper.java

    public interface ArticleMapper {
        int selectForRowCount();
    }
    
  • 测试程序

    @Test
    public void testQueryAllRow() throws IOException {
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"), "development");
        SqlSession sqlSession = sqlSessionFactory.openSession();
        ArticleMapper mapper = sqlSession.getMapper(ArticleMapper.class);
        int count = mapper.selectForRowCount();
        System.out.println("count = " + count);
        sqlSession.close();
    }
    
  • 结果展示
    在这里插入图片描述


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

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

相关文章

【C++】STL容器之string(迭代器,范围for)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

ChatGPT回答模式

你发现了吗&#xff0c;ChatGPT的回答总是遵循这些类型方式。 目录 1.解释模式 2.类比模式 3.列举模式 4.限制模式 5.转换模式 6.增改模式 7.对比模式 8.翻译模式 9.模拟模式 10.推理模式 1.解释模式 ChatGPT 在回答问题或提供信息时&#xff0c;不仅仅给出…

【C++私房菜】面向对象中的简单继承

文章目录 一、 继承基本概念二、派生类对象及派生类向基类的类型转换三、继承中的公有、私有和受保护的访问控制规则四、派生类的作用域五、继承中的静态成员 一、 继承基本概念 通过继承&#xff08;inheritance&#xff09;联系在一起的类构成一种层次关系。通常在层次关系的…

2.22 作业

顺序表 运行结果 fun.c #include "fun.h" seq_p create_seq_list() {seq_p L (seq_p)malloc(sizeof(seq_list));if(LNULL){printf("空间申请失败\n");return NULL;}L->len 0; bzero(L,sizeof(L->data)); return L; } int seq_empty(seq_p L) {i…

音频声波的主观感受

一、响度 声压是“客观”的&#xff0c;响度是“主观”的。 响度又称音量。人耳感受到的声音强弱&#xff0c;它是人对声音大小的一个主观感觉量。响度的大小决定于声音接收处的波幅&#xff0c;就同一声源来说&#xff0c;波幅传播的愈远&#xff0c;响度愈小…

mybatis 集成neo4j实现

文章目录 前言一、引入jar包依赖二、配置 application.properties三、Mybatis Neo4j分页插件四、Mybatis Neo4j自定义转换器handler五、MybatisNeo4j代码示例总结 前言 MyBatis是一个基于Java语言的持久层框架&#xff0c;它通过XML描述符或注解将对象与存储过程或SQL语句进行…

面试必问!JVM 不得不说的知识点(三)

一、 JVM指令集: 1. 了解Java虚拟机的指令集是什么?举例说明一些常见的指令及其作用。 Java虚拟机的指令集是一组用于执行Java程序的低级操作码。这些指令直接在Java虚拟机上执行,可以认为是Java程序的二进制表示形式。以下是一些常见的Java虚拟机指令及其作用的例子: ic…

微信小程序 ---- 生命周期

目录 生命周期 1. 小程序运行机制 2. 小程序更新机制 3. 生命周期介绍 4. 应用级别生命周期 5. 页面级别生命周期 6. 生命周期两个细节补充说明 7. 组件生命周期 总结 生命周期 1. 小程序运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0…

【云动世纪:Apache Doris 技术之光】

本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基础软件&#xff08;数据库、操作系统、编程语言与中间件…

基于Android的校园请假App的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【进程创建】

目录 进程创建的方式查看进程pid 调用系统调用创建子进程fock函数做了的工作子进程刚开始创建的状态 一个变量&#xff0c;两个不同的值创建子进程的作用 进程创建的方式 1.在操作系统上输入的指令。 2.已经启动的软件。 3.程序员在代码层面上调用系统调用创建进程。 linux中第…

什么是MES?SCADA与MES有什么区别?

连接制造过程的各个层是构建更有效的操作和自动化系统的关键步骤。SCADA(监控和数据采集)、MES(制造执行系统)和 ERP(企业资源规划)是制造过程中最重要的三个级别。 SCADA用于工厂车间的自动化&#xff0c;ERP在办公室层面自动执行许多任务。MES系统占据了SCADA和ERP之间的空间…

一款跳转警告HTML单页模板源码

一款跳转警告HTML单页模板,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码如下 <!DOCTYPE html> <html> <!--QQ沐编程 www.q…

【刷题记录】相交链表

本系列博客为个人刷题思路分享&#xff0c;有需要借鉴即可。 1.题目链接&#xff1a; LINK 2.详解思路&#xff1a; 思路1&#xff1a;用尾结点是否一样来判断是否相交&#xff0c;用相对移位来找到结点 思路2&#xff1a;双层嵌套循环&#xff0c;时间复杂度O&#xff08;N*N&…

06 flink 的各个角色的交互

前言 这里主要是 涉及到 flink 中各个角色的交互 TaskManager 和 ResourceManager 的交互 JobMaster 和 ResourceManager 的交互 等等流程 TaskManager 和 ResourceManager 的交互 主要是 包含了几个部分, 如下, 几个菜单 TaskManager向 ResourceManager 注册 Resou…

学习Markdown

https://shadows.brumm.af 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些…

第101讲:Mycat分布式数据库代理系统的核心概念以及部署

文章目录 1.Mycat核心概念1.1.Mycat介绍1.2.Mycat的应用场景1.3.Mycat结构概念1.4.Mycat的原理1.5.Mycat管理 2.部署Mycat 1.Mycat核心概念 1.1.Mycat介绍 Mycat是开源的、活跃的、基于JAVA语言编写的MySQL数据库中间件&#xff0c;可以把它看做是一个代理程序&#xff0c;开…

MariaDB落幕和思考

听过MySQL的基本也都知道 MariaDB。MariaDB由MySQL的创始人主导开发&#xff0c;他早前曾以10亿美元的价格&#xff0c;将自己创建的公司MySQL AB卖给了SUN&#xff0c;此后&#xff0c;随着SUN被甲骨文收购&#xff0c;MySQL的所有权也落入Oracle的手中。传闻MySQL的创始人担心…

融中穿刺路径角度评估的C++技术实现

消融模型的三维渲染 我们以肝部为例&#xff0c;通常肝部在做消融手术规划时有几个步骤。 一三维重建&#xff1a; 对器官进行图像分割&#xff1b; 对肿瘤的原发区域GTV进行勾画。 二穿刺路径的规划&#xff1a; 路径规划当中有几个约束&#xff1a;穿刺深度、危及器官的…

普中51单片机(DS18B20温度传感器)

DS18B20温度传感器原理 内部结构 64位(激)光刻只读存储器 光刻ROM中的64位序列号是出厂前被光刻好的&#xff0c;它可以看作是该DS18B20的地址序列号。64位光刻ROM的排列是&#xff1a;开始8位&#xff08;28H&#xff09;是产品类型标号&#xff0c;接着的48位是该DS18B20自身…