文章目录
一、在Mybatis框架中,#{}和${}有什么区别
#{}
- #{}实现的是想prepareStatement中的预处理语句中设计参数值,sql语句中#{}表示一个占位符即?。
- 使用占位符#{}可以有效的防止sql注入,在使用时不需要关心参数值的类型,MyBatis会自动进行java类型和jdbc类型的转换。
- #{}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,#{}括号中可以是value或是其他名称
${}
-
通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换
-
通过$ {}可以接收简单型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。
-
使用${}不能防止sql注入
二、通过Mybatis提供的标签的方法可以实现字符串拼接
1.where和if标签
需求:当传入的金额不为空时,查询金额在1000以下的用户,否则查询所有用户
代码如下(示例):
<select id="selectByMoney" resultType="com.example.carmanagertest.entity.User">
<include refid="sql_temp"></include>
<where>
<if test="money!=null and money!=''">
and money>1000
</if>
</where>
</select>
2.foreach标签
需求:查询存放这id的某一集合中的所有用户
代码如下(示例):
<select id="selectUserByIds" resultType="com.example.carmanagertest.entity.User">
<include refid="sql_temp"></include>
<where>
<foreach collection="ids" open="and id in(" item="id" separator="," close=")">
#{id}
</foreach>
</where>
</select>
3.sql和include标签的使用
需求:查询存放这id的某一集合中的所有用户
代码如下(示例):
<sql id="sql_temp">
select id,user_name,passwd,money from t_user
</sql>
<select id="login" resultType="com.example.carmanagertest.entity.User">
<include refid="sql_temp"></include> where user_name=#{userName} and passwd=#{passwd}
</select>