MyBatis - 06 - MyBatis获取参数值的两种方式(重要)

news2024/10/1 7:44:17

文章目录

    • 1、回顾JDBC原生的获取参数值的方式
    • 2、MyBatis获取参数值的两种方式
    • 3、MyBatis获取参数值的五种情况
      • 情况1: Mapper接口方法的参数为单个字面量类型的参数
        • ParameterMapper接口代码
        • 测试类代码
        • ParameterMapper.xml配置方式1:```${}```
        • ParameterMapper.xml配置方式2:```#{}```
      • 情况2:Mapper接口方法的参数有多个,利用Mabatis的map参数集合
        • ParameterMapper接口
        • 测试类代码
        • ParameterMapper.xml错误写法
        • ParameterMapper.xml正确写法
      • 情况3:Mapper接口方法的参数有多个,利用手动创建的map参数集合
        • ParameterMapper接口
        • 测试类代码
        • ParameterMapper.xml写法1
        • ParameterMapper.xml写法2
      • 情况4:Mapper接口方法的参数是一个实体类对象【==用的最多的情况之一==】
        • ParameterMapper接口
        • 测试类代码
        • ParameterMapper.xml写法
      • 情况5:使用@Param注解来命名参数【很常用的情况】
        • ParameterMapper接口
        • 测试类代码
        • ParameterMapper.xml写法
    • 4、建议将5种情况整合为两种情况
    • 5、@Param源码分析

1、回顾JDBC原生的获取参数值的方式

  • 字符串拼接
  • 占位符拼接
    @Test
    public void testJDBC() throws SQLException, ClassNotFoundException {
        String username = "rqs";
        Class.forName("");
        Connection connection = DriverManager.getConnection("", "", "");
        // 1. 字符串拼接 ->获得预编译对象 -》sql注入问题
        PreparedStatement preparedStatement = connection.prepareStatement("select * from t_user where username = '" + username + "'");

        // 2. 占位符 可以避免sql注入问题
        PreparedStatement ps2 = connection.prepareStatement("select * from t_user where username = ?");
        ps2.setString(1, username);
    }

2、MyBatis获取参数值的两种方式

MyBatis获取参数值的两种方式:${}和#{}

  • ${}的本质就是字符串拼接
  • #{}的本质就是占位符赋值

${}使用字符串拼接的方式拼接sql,可能会造成sql注入,另外为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;
#{}使用占位符赋值的方式拼接sql,不存在sql注入的问题,此时为字符串类型或日期类型的字段进行赋值时,可以自动添加单引号(尽量使用这一种)。

3、MyBatis获取参数值的五种情况

情况1: Mapper接口方法的参数为单个字面量类型的参数

若mapper接口中的方法参数为单个的字面量类型
此时可以使用${}#{}以任意的名称获取参数的值,注意${}需要手动加单引号

ParameterMapper接口代码

package com.rqs.mybatis.mapper;

import com.rqs.mybatis.pojo.User;

import java.util.List;

public interface ParameterMapper {
    /**
     * 单个的字面量类型:
     * 根据用户名查询用户信息
     */
    User getUserByUserName(String username);
}

测试类代码

    /**
     * MyBatis获取参数值的各种情况:
     * 情况1: mapper接口方法的参数为单个字面量的参数
     * 可以通过${} #{}以任意的字符串获得参数值,但需要注意${}的单引号问题
     */
    @Test
    public void testgetUserByUserName(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        User user = mapper.getUserByUserName("rqs");
        System.out.println(user);
    }

ParameterMapper.xml配置方式1:${}

<!--    User getUserByUserName(String username);-->
    <select id="getUserByUserName" resultType="User">
        <!-- 错误写法:
       select * from t_user where username = ${username}
          如果使用这种方式,得到的sql语句是:
          Preparing: select * from t_user where username = rqs
          而其中username的值‘rqs’没有单引号,语法不正确,会报错。
          因此要手动添加单引号
       -->
        select * from t_user where username = '${username}'
    </select>

方式1错误写法的结果:
会报错
在这里插入图片描述
sql语句的正确写法是:
在这里插入图片描述
方式1正确写法的结果:
在这里插入图片描述

ParameterMapper.xml配置方式2:#{}

<?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.rqs.mybatis.mapper.ParameterMapper">
    <!--User getUserByUserName(String username);-->
    <!--    使用#{},里面内容可以随便写,都是传进来的String username参数的值,该值在测试类中写的mapper.getUserByUserName("rqs"),
    所以这里无论怎么写都会获得“rqs”的值,虽然可以随便写,但建议见闻知意思,写传输过来的参数名的名字,此处为username-->
    <select id="getUserByUserName" resultType="user">
        select * from t_user where username=#{username}
    </select>

</mapper>

测试结果:
在这里插入图片描述

情况2:Mapper接口方法的参数有多个,利用Mabatis的map参数集合

若mapper接口中的方法参数为多个时
此时MyBatis会自动将这些参数放在一个map集合中,以arg0,arg1…为键,以参数为值;
以 param1,param2…为键,以参数为值;
因此只需要通过${}#{}访问map集合的键就可以获取相对应的 值,注意${}需要手动加单引号

ParameterMapper接口

package com.rqs.mybatis.mapper;
import com.rqs.mybatis.pojo.User;


public interface ParameterMapper {
    /**
     * 验证登录
     */
    User checkLogin(String username, String password);
}

测试类代码

package com.rqs.mybatis.test;

import com.rqs.mybatis.mapper.ParameterMapper;
import com.rqs.mybatis.pojo.User;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;


public class ParameterMapperTest {

    /**
     * 情况2:mapper接口方法的参数为多个时
     * 此时MyBatis会将这些参数放在一个map集合中,以两种方式进行存储
     * a》以arg0,arg1。。为键,参数为值
     * b》以param0,param1。。为键,参数位置
     * 因此只需要通过#{}和${}以键的方式访问值即可,但需要注意${}的单引号问题
     */
    @Test
    public void testCheckLogin(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        User user = mapper.checkLogin("rqs","123456");
        System.out.println(user);
    }
    
}

ParameterMapper.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.rqs.mybatis.mapper.ParameterMapper">

    <!--    User checkLogin(String username, String password);-->
    <select id="checkLogin" resultType="User">
        <!--错误写法-->
        <!--会报错:Parameter 'username' not found. Available parameters are [arg1, arg0, param1, param2]
        因为sql语句没有解析成功-->
        select * from t_user where username = #{username} and password = #{password}
    </select>
</mapper>

写法1是错的,测试结果:
在这里插入图片描述
写法1的报错提示username参数没有找到,当前可用的参数是[arg1,arg0,param1,param2],这是什么意思呢?在MyBatis的底层,如果检测到当前Mapper接口中的方法有多个参数,会自动把这些参数放在一个map集合里,并且以两种方式存储数据,第一种:以arg0,arg1为键,以参数为值,第二种:以param1,param2参数为键,以参数为值。所以,如果要获取map中某一个键所对应的值,直接在#{}或者${}里访问map集合的键。本案例中arg0和param1表示的都是User checkLogin(String username, String password);中的参数username,arg1和param2表示的都是User checkLogin(String username, String password);中的参数password。即
arg0、param1 -> username
arg1、param2 -> password

ParameterMapper.xml正确写法

任选一种,解释如上黄色部分
键 -> 值关系如下:
arg0、param1 -> username
arg1、param2 -> password

<?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.rqs.mybatis.mapper.ParameterMapper">
    <select id="checkLogin" resultType="user">
        <!--    User checkLogin(String username, String password);-->
        <!--以map集合形式存储,arg0->param1, arg1->param2,这时直接用键arg访问就好了,用param访问也行。
        arg0、param1 -> username
        arg1、param2 -> password-->
        <!--写法2-->
        select * from t_user where username = #{arg0} and password = #{arg1}
        <!--select * from t_user where username = '${arg0}' and password = '${arg1}' -->
       
    </select>
</mapper>

<?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.rqs.mybatis.mapper.ParameterMapper">
    <select id="checkLogin" resultType="user">
        <!--    User checkLogin(String username, String password);-->
        <!--以map集合形式存储,arg0->param1, arg1->param2,这时直接用键arg访问就好了,用param访问也行。
        arg0、param1 -> username
        arg1、param2 -> password-->

        <!--写法3-->
        select * from t_user where username = '#{arg0}' and password = '#{param2}'
        <!--select * from t_user where username = '${arg0}' and password = '${param2}' -->

    </select>
</mapper>

<?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.rqs.mybatis.mapper.ParameterMapper">
    <select id="checkLogin" resultType="user">
        <!--    User checkLogin(String username, String password);-->
        <!--以map集合形式存储,arg0->param1, arg1->param2,这时直接用键arg访问就好了,用param访问也行。
        arg0、param1 -> username
        arg1、param2 -> password-->

        <!--写法4-->
        select * from t_user where username = '#{param1}' and password = '#{arg1}'
        <!--select * from t_user where username = '${param1}' and password = '${arg1}' -->

    </select>
</mapper>

<?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.rqs.mybatis.mapper.ParameterMapper">
    <select id="checkLogin" resultType="user">
        <!--    User checkLogin(String username, String password);-->
        <!--以map集合形式存储,arg0->param1, arg1->param2,这时直接用键arg访问就好了,用param访问也行。
        arg0、param1 -> username
        arg1、param2 -> password-->
        <!--写法5-->
        select * from t_user where username = '#{param1}' and password = '#{arg1}'
        <!--select * from t_user where username = '${param1}' and password = '${arg1}' -->

    </select>
</mapper>

测试结果均为:
在这里插入图片描述

情况3:Mapper接口方法的参数有多个,利用手动创建的map参数集合

Mybatis可以自动将参数放map中,所以若mapper接口中的方法需要的参数为多个时,我们也可以手动创建map集合,将这些数据放在map中,只需要通过${}#{}访问map集合的键就可以获取相对应的值,注意${}需要手动加单引号

ParameterMapper接口

package com.rqs.mybatis.mapper;
import com.rqs.mybatis.pojo.User;

import java.util.Map;


public interface ParameterMapper {
    /**
     * 验证登录
     */
    User checkLoginByMap(Map<String, Object> map);
}


测试类代码

package com.rqs.mybatis.test;

import com.rqs.mybatis.mapper.ParameterMapper;
import com.rqs.mybatis.pojo.User;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.Map;


public class ParameterMapperTest {

    /**
     * 情况3:若mapper接口方法的参数有多个时,可以手动将这些参数放在一个map中存储
     * 只需要通过#{} ${}以键的方式访问值即可,但是需要注意${}的单引号问题
     */
    @Test
    public void testCheckLoginByMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);

        Map<String, Object> map = new HashMap<>();
        map.put("username","rqs");
        map.put("password","123456");

        User user = mapper.checkLoginByMap(map);
        System.out.println(user);
    }


}

ParameterMapper.xml写法1

<?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.rqs.mybatis.mapper.ParameterMapper">
    <!--    User checkLoginByMap(Map<String, Object> map);-->
    <select id="checkLoginByMap" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>
</mapper>

ParameterMapper.xml写法2

<?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.rqs.mybatis.mapper.ParameterMapper">
    <!--    User checkLoginByMap(Map<String, Object> map);-->
    <select id="checkLoginByMap" resultType="User">
        select * from t_user where username = '${username}' and password = '${password}'
    </select>
</mapper>

测试结果均为:
在这里插入图片描述

情况4:Mapper接口方法的参数是一个实体类对象【用的最多的情况之一

从浏览器传输过来的是一个完整的表单数据,可以在控制层中获取这些数据并且放在实体类对象中进行存储,这个时候调用service,service调用mappe,传输过来的是一个实体类对象。此时的访问方式类似于map集合,map集合以键进行访问,实体类对象以属性进行访问,注意这里根据属性进行访问主要是看有没有get、set 方法,把get、set方法的方法名中的get和set去掉,把剩下部分的首字母变成小写的结果就是当前的属性名,也就是成员变量,但要注意有一种情况,会出现没有相对应的成员变量却有相对应的get、set方法,此时就不能说没有这个属性了。

ParameterMapper接口

package com.rqs.mybatis.mapper;
import com.rqs.mybatis.pojo.User;

public interface ParameterMapper {
    /**
     * 添加用户信息
     */
    int insertUser(User user);
}

测试类代码

package com.rqs.mybatis.test;

import com.rqs.mybatis.mapper.ParameterMapper;
import com.rqs.mybatis.pojo.User;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class ParameterMapperTest {
    /**
     * 情况4:mapper接口方法的参数是实体类类型的参数(web从control层传过来的)
     * 只需要通过#{} ${}以属性的方式访问属性值即可,但是需要注意${}的单引号问题
     */
    @Test
    public void testCheckLoginByMap(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        int result = mapper.insertUser(new User(null,"lzh","123",23,"男","123@qq.com"));
        System.out.println(result);
    }
}

ParameterMapper.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.rqs.mybatis.mapper.ParameterMapper">
    <!--        int insertUser(User user);-->
    <!--    找到相对应的get方法,如username->找getUsername(),看get/set方法-->
    <insert id="insertUser">
        insert into t_user values(null, #{username}, #{password}, #{age}, #{gender}, #{email})
    </insert>
</mapper>

测试结果:
在这里插入图片描述
在这里插入图片描述

情况5:使用@Param注解来命名参数【很常用的情况】

这种情况适用的场景比较多,是情况2和3的结合。
可以通过@Param注解标识mapper接口中的方法参数,会将这些参数放在map集合中,存储方式有两种。

  • 第一种:以@Param注解的value属性值为键,以参数为值;
  • 第二种:以 param1,param2…为键,以参数为值;

只需要通过${}#{}访问map集合的键就可以获取相对应的值, 注意${}需要手动加单引号

ParameterMapper接口

package com.rqs.mybatis.mapper;
import com.rqs.mybatis.pojo.User;
import org.apache.ibatis.annotations.Param;

public interface ParameterMapper {

    /**
     * 验证登录 (使用@Param)
     */
    User checkLoginByParam(@Param("username") String username, @Param("password") String password);
    
}


测试类代码

package com.rqs.mybatis.test;

import com.rqs.mybatis.mapper.ParameterMapper;
import com.rqs.mybatis.pojo.User;
import com.rqs.mybatis.utils.SqlSessionUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

public class ParameterMapperTest {
    /**
     * 情况5:使用@Param注解来命名参数
     * 此时MyBatis会将这些参数放在一个map集合中,以两种方式进行存储
     * a》以@Param的值为键,参数为值; @Param(value = "xxx")
     * b》以param1,param2...为键,参数为值
     */
    @Test
    public void testCheckLoginByParam(){
        SqlSession sqlSession = SqlSessionUtils.getSqlSession();
        ParameterMapper mapper = sqlSession.getMapper(ParameterMapper.class);
        User user = mapper.checkLoginByParam("rqs","123456");
        System.out.println(user);
    }

}

ParameterMapper.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.rqs.mybatis.mapper.ParameterMapper">
    <!--    以@Param的值为键,参数为值; 或以"param1"/"param2"为键,参数为值-->
    <!--    User checkLoginByParam(@Param("username") String username, @Param("password") String password);-->
    <select id="checkLoginByParam" resultType="User">
        select * from t_user where username = #{username} and password = #{password}
    </select>

</mapper>

测试结果:
在这里插入图片描述

4、建议将5种情况整合为两种情况

  • 情况1:实体类
  • 情况2:@Param

5、@Param源码分析

参考:https://blog.csdn.net/CherryChenieth/article/details/123195302

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

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

相关文章

[8]云计算概念、技术与架构Thomas Erl-第九章 云管理机制|week9|10月29日

9.0引言 基于云的IT资源需要被建立、配置、维护和监控。 远程管理系统 资源管理系统 SLA管理系统 计费管理系统 这些系统通常会提供整合的API&#xff0c;并能够以个别产品、定制应用或者各种组合产品套装和多功能应用的形式提供给用户。 9.1 远程管理系统 远程管理系统…

「回顾RKDC2023」飞凌嵌入式受邀亮相第七届瑞芯微开发者大会

2023年2月23-24日&#xff0c;第七届瑞芯微开发者大会&#xff08;RKDC2023&#xff09;在福州隆重举行&#xff0c;飞凌嵌入式作为瑞芯微生态合作伙伴受邀参会&#xff0c;并与数千名开发者科技公司代表及行业领袖共同聚焦行业新兴产品需求&#xff0c;探讨新硬件发展趋势&…

webpack实战,手写loader和plugin

序言 对于 webpack 来说&#xff0c; loader 和 plugin 可以算是需求程度最为广泛的配置项了。但是呢&#xff0c;单单止步于配置可能还不够。如果我们自己有时候想要 diy 一个需求&#xff0c;但是 webpack 又没有相关的 loader 和 plugin 。那这个时候我们可能就得开始造点轮…

【JAVA程序设计】(C00105)基于SSM大学在校生职业走向调查分析系统-有文档

基于SSM大学在校生职业走向调查分析系统-有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架大学生在校生职业走向调查分析系统分为二个角色&#xff1a;系统管理员、用户 管理员角色包含以下功能&#xff1a; 调查课题管理、留言信息管理、在校学生管理、社…

华为OD机试题,用 Java 解【最小步骤数】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

JavaSE-3 Java运行原理

一、Java的运行过程 &#x1f34e;Java程序运行时,必须经过编译和运行两个步骤。 首先将后缀名为.java的源文件进行编译,最终生成后缀名为.class的字节码文件。然后Java虚拟机将字节码文件进行解释执行,并将结果显示出来。具体过程如下图所示。 &#x1f349;Java程序的运行过…

Java集合学习:LinkedList源码详解

前言 LinkedList在我们平时工作中使用频率非车高&#xff0c;底层是基于双向链表数据结构实现&#xff0c;下面从经常使用的几个方法来了解其原理。 正文 结构 我们先看下LinkedList的重要属性 /**存储链表数量*/transient int size 0;/**存储链表的头节点*/transient Node…

MTK平台使用Omnipeek分析空口协议讲解

讲解这个之前,我们先来了解下beacon/robe Request/Probe Response 三种帧 beacon帧 信标帧,由AP以一定的时间间隔周期性发出,以此来告诉外界自己无线网络的存在。 Beacon帧作为802.11中一个周期性的帧,Beacon周期调高,对应睡眠周期拉长,故节能(即越来休息100ms再起来…

Laravel框架04:视图与CSRF攻击

Laravel框架04&#xff1a;视图与CSRF攻击一、视图概述二、变量分配与展示三、模板中直接使用函数四、循环与分支语法标签五、模板继承、包含1. 继承2. 包含六、外部静态文件引入七、CSRF攻击概述八、从CSRF验证中排除例外路由一、视图概述 视图存放在 resources/views 目录下…

Verilog 学习第五节(串口接收部分)

小梅哥串口部分学习part2 串口通信接收原理串口通信接收程序设计与调试巧用位操作优化串口接收逻辑设计串口接收模块的项目应用案例串口通信接收原理 在采样的时候没有必要一直判断一个clk内全部都是高/低电平&#xff0c;如果采用直接对中间点进行判断的话&#xff0c;很有可能…

CISP注册信息安全专业人员证书

一、什么是“CISP”&#xff1f; 注册信息安全专业人员(Certified Information Security Professional&#xff0c;简称“CISP”)&#xff0c;是安全行业最为权威的安全资格认证&#xff0c;由中国信息安全测评中心统一授权组织&#xff0c;中国信息安全测评中心授权培训机构进…

学习笔记之Vue中的Ajax(四)

Vue中的Ajax&#xff08;四&#xff09;Vue中的ajax一、解决开发环境Ajax跨越问题二、github 用户搜索案例2.1 准备工作2.2 静态页面2.3 实现动态组件2.4 注意细节三、vue 项目中常用的 2 个 Ajax 库3.1 axios3.2 vue-resource四、slot插槽&#xff08;四&#xff09;Vue中的aj…

计算结构体大小

计算结构体大小 目录计算结构体大小一. 结构体内存对齐1. 简介2. 嵌套结构体二. offsetof三. 内存对齐的意义四. 修改默认对齐数一. 结构体内存对齐 以字节&#xff08;bety&#xff09;为单位 1. 简介 对于结构体成员在内存里的存储&#xff0c;存在结构体的对齐规则&#…

代码随想录算法训练营day44 | 动态规划之完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

day44完全背包基础知识问题描述举个栗子518. 零钱兑换 II1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例推导dp数组377. 组合总和 Ⅳ1.确定dp数组以及下标的含义2.确定递推公式3.dp数组如何初始化4.确定遍历顺序5.举例来推导dp数组完全背包基…

安全合规之CVE-2016-2183

文章目录概述分析解决补充信息概述 安全部门脆弱性扫描到如下的风险漏洞要求系统上线必须要修复完毕。 不过我仔细的看了安全部门返回的报告&#xff0c;它是针对Windows Server 2019远程桌面端口进行风险报告…这是刷存在感了吗&#xff1f;哎&#xff0c;没有办法先做调查确…

高压放大器在声波谐振电小天线收发测试系统中的应用

实验名称&#xff1a;高压放大器在声波谐振电小天线收发测试系统中的应用研究方向&#xff1a;信号传输测试目的&#xff1a;声波谐振电小天线颠覆了传统电小天线以电磁波谐振作为理论基础的天线发射和接收模式&#xff0c;它借助声波谐振实现电磁信号的辐射或接收。因为同频的…

Spring Batch 综合案例实战-项目准备

目录 案例需求 分析 项目准备 步骤1&#xff1a;新开spring-batch-example 步骤2&#xff1a;导入依赖 步骤3&#xff1a;配置文件 步骤4&#xff1a;建立employee表与employe_temp表 步骤5&#xff1a;建立基本代码体系-domain-mapper-service-controller-mapper.xml …

YMatrix + PLPython替代Spark实现车联网算法

PySpark算法开发实战 一、PySpark介绍 Spark是一种快速、通用、可扩展的大数据分析引擎&#xff0c;PySpark是Spark为Python开发者提供的API。在有非常多可视化和机器学习算法需求的应用场景&#xff0c;使用PySpark比Spark-Scala可以更好地和python中丰富的库配合使用。 使…

监听页面滚动,给页面中的节点添加动态过渡效果

效果示例图 示例代码 <template><div class"animation-wrap"><!-- header-start --><div class"animation-header">头部</div><!-- header-end --><div class"animation-subtitle animation-show">标…

工人搬砖-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)

【案例8-4】 工人搬砖 【案例介绍】 1.任务描述 在某个工地&#xff0c;需要把100块砖搬运到二楼&#xff0c;现在有工人张三和李四&#xff0c;张三每次搬运3块砖&#xff0c;每趟需要10分钟&#xff0c;李四每次搬运5块砖&#xff0c;每趟需要12分钟。本案例要求编写程序分…