视频链接:https://www.bilibili.com/video/BV1bu411z77K/?vd_source=9545770e4a2968c05878ffac8589ec6c
视频选集:P70— P101
文章目录
- 1.#{}和${}
- 1.1 #{} 占位符
- 1.2 ${} 字符串拼接或字符串替换
- 2.返回主键
- 2.1 业务需求
- 2.2 代码实现
- 3.UUID的用法
- 4.动态sql
- 4.1 < sql >和< include >
- 4.2 < if >和< where >
- 4.3 < set >
- 4.4 < foreach >
- 4.4.1 查询实现
- 4.4.2 批量删除
- 4.4.3 批量增加
- 4.4.4 批量更新
- 4.5 指定参数位置
- 4.6 入参是map【重点掌握】
- 4.7 返回值是map
- 4.7.1 返回值是一行
- 4.7.2 返回值是多行
- 4.8 列名与类中成员变量名称不一致
1.#{}和${}
- #{}是对非字符串拼接的参数的占位符,如果入参是简单数据类型,#{}里可以任意写,但是如果入参是对象类型,则#{}里必须是对象的成员变量的名称, # {}可以有效防止 sql注入。
- $ {} 主要是针对字符串拼接替换,如果入参是基本数据类型,$ {}里必须是value,但是如果入参是对象类型,则$ {}里必须是对象的成员变量的名称。$ {}还可以替换列名和表名,存在sql注入风险,尽量少用。
1.1 #{} 占位符
传参大部分使用#{}传参,它的底层使用的是PreparedStatement对象,是安全的数据库访问,防止sql注入,#{}里如何写,看parameterType参数的类型
- 如果parameterType的类型是简单类型(8种基本(封装)+String),则#{}里随便写.
- parameterType的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写,
1.2 ${} 字符串拼接或字符串替换
字符串拼接:一般用于模糊查询中.建议少用,因为有sql注入的风险.也分两种情况,同样的看parameterType的类型
A.如果parameterType的类型是简单类型,则${}里随便写,但是分版本,如果是3.5.1及以下的版本,只以写value.
B.如果parameterType的类型是实体类的类型,则${}里只能是类中成员变量的名称.(现在已经少用)
C.优化后的模糊查询(以后都要使用这种方式)
字符串替换:
需求:模糊地址或用户名查询
对于上面的SQL语句只有两个地方不一样,代码过于重复
定义接口方法:
测试:
2.返回主键
2.1 业务需求
2.2 代码实现
在插入语句结束后,返回自增的主键值到入参的users对象的id属性中.
效果:
3.UUID的用法
这是一个全球唯一字符串,由36个字母数字中划线组.
4.动态sql
动态sql:可以定义代码片断,可以进行逻辑判断,可以进行循环处理(批量处理),使条件判断更为简单.
4.1 < sql >和< include >
< sql >:用来定义代码片断,可以将所有的列名,或复杂的条件定义为代码片断,供使用时调用.
< include >:用来引用< sql >定义的代码片断.
4.2 < if >和< where >
< if >:进行条件判断
< where >:进行多条件拼接,在查询,删除,更新中使用.
代码实现:
测试:
4.3 < set >
有选择的进行更新处理,至少更新一列
4.4 < foreach >
用来进行循环遍历,完成循环条件查询,批量删除,批量增加,批量更新.
< foreach >参数详解:
- collection:用来指定入参的类型,如果是List集合,则为list ,如果是Map集合,则为map ,如果是数组,则为array,
- item:每次循环遍历出来的值或对象
- separator:多个值或对象或语句之间的分隔符
- open :整个循环外面的前括号
- close:整个循环外面的后括号
4.4.1 查询实现
直接SQL语句执行:
实现接口方法:
实现:
测试:
效果展示:
4.4.2 批量删除
接口:
实现:
测试:
4.4.3 批量增加
SQL语句为:
接口方法:
实现:
测试:
效果:
4.4.4 批量更新
注意:要使用批量更新,必须在jdbc.properties属性文件中的url中添加&allowMultiQueries=true,允许多行操作。
4.5 指定参数位置
目的:如果入参是多个,可以通过指定参数位置进行传参,是实体包含不住的条件,实体类只能封装住成员变量的条件,如果某个成员变量要有区间范围内的判断,或者有两个值进行处理,则实体类包不住【例如:查询指定日期范围内的用户信息.】
定义接口方法:
实现:
测试:
4.6 入参是map【重点掌握】
入参是map,是因为当传递的数据有多个,不适合使用指定下标或指定名称的方式来进行传参,又加上参数不一定与对象的成员变量一致,考虑使用map集合来进行传递.map使用的是键值对的方式.当在sql语句中使用的时候#{键名},${键名},用的是键的名称.
如果入参超过一个以上,使用map封装查询条件,更有语义,查询条件更明确
接口:
实现:
测试:
4.7 返回值是map
返回值是map的适用场景,如果的数据不能使用对象来进行封装,可能查询的数据来自多张表中的某些列,这种情况下,使用map,但是 map 的返回方式破坏了对象的封装,返回来的数据是一个一个单独的数据,之间不相关.
map 使用表中的列名或别名做为键名进行返回数据.
如果返回的数据实体类无法包含,可以使用map返回多张表中的若干数据.返回后这些数据之间没有任何关系.就是Object类型.返回的map的key就是列名或别名
4.7.1 返回值是一行
接口:
实现:
测试:
4.7.2 返回值是多行
接口:
实现:
测试:
效果展示:
4.8 列名与类中成员变量名称不一致
新建项目+新建表
定义实体类:
定义接口:
接口实现:
注册:
测试:
设置别名:
测试:
通过resultMap手工进行映射进行数据绑定: