MYBATIS最核心的莫过于动态的获取各种的参数值, 为了将来更好的使用MYBATIS进行开发, 我们必须先打好 "获取参数值" 这一基础
一. MYBATIS获取参数值的两种情况:
1.${}
实质:字符串的拼接
注解:${}使用的字符串拼接的方式拼接SQL语句, 所以, 如果其中出现了字符串类型的数据, 就需要我们手动的为其加上相应的单引号, 并且使用这种方式还有可能会造成SQL注入的问题
2.#{}
实质:占位符赋值
注解:使用这种方式获取参数值, 因为本身就是通过占位符获取对应的数据的, 所以在遇到字符串类型的数据的时候并不需要我们手动添加单引号, 其会自动的帮我们进行拼接, 并且不会造成SQL注入的情况
TIPS:
SQL注入指的是输入某些特殊的值从而改变SQL语句的逻辑, 比如:
select * from table where username='${username}' and password='${password}'
正常输入下, 只要用户名以及密码可以匹配到数据库中的数据就可以登录上, 但是如果在输入password的时候输入:
123 || 1=1
在这种的情况下, 因为新加了逻辑符号 || 以及永远正确的 1 = 1 从而使得无论密码输入多少, 是否正确, 都会因为 || 以及1=1 的存在 使得其永远正确, 从而登录其中
二.获取参数值的五种情况
1>:获取单个的参数值
比如根据用户名称获取数据
<select id="selectByName"> select * from tb_user where username=#{username} </select>
在这里, 我们使用# 通配符的形式获取, 但是, 里面的内容应该填什么呢?
多次尝试过后, 我们发现无论输入什么, 经过测试得到的结果都是一样的, 所以#{}里面的内容可以是任意的值, 这是因为在读取的时候是无法读取到我们的属性值的, 在测试的SQL语句当中我们就发现了获取的是一个 ? 由此可见源代码当中是无法获取我们输入的值的, 但是最好还是需要有一些意义的值
同样的, 另一种字符串的方式内部的值也可以是任意的值, 依旧是选择有意义的值最好 , 记得需要我们手动添加 ' '
<select id="selectByName"> select * from tb_user where username='#{username}' </select>
2>:获取多个参数值
添加数据当中添加新的用户账号以及相应的密码
如果跟第一种类似, 我们依旧输入有意义的值在占位符当中
<insert id="addByNameAndPassword"> insert into tb_user values(#{username},#{password}) </insert>
经过测试, 就会报错, 并且错误提示出现在了我们所输入的获取参数值的名称上
这是因为在源代码当中, 我们获取这两个(多个)的参数的时候, 会自动的将其放在MAP集合当中, 我们必须根据对应的KEY来获取对应的VALUE才可以, 一般来讲, 默认的KEY按照顺序可以是[arg0, arg1....]或者是 [param1, param2] 都是按照顺序的
在本案例当中, 第一个username就应当是 arg0 或者是param1这两种形式, password就是另外两种, 并且在获取的时候两者可以交叉联合使用, 不会产生任何的影响
<insert id="addByNameAndPassword"> insert into tb_user values(#{arg0},#{arg1}) </insert> //两者混和使用也是没有问题的, 但是需要注意不同的顺序对应的不同的值 <insert id="addByNameAndPassword"> insert into tb_user values(#{arg0},#{param2}) </insert>
3>:使用MAP集合的形式获取
在获取多个参数值的时候我们讲过, 实际上MABITS后台自动的帮我们设置了KEY值并且将数据传输了进去, 实际上我们也可以使用MAP的形式自己进行设置KEY值
在映射文件设置对应参数的时候, 我们就不需要思考选择哪一种方式了, 可以直接使用我们自己定义的KEY值获取对应的数值
在MAPPER当中
在对应得测试类当中如下
我们设置的KEY值如上, 设置了之后就可以在MAPPER得映射文件当中直接通过这些获取对应的值
4>:使用USER设置获取
在添加数据得时候我们也可以选择使用向其中添加USER得方式获取对应的参数, 这里我们得参数获取得应当是对应的属性值
在对应的映射文件当中添加如下
<insert id="addByUser"> insert into tb_user values(#{username},#{password}) -- 在这里我们需要明确一点, 属性值实际上指的是我们在对应的实体类对象User当中SET以及GET方法在去除两者之后将第一个字母变为小写之后得数值, 可以说成员变量一半是"属性值" </insert>
最后在测试类编写对应的方法即可
5>:使用注解Params的方式获取对应的参数
使用注解的方式能够让我们自己手动的设置对应的MAP集合的KEY值, 从而不必再使用USER或者是其自带设置的KEY获取对应的参数值了, 在之后的开发当中, 我们也更加倾向使用这种防方式
在MAPPER当中
这这里, 我们所写的注解就相当于是我们自己设置了对应的KEY值, 在将其以MAP集合的形式保存后, 我们就可以使用这个注解获取对应的参数了
在对应的MAPPER映射文件当中直接输入对应注解即可