1)#{}跟${}区别
#{}:#将传入的数据当成一个字符串表示,相当于
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1,id);
相对安全,防止sql的注入;
:
将传入的数据直接以sql语句显示,无法防止sql的注入,一般用于传入数据库对象
exp:
1)#{}:
select * from 数据库 where name=#{..};
动态解析:
select * from 数据库 where name=?;
#被解析为占位符?
2)${}
select * from 数据库 where name=${..};
解析:
select * from 数据库 where name="hfz";
${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。
2)mybatis的xml映射文件常用的几个标签
常见的select,insert,update还有<resultMap>
,<paramterMap>
,<sql>
,<include>
,<selectKey>
;
9个动态的标签:trim,where,foreach,if,bind,choose,when,otherwise
choose,otherwise,when:提供一个choose,按顺序判断是否满足sql查询条件,有则结束,都不满足when中条件则执行otherwise,
类似switch,case,default。
3)xml映射文件与Dao接口里的方法,参数不同时,能否重载?接口的工作原理是什么?
Dao里面的方法是不能重载,工作原理是JDK动态代理,为Dao接口生成代理proxy对象,而此代理会拦截接口方法,而执行MappedStatement代表的
sql,然后将sql执行结果返回。
4)mybatis传参数的方式
1.单个参数
直接以String,或其他基本类型传参
public List<...> getName(String name);
<select id="getNameList" parameterType="java.lang.String" resultType="...">
select t.* from t_Name t where t.name= #{name}
</select>
其中方法名和ID一致,#{}中的参数名与方法中的参数名一直。
2.多个参数
按顺序传参
public list<...> getName(int id,String name);
<select id="getNameList" resultType="...">
select * from T_name where id=#{0} and name=#{1}
</>
注:多参数不能使用parameterTyp
Map传参
<select id="selectTeacher" parameterType="Map" resultType="csc.hfz.Dao.Teacher">
select * from Teacher where c_id=#{id} and sex=#{sex}
</select>
Param注解传参
public int stu(@Param("name")String name,@Param("id")int id);
<select id="selectS" resultType="Integer">
select * from Teacher where name=#{name} and id=#{id}
</select>
更多推荐
几个常见Mybatis面试试题
发布评论