1.#{} 和${}区别
#{} 是占位符,是采用编译方式向sql中传值,可以防止sql注入,如果往sql中传值,使用#{} ${} 是将内容直接拼接到sql语句中,一般不用于向sql中传值,一般用于向sql中动态传递列名。 区别: 1.底层实现不同 #{} 采用预编译方式 可以防止sql注入 更加安全 ${} 采用字符串拼接,直接将值拼接到sql中 2.使用场景不同 #{} 一般用于向sql中的列传值 ${} 一般用于sql动态传递列名 例如,排序时order by 后面的列名是可以改变的。例如,select后面的列名也可以自由选择
2.特殊处理定义 resultMap
(1)定义resultMap
<resultMap id="studentMap" type="Student"> <id column="id" property="id"></id> <result column="num" property="num"></result> <result column="name" property="name"></result> <result column="gender" property="gender"></result> </resultMap>
<select id="findStudentFindById" resultMap="studentMap"> select s.id, s.num, s.name, s.gender, m.name mname from student s inner join major m on s.majorid=m.id where s.id=#{id} </select>
3.多表关联处理结果集
- 嵌套结果映射 – 关联可以是
resultMap
元素,或是对其它结果映射的引用
- 嵌套结果映射 – 集合可以是
resultMap
元素,或是对其它结果映射的引用
4.动态SQL
1.if
<select id="teachers" resultType="Teacher"> select * from teacher <where> <if test="num!=null"> num= #{num} </if> <if test="name!=null"> and name= #{name} </if> <if test="gender!=null"> and gender= #{gender} </if> </where>
语法:<if test=""></if>
注意:test属性成立,执行if标签体,不成立就不执行
2.where
<select id="teachers" resultType="Teacher"> select * from teacher <where> <if test="num!=null"> num= #{num} </if> <if test="name!=null"> and name= #{name} </if> <if test="gender!=null"> and gender= #{gender} </if> </where> </select>
语法:<where></where>
注意:当where标签中的if语句有条件成立时, 就会动态的添加where 关键字, 还可以动态删除where 紧跟着的关键字,例如 and or
3.trim
<select id="teachers" resultType="Teacher"> select * from teacher <trim prefix="where" prefixOverrides="and| or"> <if test="num!=null"> num= #{num} </if> <if test="name!=null"> or name= #{name} </if> <if test="gender!=null"> and gender= #{gender} </if> </trim> </select>
语法<trim prefix="where" prefixOverrides=""> </trim>
作用: trim 当判断条件成立时,可以自定义前缀关键字和后缀关键字
prefix="where"
prefixOverrides="and|or" 覆盖指定关键字
4.choose when otherwise
<select id="teachers" resultType="Teacher"> select * from teacher <trim prefix="where" prefixOverrides="and| or"> <choose> <when test="name!=null"> name=#{name} </when> <otherwise> name='李老师' </otherwise> </choose> </trim> </select>
语法:
<choose>
<when test="判断条件">
执行的sql语句
</when>
<otherwise>
执行其他的sql语句
</otherwise>
</choose>
作用:MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句
5.set
<update id="updateTeacher" parameterType="Teacher"> update teacher <set> <if test="num!=null"> num=#{num}, </if> <if test="name!=null"> name=#{name}, </if> <if test="gender!=null"> gender=#{gender} </if> </set> where id=#{id} </update>
也可以用trim实现
<update id="updateTeacher" parameterType="Teacher"> update teacher <trim prefix="set" suffixOverrides=","> <if test="num!=null"> num=#{num}, </if> <if test="name!=null"> name=#{name}, </if> <if test="gender!=null"> gender=#{gender} </if> </trim> where id=#{id} </update>
6.foreach
array:
<delete id="deleteTeacher">
delete from teacher where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id} </foreach>
</delete>
List:
<select id="findTeacher" resultType="Teacher">
select
<foreach item="col" collection="list" separator=",">
${col}
</foreach>
from teacher
</select>
5.特殊符号处理
6.mybatis 一级缓存二级缓存
缓存作用:是为了减去数据库的压力,提高查询性能
缓存原理:是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存) 中,当再次需要获取该对象时,直接从内存(缓存)中直接获取,不再向数据库 执行 select 语句,从而减少了对数据库的查询次数,因此提高了数据库的性能。(先从缓存中查询数据,缓存中如果没有,去数据库查询,查询到后把数据放到缓存中,下次直接从缓存中获取)
1.mybatis一级缓存
(1)定义:在参数和 SQL 完全一样的情况下,我们使用同一个 SqlSession 对象调 用一个 Mapper 方法,往往只执行一次 SQL,因为使用 SelSession 第一次查询 后,MyBatis 会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新, 并且缓存没有超时的情况下,SqlSession 都会取出当前缓存的数据,而不会再 次发送 SQL 到数据库。(默认是SqlSession级别的,在同一个SqlSession中查询到数据先缓存到SqlSession对象中 第二次查询数据时,先从SqlSession中查询,如果有直接返回,没有,再去查询数据库)
(2)一级缓存生命周期:
开始于SqlSession创建
结束于SqlSession的关闭
如果执行期间新增,修改,删除操作,也会清空当前SqlSession对象中缓存数据。调用sqlSession.clearCache(),强制清空一切缓存数据。
2.mybatis二级缓存
(1)定义:二级缓存是 SqlSessionFactory 级别的,根据 mapper 的 namespace 划分区域的,相同 namespace 的 mapper 查询的数据缓存在同一个区域,如果使 用 mapper 代理方法每个 mapper 的 namespace 都不同,此时可以理解为二 级缓存区域是根据 mapper 划分。 每次查询会先从缓存区域查找,如果找不到则从数据库查询,并将查询到数 据写入缓存。Mybatis 内部存储缓存使用一个 HashMap,key 为 hashCode+sqlId+Sql 语句。value 为从查询出来映射生成的 java 对象。
作用: 二级缓存是SqlSessionFactory级别的,可以让多个SqlSession共享数据
注意:
* mybatis默认没有开启二级缓存,使用时需要配置开启。
* 如果开启二级缓存,当SqlSession关闭时,会将一级缓存数据存储到二级缓存中 , 其他的SqlSession就会从二级缓存中查询到之前的SqlSession数据。
(2)配置二级缓存设置
<1>启用二级缓存
在mybaits.xml文件中配置全局二级缓存开关
如下代码所示,当 cacheEnabled 设置为 true 时启用二级缓存,设置为 false 时禁用二级缓存。