mybatis:映射方式与SQL注入

1.映射方式有两种,一种是resultType

这个是有一个实体类其成员与数据库中表字段一一对应,下例中就是User类对应了user表

<mapper namespace="com.example.mapper.UserMapper">  
    <select id="selectUserById" resultType="com.example.model.User">  
        SELECT * FROM user WHERE id = #{id}  
    </select>  
</mapper>

一种是resultMap

他对应了更复杂的应用场景:

表中列名与实体类的成员变量对应不上,并且没有使用注解@TableField进行标记。下例中我们的实体类中的password对应了表中的pwd

复制代码
<resultMap id="blogResult" type="Blog">
    <id column="id" property="id"/><!--主键映射-->
    <result column="pwd" property="password"/><!--数据库表字段到实体类属性的映射-->
    <result column="name" property="name"/>
</resultMap>
 
<select id="selectBlogById" parameterType="int" resultMap="blogResult">
select * from blog where id=#{id}
</select>
复制代码

要实现一对多的关联,进行多表联查(阿里规范中要求不可以使用多表联查,这里仅作为例子,实际使用中还是老实写两个SQL再拼接)

有Order表与OrderDetail表,他们是一对多的关系

复制代码
<mapper namespace="com.example.mapper.OrderMapper">  
    <resultMap id="orderResultMap" type="com.example.model.Order">  
        <id property="id" column="order_id" />  
        <collection property="orderDetails" column="order_id" foreignColumn="order_id" ofType="com.example.model.OrderDetail"  
                    select="getOrderDetailsByOrderId" />  
    </resultMap>  
  
    <select id="selectOrderById" resultMap="orderResultMap">  
        SELECT * FROM order WHERE id = #{id}  
    </select>  
  
    <select id="getOrderDetailsByOrderId" resultType="com.example.model.OrderDetail">  
        SELECT * FROM order_detail WHERE order_id = #{orderId}  
    </select>  
</mapper>
复制代码

上例中,我们对order进行select时,会使用resultMap,Map指定了我们创建的entity,其中有一个id,一个List<OrderDetails>,我们使用collection元素将List映射到了getOrderDetailsByOrderId这个子查询上。这样就实现了一次多表联查

 

SQL注入:

在mybatis中,有#{}与${}两种参数替换方法,但是他们是不同的:

#{}是预编译参数,他使用参数占位符?来替换。提高了性能,同时防止了SQL注入

${}是字符串替换,很容易发生SQL注入,很危险。如果使用请同时使用<if> <when> <choose>等标签保证其安全性

posted @   天启A  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示