超全MyBatis动态代理详解(二)

321 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

3.  #{}和${}

#{}是对非字符串拼接的参数的占位符,如果入参是简单数据类型,#{}里可以任意写,但是如果入参是对象类型,则#{}里必须是对象的成员变量的名称,#{}可以有效防止sql注入。

**主要是针对字符串拼接替换,如果入参是基本数据类型,{}主要是针对字符串拼接替换**,如果入参是基本数据类型,{}里必须是value,但是如果入参是对象类型,则里必须是对象的成员变量的名称。{}里必须是对象的成员变量的名称。{}还可以替换列名和表名,存在sql注入风险,尽量少用。

#{}演示

传参大部分使用#{}传参,它的底层使用的是PreparedStatement对象,是安全的数据库访问,防止sql注入.

#{}里如何写,看parameterType参数的类型

  1. 如果parameterType的类型是简单类型(8种基本(封装)+String),则#{}里随便写.
    <select id="getById" parameterType="int" resultType="users">  ===>入参类型是简单类型
        select id,username,birthday,sex,address
        from users
        where id=#{zar}  ===>随便写
    </select> 
  1. parameterType的类型是实体类的类型,则#{}里只能是类中成员变量的名称,而且区分大小写.
    <insert id="insert" parameterType="users" >  ===>入参是实体类
        insert into users (username, birthday, sex, address) values(#{userName},#{birthday},#{sex},#{address})  ==>成员变量名称
    </insert>

image.png

${}演示

${}字符串拼接或字符串替换

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>   

image.png

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>

        -->