mybatis的参数处理详解

news2024/12/23 20:11:26

mybatis的参数处理详解

parameterType配置参数

1、参数的使用说明

使用标签的 parameterType 属性来设定。该属性的取值可以是基本类型,引用类型(例如:String 类型),还可以是实体类类型(POJO 类)。同时也可以使用实体类的包装类,使用实体类的包装类作为参数传递。

2、参数配置的注意事项

基本类型和String可以直接写类型名称也可以使用包名.类名的方式,例如:java.lang.String。
实体类类型,目前我们只能使用全限定类名。
究其原因,是mybaits在加载时已经把常用的数据类型注册了别名,从而我们在使用时可以不写包名,而我们的是实体类并没有注册别名,所以必须写全限定类名。

别名映射的类型
_bytebyte
_longlong
_shortshort
_intint
_integerint
_doubledouble
_floatfloat
_booleanboolean
stringString
byteByte
longLong
shortShort
intInteger
integerInteger
doubleDouble
floatFloat
booleanBoolean
dateDate
decimalBigDecimal
bigdecimalBigDecimal
objectObject
mapMap
hashmapHashMap
listList
arraylistArrayList
collectionCollection
iteratorIterator

传递pojo包装对象(即出现条件为类和集合的参数如何处理)

开发中通过pojo传递查询条件,查询条件是综合的查询条件,不仅包括学生查询条件,还包括其他的查询条件(比如将学生的老师也作为查询条件),这时可以使用包装类对象传递输入参数,Pojo类中包含pojo

创建maven项目:如图所示的项目结构

在这里插入图片描述

相关配置文件配置:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.etime</groupId>
    <artifactId>day09</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
<!--        添加lombok依赖工具使用其中的注解方法可以让实体类中get,set,以及实体类中操作少一些-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
        </dependency>

<!--        添加和引入mybatis的版本号等依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.1</version>
        </dependency>

<!--        这里添加mysql依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
            <scope>runtime</scope>
        </dependency>

<!--        如果不需要也可不进行单元测试的依赖引入-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    配置 mybatis的环境-->
    <environments default="development">
<!--        配置环境-->
        <environment id="development">
<!--            配置事物类型-->
            <transactionManager type="JDBC"></transactionManager>
<!--            配置连接数据库的信息:用的是数据源[连接池]-->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<!--                jdbc:mysql://localhost:3306/db_school?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC-->
<!--                和javaWeb servlet三层架构中的区别这里是只需要设置时区就可以了-->
                <property name="url" value="jdbc:mysql://localhost:3306/db_school?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="h123456"/>
            </dataSource>
        </environment>
    </environments>
<!--    注册StudentDao接口映射文件位置-->
    <mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
    </mappers>
</configuration>

添加工具类:

package com.etime.util;

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 java.io.IOException;
import java.io.InputStream;

public class SqlSessionUtil {

    private static  SqlSession sqlSession =null;
    static {
    //加载配置文件
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream("config.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //用于读取配置文件内容,生成SqlSessionFactory
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
    //获取SqlSession对象
    sqlSession = sqlSessionFactory.openSession();
    }
    public SqlSession getSqlSession(){
        return sqlSession;
    }
}

创建学生实体类Student.java

package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

//添加无参构造函数
@NoArgsConstructor
//添加全参数构造函数
@AllArgsConstructor
//添加所有需要的get,set等方法
@Data
public class Student {
    private int sid;
    private String sname;
    private String sgender;
    private int sage;
    private String semail;
    private String sphoto;
}

创建老师实体类Teacher.java

package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Teacher {
    private int tid;
    private String tname;
}

编写QueryVo.java类

package com.etime.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class QueryVo {
    private Student student;
    private Teacher teacher;
}

编写持久层接口StudentMapper

 <select id="getStuBySth" parameterType="com.etime.pojo.QueryVo" resultType="com.etime.pojo.Student">
     select s.* from student s,teacher t,student_teacher st
         where s.sid=st.sid and st.tid=t.tid and t.tname=#{teacher.tname} and s.sgender=#{student.sgender}
 </select>

配置接口方法对应的sql文件

  //查询刘德华老师授课的男学生有哪些
  List<Student> getStuBySth(QueryVo queryVo);

测试QueryVo对象作为参数

  @Test
 public void t07() throws IOException {
     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
     StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
     Student student = new Student(0,null,"男",0,null,null);
     Teacher teacher = new Teacher(0,"刘德华");
     QueryVo queryVo = new QueryVo(student,teacher);
     List<Student> list = studentDao.getStuBySth(queryVo);
     System.out.println(list);
     sqlSession.close();
 }

map集合数据作为参数的处理方式

1、 添加接口方法参数使用map集合
  //查询出所有19岁的男生的信息
  List<Student> getStuBySgenderAndSage(Map<String,Object> map);
2、配置接口对应的sql配置
 <select id="getStuBySgenderAndSage" parameterType="Map" resultType="com.etime.pojo.Student">
     /*注意:#{}放的时传入参数map集合的key*/
     select * from student where sage=#{age} and sgender=#{gender}
 </select>
3、测试map集合作为参数
 @Test
 public void t08() throws IOException {
     SqlSession sqlSession = SqlSessionUtil.getSqlSession();
     StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
     Map<String,Object> map = new HashMap<>();
     map.put("age",19);
     map.put("gender","男");
     List<Student> list = studentDao.getStuBySgenderAndSage(map);
     System.out.println(list);
     sqlSession.close();
 }
4、 #{}和${}的区别

1、#{}是预编译处理,${}是字符串替换

2、Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换为变量的值

3、Mybatis在预处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值

4、使用#{}可以有效的防止SQL注入,提高系统安全性。

List list = studentDao.getStuBySgenderAndSage(map);

 System.out.println(list);
 sqlSession.close();

}

4、 #{}和${}的区别

1、#{}是预编译处理,${}是字符串替换

2、Mybatis在处理 时,就是把 {}时,就是把 时,就是把{}替换为变量的值

3、Mybatis在预处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值

4、使用#{}可以有效的防止SQL注入,提高系统安全性。

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

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

相关文章

C++学习:类和对象(上)

类和对象 这是C这样的面向对象的语言具有的特性&#xff0c;相较于C语言来说&#xff0c;更加方便的去编写代码&#xff0c;调用代码。 当需要大量重复的调用同一个函数的时候&#xff0c;我们每创建一个函数&#xff0c;就会建立一个栈帧&#xff0c;这样对于空间来讲不友好…

【南京大学PA】 PA0 环境配置 lab (vim | gcc | lab)

本文章学习NJU 的 PA 课程记的笔记 南大PAWLS空间管理 注意事项 whoami 指令 显示你当前的用户IDsudo whoami linux配置 cpp 环境 apt-get install build-essential # build-essential packages, include binary utilities, gcc, make, and so on apt-get install man …

高效办公——Excel表格-03篇(Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子)

高效办公——Excel表格-03篇&#xff08;Excel常用快捷键 以及 Excel快捷键结合公式的各种常见的办公例子&#xff09; 1. commandE&#xff08;Windows系统&#xff1a;ctrlE&#xff09;——快速分列/重组2. 高效复制的快捷键2.1 command D&#xff08;快速复制上一单元格的…

面试篇:MySQL

一、如何定位慢查询 1、慢查询原因&#xff1a; 聚合查询多表查询表数据量过大查询深度分页查询 表现&#xff1a;页面加载慢、接口无响应&#xff0c;或者响应时间过长&#xff08;超过1s&#xff09; 2、如何定位慢查询 3、面试官&#xff1a;MySQL中&#xff0c;如何定…

Leetcode-day4【88】【167】【125】【345】

文章目录 88. 合并两个有序数组题目解题思路解题思路【学习】尾插入法 167. 两数之和 II - 输入有序数组题目解题思路 125. 验证回文串题目解题思路 345. 反转字符串中的元音字母题目解题思路 88. 合并两个有序数组 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums…

Nacos封装通用HttpClient

一、Nacos下Http请求设计众多处理模块处理&#xff0c;包括更新、Prometheus监控等众多功能&#xff0c;Nacos对这块做了统一封装&#xff0c;扩展性也很好&#xff0c;有新旧版本和同步和异步版本. 二、具体封装模块. 1、引入依赖如下. <dependency><groupId>co…

C++ STL学习之【反向迭代器】

✨个人主页&#xff1a; 夜 默 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录 &#x1f307;前言&a…

[持续更新]mac使用chatgpt的几种方法~

1. monica 使用edge浏览器或者chrome浏览器&#xff0c;直接在官网下载即可&#xff0c;网址直通&#xff1a; bing: https://www.microsoft.com/zh-cn/edge/download?formMA13FJ google&#xff1a; Google Chrome 网络浏览器 备注&#xff1a;你需要先搭上梯子哈 安装打…

【数据库多表操作】sql语句基础及进阶

常用数据库&#xff1a; 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库&#xff0c;它是长期存储在计算机内、有组织、有结构的数据集合。数据库是信息系统的核心部分&#xff0c;现代软件系统中大量采用了数据库管理系统&#xff08;DBM…

Windows下 influxdb 数据库安装和简单使用

步骤 1&#xff1a;安装 InfluxDB 你可以从 InfluxDB 的 InfluxDB官网winndows二进制安装包下载适用于不同操作系统的 InfluxDB 安装包。在本教程中&#xff0c;我们将介绍在 Windows上安装 InfluxDB 的步骤。 如果所示&#xff0c;可以点击下载windows版本的安卓版&#xff…

VSCode编译器环境下,基于vite+vue调试Cesium

VSCode编译器环境下&#xff0c;基于vitevue调试Cesium 1.创建一个vite项目 以官网作为参考&#xff1a;创建项目 # npm 6.x npm create vitelatest my-vue-app --template vue# npm 7, extra double-dash is needed: npm create vitelatest my-vue-app -- --template vue#…

https页面加载http资源的解决方法

文章目录 1.报错如图2.项目背景3.网上的解决方案4.我的最终解决方案 1.报错如图 2.项目背景 我们的项目采用的全是https请求&#xff0c;而使用第三方文件管理器go-fastdfs&#xff0c;该文件管理器返回的所有下载文件的请求全是http开头的&#xff0c;比如http://10.110.38.25…

计算机组成原理/数据库补充 存储器第四章---虚拟内存

刚刚数据库下课讲了很多有关虚拟内存的东西感觉很多都忘了&#xff0c;现在写这篇文章来复习一下 为什么要引入虚拟内存 在计算机系统中&#xff0c;多个进程共享CPU和内存&#xff0c; 如果太多的进程需要过多的内存空间&#xff0c;那么其中一部分进程就会无法或得足够得空…

2023年网络安全比赛--Windows渗透测试中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.通过本地PC中渗透测试平台Kali对服务器场景20221219win进行系统服务及版本扫描渗透测试,并将该操作显示结果中1433端口对应的服务版本信息作为Flag值(例如3.1.4500)提交; 2.通过本地PC中渗透测试平台Kali对服务器场景202212…

chatgpt智能提效职场办公-ppt怎么全屏

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 在PowerPoint中&#xff0c;可以通过以下几种方法将演示文稿切换到全屏模式&#xff1a; 方法1&#xff1a;按F5键 在编辑演示文稿的状…

基于LS1028 TSN 交换机硬件系统设计与实现(二)

3.1 LS1028A 芯片研究 目前市面上支持 TSN 系统的芯片较少&#xff0c;其中两家较大的公司之一博通 &#xff08; Broadcom &#xff09; 2017 年推出了 StrataConnect BCM53570 系列的以太网交换机&#xff0c;该系 列支持的新技术旨在帮助用户应对物联网、汽车网络和…

mybatis的原理详解

mybatis的原理详解 原理图 执行的原理图如下图所示&#xff1a; 配置文件分析 config.xml: <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.or…

PTA L1-091 程序员买包子 (10 分)

这是一条检测真正程序员的段子&#xff1a;假如你被家人要求下班顺路买十只包子&#xff0c;如果看到卖西瓜的&#xff0c;买一只。那么你会在什么情况下只买一只包子回家&#xff1f; 本题要求你考虑这个段子的通用版&#xff1a;假如你被要求下班顺路买 N N N 只包子&#x…

华为云上云实践(二):Linux 环境下对云硬盘 EVS 的创建、挂载和初始化

本文主要讲解华为云云硬盘 EVS 的在 Linux 操作系统 EC2 服务器上创建、挂载及云硬盘初始化等基本操作&#xff0c;快速掌握华为云云硬盘 EVS 操作方法。 How to attach new Huawei EVS Volume 文章目录 一、前言二、环境准备与造作步骤2.1 本文实践操作的环境2.2 本文实践操作…

基础数据结构------单链表

1、链表使用的解决方案 【链表的概述】 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点&#xff08;链表中每一个元素称为结点&#xff09;组成&#xff0c;结点可以在运行时动态生成。…