持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
3. #{}和${}
#{}是对非字符串拼接的参数的占位符,如果入参是简单数据类型,#{}里可以任意写,但是如果入参是对象类型,则#{}里必须是对象的成员变量的名称,#{}可以有效防止sql注入。
**{}里必须是value,但是如果入参是对象类型,则{}还可以替换列名和表名,存在sql注入风险,尽量少用。
#{}演示
传参大部分使用#{}传参,它的底层使用的是PreparedStatement对象,是安全的数据库访问,防止sql注入.
#{}里如何写,看parameterType参数的类型
- 如果parameterType的类型是简单类型(8种基本(封装)+String),则#{}里随便写.
<select id="getById" parameterType="int" resultType="users"> ===>入参类型是简单类型
select id,username,birthday,sex,address
from users
where id=#{zar} ===>随便写
</select>
- parameterType的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写.
<insert id="insert" parameterType="users" > ===>入参是实体类
insert into users (username, birthday, sex, address) values(#{userName},#{birthday},#{sex},#{address}) ==>成员变量名称
</insert>
${}演示
${}字符串拼接或字符串替换
1)字符串拼接,一般用于模糊查询中.建议少用,因为有sql注入的风险.
也分两种情况,同样的看parameterType的类型
A. 如果parameterType的类型是简单类型,则${}里随便写,但是分版本,如果是3.5.1及以下的版本,只以写value.
<select id="getByName" parameterType="string" resultType="users"> ===>入参是简单类型
select id,username,birthday,sex,address
from users
where username like '%${zar}%' ===>随便写
</select>
B. 如果parameterType的类型是实体类的类型,则${}里只能是类中成员变量的名称.(现在已经少用)
C. 优化后的模糊查询(以后都要使用这种方式)
<select id="getByNameGood" parameterType="string" resultType="users">
select id,username,birthday,sex,address
from users
where username like concat('%',#{name},'%')
</select>
4. 返回主键标签
在完成插入操作后,将生成的主键信息通过实体类对象返回,在进行后继关联插入操作时,不用再次访问数据库。
<insert id="insertUser" parameterType="com.oracle.demo.pojo.Users">
<!--
Order:指定生成返回主键的时机,AFTER:先插入再返回主键
BEFORE: 先生成再完成插入
keyProperty: 生成的主键放入到对象的哪个属性中
resultType: 返回的主键的类型
-->
<selectKey order="AFTER" keyProperty="uid" resultType="int">
select LAST_INSERT_ID()
</selectKey>
<!-- 先生成随机字符串,再返回
<selectKey order="BEFORE" keyProperty="uid" resultType="string">
select uuid()
</selectKey>
-->