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>等标签保证其安全性
标签:
mybatisplus
, 软件工程日报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话