本文主要是【Mybatis】——Mybatis面经的文章,如果有什么需要改进的地方还请大佬指出⛺️
作者简介:大家好,我是听风与他
☁️博客首页:CSDN主页听风与他
每日一句:狠狠沉淀,顶峰相见
区别:
<setting name="cacheEnabled" value="true" />
<cache eviction="FIFO" flushInterval="60000" size="512"
readOnly="true"/>
禁用缓存
<select id="findAllPets" resultMap="petsMap" useCache="false">
select * from pets
select>
刷新缓存
相同点:都能取到变量的值
不同点:#{ }可以实现预编译,会先把#{ }编译成?,在执行时再取值,可以防止sql注入。
${ }是直接进行字符串替换
#符号解析:主要在数据类型检查和安全检查两部分。
#符号的应用场景:需要在sql映射文件中动态拼接sql时的开发场景,比如传入多个变量进行条件查询,传入一个pojo进行数据插入等。
符号解析: { }符号解析: 符号解析:符号主要用于传入的参数是sql片段的场景下,会直接进行字符串替换,完成了sql的拼接,
比如我们不在sql映射文件中利用mybatis的动态sql来拼接sql,而是在java代码中去动态的拼接sql,然后将拼接的sql片段作为变量传入sql映射文件。上面也说了$符号只是进行字符串的替换,如果我们传入一个sql片段的话,相当于直接进行了sql拼接,就不用在sql映射文件中利用mybatis提供的动态sql标签来拼接sql了。甚至可以这样:
<select id="getUserPage" resultType="com.ymxx.oa.bean.User">
${sql片段}
select>
*对于这样外部传入的sql,就不能使用#{},上面也说了,#{}会进行预编译,检测到该sql片段是个字符串,就会加上引号,即’sql片段’,这样就是字符串了而不是sql,执行会报错。*
依据$适用于传入sql片段的情况,我们可以将数据表字段名、表名、数据库名等传入,来进行sql拼接,如:
$符号的应用场景:
比如:select ${columns} from ${tableName},假设columns变量的值是userName,age 。tableName变量的值是user,那么该sql语句就会被解析成:select userName,age from user
比如有这样一个需求:对于后台管理系统的table列,想让用户选择展示哪些列,不展示哪些列,或者根据权限来分配不同的用户可以看到哪些列?
这个需求正好用到了 符号,我们可以将每个用户对于一个 t a b l e 能看到哪些列,存储到数据表中,对该数据表进行 c r u d ,每次展示列表的时候,先根据用户 I D 和 t a b l e 类型,到数据表中查询该用户对该 t a b l e 能看到的列名 ( 字段名 ) 列表,然后将该字段名列表作为 s q l 片段传入 m y b a t i s 进行查询,此时就必须得用到 符号,我们可以将每个用户对于一个table能看到哪些列,存储到数据表中,对该数据表进行crud,每次展示列表的时候,先根据用户ID和table类型,到数据表中查询该用户对该table能看到的列名(字段名)列表,然后将该字段名列表作为sql片段传入mybatis进行查询,此时就必须得用到 符号,我们可以将每个用户对于一个table能看到哪些列,存储到数据表中,对该数据表进行crud,每次展示列表的时候,先根据用户ID和table类型,到数据表中查询该用户对该table能看到的列名(字段名)列表,然后将该字段名列表作为sql片段传入mybatis进行查询,此时就必须得用到符号,而不能用#符号了。
符号的 s q l 注入问题:用 符号的sql注入问题: 用 符号的sql注入问题:用{}时要特别注意sql注入的风险,如果该sql片段是根据用户的输入拼接的,要注意检查sql注入的问题,防止数据的泄露与丢失!
resultType:
使用resultType进行输出映射时,至少查询出来的列名和pojo(简单实例对象)中的属性名一致,该列才可以映射成功。
int,string,list中元素的类型
<select id="count" resultType="int">
select count(id) from t_paper as p
LEFT JOIN t_type as t
ON
p.type_id=t.id
select>
resultMap:
<resultMap id="paperResult" type="Paper">
<result column="id" property="id"/>
<result column="title" property="title"/>
<result column="type_id" property="typeId"/>
<result column="paper_summary" property="paperSummary"/>
<result column="paper_path" property="paperPath"/>
resultMap>
<select id="selectPaperListByCondition" resultMap="paperResult">
SELECT
p.*, t.type_name from t_paper as p
LEFT JOIN
t_type as t
ON
p.type_id=t.id
WHERE
title='' and type_name=''
<where>
<if test="title != null and title != ''">
and title like '%${title}%'
if>
<if test="typeName != null and typeName != ''">
and type_name=#{typeName}
if>
where>
limit #{start},#{size}
select>