我自己总结了一下重要的Mybatis知识点。因为我老是忘记,记性不是很好。
1.#{}和${}的区别是什么?
这道题好像是Mybatis经常问到的一题,但是我看完老是忘记。
a:#{}相当于jdbc里的PrepareSatatement,在预编译阶段,会被解析为一个参数占位符?,最后的参数都会加上“”号。
b:${}替换为变量的值,数据直接显示在sql中
c:正因此#{}可以有效的防止sql注入,一般更推荐用#{},当然也有一些地方必须要用${},比如进行order by 排序时候,或者表名时候。
举个例子:
表名是字符串,用sql占位符的替换字符串时候,会加上‘’号,例如:
select * from #{tableName} where name=#{name}
预编译之后变成:
select * from ? where name=?
假设传入的参数tableName为“user”,name=“张三”,
select * from 'user' where name='张三'
这样sql语句就是不正确的,因为表名不能加引号。
所以我们可以这样写
select * from ${tableName} where user_code = #{userCode}
$符是直接拼成sql的 ,#符则会以字符串的形式 与sql进行拼接。
2.like模糊查询有几种实现方式?
第一种在java代码中添加通配符,
示例一:
01.String wildcardName = "%Smi%";
02.List<Name> names = mapper.selectLike(wildcardName);
01.<select id="selectLike">
02. select * from foo where bar like #{value}
03.</select>
第二种在sql语句中添加通配符
示例二:
01.String wildcardName = "Smi";
02.List<Name> names = mapper.selectLike(wildcardName);
01.<select id="selectLike">
02. select * from foo where bar like '%' || '${value}' || '%'
03.</select>
三,批量插入
方法一:
使用<foreach>标签
方法二:
mybatis ExecutorType.BATCH
https://my.oschina.net/u/202293/blog/741949
四:传递多个参数的值
http://www.jb51.net/article/85524.htm
一共有三种
第一种:其中,#{0}代表接收的是dao层中的第一个参数,#{1}代表dao层中第二参数,更多参数一致往后加即可。
第二种:存贮在map中,用map中的key,映射sql占位符中的变量名
第三种:用注解@para
五.当实体类中属性名和数据表中字段名不同时应该怎么处理?
这个题在实际开发中还是很使用的
第一种:在查询sql中定义字段名的别名,使他与属性名相同(推荐使用,代码简介易懂)
第二种:通过<resultMap>来映射字段名和属性名之间的关系
六.通常一个xml映射文件中,都会写一个Dao接口与之对应,请问这个Dao的工作原理,Dao方法里的参数不同时,可以重载吗?