MyBatis连接数据库时,$和#的区别:
#{}:是以预编译的形式,将参数设置到sql语句中:相当于PreparedStatement:防止sql注入
${}:取出的值直接拼装在sql语句中:会有安全问题。
注:大多数情况下,我们应该使用#{},原生JDBC不支持占位符的地方我们可以使用${}进行取值。
连接方式:
1、单参数传值时,#{}中可以是任何值
2、多参传值时,
(1)直接传值:使用#{param1..paramN}进行传值
(2)采用注解传值:使用#{注解名...}
(3)采用Map集合包装传值:使用#{注解名...}
例子:
单参传值:
<!-- 单个参数传值 -->
<select id="getEmployeeById" resultType="com.bean.Employee">
select * from tab_employee where id = #{id}
</select>
多参传值:
直接传值:
<!--
//通过各个参数查询员工信息
Employee getEmployeeByIdAndName(int id,String name);
-->
<select id="getEmployeeByIdAndName" resultType="com.bean.Employee">
select * from tab_employee where id=#{param1} and last_name=#{param2} //注意param首字母小写
</select>
采用注解传值:
<!--
//通过各个参数查询员工信息
Employee getEmployeeByIdAndName(@Param("id")int id,@Param("name")String name);
-->
<select id="getEmployeeByIdAndName" resultType="com.bean.Employee">
select * from tab_employee where id=#{id} and last_name=#{name}
</select>
采用Map集合传参:
<!--
//通过Map集合来查询员工信息
Employee getEmployeeByMap(Map<String,Object> map);
-->
<select id="getEmployeeByMap" resultType="com.bean.Employee">
select * from ${tableName} where id=${id} and last_name=#{lastName}
</select>