#{ }和${ } 、参数处理

server/2024/12/22 9:56:45/

目录

#{ }和${ } 

参数处理

入参-parameterType

使用Map

使用Bean / List<Bean>

使用多参数 

@Param注解(命名参数)

出参-resultType 

返回Map / List<Map>

返回Map<String,Map>

属性名不一致-resultMap结果映射


#{ }和${ } 

如果查找 carType=#{carType},carType=${carType}

        #{}:底层是PreparedStatement实现,会先编译再拼接。

                变成:type =' ',再把值传进去,即 type=' 燃油车 '。

        ${}:底层是Statement实现,会先拼接再编译 

                变成type=燃油车,会出现语法错误,因为燃油车应该添加单引号,'${carType}'

使用${}

1、给sql语句传关键字(asc|desc)

<select>select * from car order by carNum ${key}
</select>

2、sql语句字段拼接,字段名例如:字段+日期

<select>//传入dateselect * from monster_${date}
</select>

3、批量删除,有两种写法in和or(动态sql)

<delete>//传入字符串 “1,2,3”delete form monster where id in (${ids})
</delete>

4、模糊查询

<select>//在jdbc中,'%?%'中的?不会被识别为占位符//传入nameselect * from `monster` where `name` like '%${name}%'like concat('%',#{name},'%')like "%"#{name}"%"使用较多
</select>

参数处理

入参-parameterType

使用Map

#{} 里写的是map集合的key,如果key不存在不会报错,数据库表中会插入NULL

使用Bean / List<Bean>

#{} 里写的是get方法的方法名去掉get之后将剩下的单词首字母变小写

getAge对应的是#{age},get方法不存在会报错。

使用多参数 

List<Student> selectByNameAndSex(String name, Character sex);
<select id="selectByNameAndSex" resultType="student">select * from t_student where name = #{name} and sex = #{sex}
</select>

name参数找不到,可用的参数包括[arg1, arg0, param1, param2]

在底层会创建一个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}

@Param注解(命名参数)

List<Student> selectByNameAndAge(@Param(value="name") String name, @Param("age") int age);
List<Student> stus = mapper.selectByNameAndAge("张三", 20);stus.forEach(student -> System.out.println(student));

@Param("这里填写的其实就是map集合的key")

出参-resultType 

返回Map / List<Map>

当返回的数据,没有合适的实体类,可以采用Map集合接收

只有一条数据,则返回一个Map集合即可

    @MapKey("id")public List<Map<String,Object>> find(Map<String, Object> map);
<select id="find" parameterType="map" resultType="map">select * from `monster` where `id` > #{id} and `salary` >= #{salary}
</select>
@Testpublic void m4() {Map<String, Object> map = new HashMap<>();map.put("id",3);map.put("salary",1000);List<Map<String,Object>> monsterlist = monsterMapper.find(map);for (Map<String, Object> monsterMap : monsterlist) {
//            方式一
//            Set<String> keys = monsterMap.keySet();
//            for (String key : keys) {
//                System.out.println(key+ " " + monsterMap.get(key));
//            }
//            System.out.println("===========");
//            方式二for(Map.Entry<String,Object> entry : monsterMap.entrySet()) {System.out.println(entry.getKey()+ " " + entry.getValue());}System.out.println("=========");}}

返回Map<String,Map>

@MapKey("id")  
public Map<Integer,Map<String,Object>> findAll();
@Testpublic void find() {HashMap<String, Object> map = new HashMap<>();map.put("type","women");Map<Integer, Map<String, Object>> all = monsterMapper.findAll(map);System.out.println(all);}

属性名不一致-resultMap结果映射

select查询后,某些字段为null,是因为Bean的字段名和表的字段名不一致  

第一种(常用)

resultMap:
            id:这个结果映射的标识,作为select标签的resultMap属性的值。
            type:结果集要映射的类。可以使用别名。

主键使用id标签<id property="id" column="id"/>提高效率,其他都是<result>

当属性名和数据库列名一致时,可以省略。但建议都写上。

<resultMap id="carResultMap" type="car"><id property="id" column="id"/><result property="useremail" column="user_email"/><result property="username" column="user_name"/>
</resultMap><select id="selectAllByResultMap" resultMap="carResultMap">select * from t_car
</select>

第二种

在写sql语句的时候写别名,跟Bean的字段名保持一致

第三种

开启驼峰命名自动映射

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

前提:

        java命名规范:首字母小写,后面每个单词首字母大写,遵循驼峰命名规范

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


http://www.ppmy.cn/server/152206.html

相关文章

HarmonyOS(71) 自定义事件分发之TouchTestStrategy使用说明

TouchTestStrategy 1、前言2、TouchTestStrategy简介2.1、TouchTestStrategy枚举类型简介2.2、TouchTestStrategy.DEFAULT效果1.3、TouchTestStrategy.FORWARD_COMPETITION效果2.3、TouchTestStrategy.FORWARD效果3、参考资料1、前言 本文根据官方文档自定义事件分发整理而来,…

汽车气候控制传感器

红外温度传感器在过程控制和制造中使用了多年&#xff0c;现在已被接受用于乘用车。必须解决生产、可靠性和成本问题。此外&#xff0c;还必须解决复杂的信号调节和校准问题。 红外温度传感器在过程控制和制造中使用了多年&#xff0c;现在已被接受用于乘用车。必须解决生产、…

无人机加激光雷达高效率实时建模技术详解

无人机与激光雷达的结合在实时三维点云建模成像技术中展现出了高效率与高精度&#xff0c;这种技术结合了无人机的灵活性与激光雷达的高精度测量能力&#xff0c;以下是该技术的详细介绍&#xff1a; 技术原理 1. 激光雷达&#xff08;LiDAR&#xff09;&#xff1a; 定义&am…

HarmonyOS 输入框组件:TextInput 和 TextArea 深度解析

输入框组件是移动端开发中最常见的组件之一&#xff0c;常用于响应用户的输入操作&#xff0c;比如评论区的文本输入、聊天框的消息输入、表单内容填写等场景。在 HarmonyOS 中&#xff0c;TextInput 和 TextArea 分别用于单行和多行输入操作。除此之外&#xff0c;它们还可以与…

Unity Shader学习日记 part 2 线性代数--矩阵

矩阵的基础概念这里就不用说了。 先来看看矩阵的乘法 矩阵乘法 对于矩阵A*矩阵B有这样的要求 1.左边矩阵的&#xff08;A&#xff09;列数等于右边矩阵的&#xff08;B&#xff09;的行数 2.相乘的的结果是一个左边矩阵的&#xff08;A&#xff09;行数*右边矩阵&#xff08;…

MaskGCT——开源文本转语音模型,可模仿任何人说话声音

前期介绍过很多语音合成的模型&#xff0c;比如ChatTTS&#xff0c;微软语音合成大模型&#xff0c;字节跳动自家发布的语音合成模型Seed-TTS。其模型随着技术的不断发展&#xff0c;模型说话的声音也越来越像人类&#xff0c;虽然 seed-tts 可以进行语音合成等功能&#xff0c…

Day49 单调栈part02

42. 接雨水 接雨水这道题目是 面试中特别高频的一道题,也是单调栈应用的题目,大家好好做做。 建议是掌握 双指针 和单调栈,因为在面试中 写出单调栈可能 有点难度,但双指针思路更直接一些。在时间紧张的情况有,能写出双指针法也是不错的,然后可以和面试官在慢慢讨论如何…

经济学 ppt 2 部分

前言 上一次复习经济学是好久之前了&#xff0c;看了第一章的 ppt &#xff0c;好像重点就是谁是软件经济学之父。昨天老师讲了一下题型&#xff0c;20 分选择题&#xff0c; 20 分判断题&#xff0c;20 分计算题&#xff0c;6 6 8 三个计算题&#xff0c;25 分表格&#xff0…