java-Mybatis框架02

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>
1. resutlMap 的 id 属性是 resutlMap 的唯一标识,本例中定义为 “studentMap”
2. resutlMap 的 type 属性是映射的 POJO 类型
3. id 标签映射主键,result 标签映射非主键
4. property 设置对象属性名称,column 映射查询结果的列名称
(2)使用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>
1. 本例的输出映射使用的是 resultMap,而非 resultType
2. resultMap 引用了 studentMap

3.多表关联处理结果集

resultMap 元素中 association , collection 元素.
association 一个复杂类型的关联;许多结果将包装成这种类型
  • 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
Collection  一个复杂类型的集合( 关联元素处理一对多关联
  • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
关联查询方式
1.关联查询方式一:直接多表关联查询获得学生及专业的信息
2.关联查询方式二:先查询主表(学生表),再通过学生表中的majorid与专业表关联,查询专业表
,得到Major对象,最后将得到的Major对象封装到学生对象中。

4.动态SQL

对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

主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach 元素的属性主要有 item,index,collection,open,separator,close。
item 表示集合中每一个元素进行迭代时的别名。
index 指定一个名字,用于 表示在迭代过程中,每次迭代到的位置。
open 表示该语句以什么开始。
separator 表示在每次进行迭代之间以什么符号作为分隔符。
close 表示以什 么结束。
  在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。
如果传入的是单参数且参数类型是一个 List 的时候,collection 属 性值为 list
如果传入的是单参数且参数类型是一个 array 数组的时候, collection 的属性值为 array
例如,可以用foreach来批量删除教师表的信息,用Integer[]数组来存放id,foreach循坏拿到id,
放入数组中

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.特殊符号处理

在 mybatis 中的 xml 文件中,存在一些特殊的符号,比如:<、>、"、&、<> 等,正常书写 mybatis 会报错,需要对这些符号进行转义。具体转义如下所示:
特殊字符 转义字符
<      &lt
>     &gt
"      &quot
’      &apos
&     &amp
除了可以使用上述转义字符外,还可以使用<![CDATA[]]>来包裹特殊字符。如 下所示:
<if test="id != null">
AND <![CDATA[ id <> #{id} ]]>
</if>
<![CDATA[ ]]>是 XML 语法。在 CDATA 内部的所有内容都会被解析器忽略。
问题:那就是 <if> </if> <where> </where> <choose> </choose> <trim> </trim> 等这些标签都不会被解析,所以 我们只把有特殊字符的语句放在 <![CDATA[ ]]> 尽量缩小<![CDATA[ ]]> 的范围。

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数据。

sqlSession 执行 insert、update、delete 等操作 commit 提交后会清空缓存区 域,防止脏读。
二级缓存机制设计及工作模式如下图所示:

(2)配置二级缓存设置

<1>启用二级缓存

在mybaits.xml文件中配置全局二级缓存开关

如下代码所示,当 cacheEnabled 设置为 true 时启用二级缓存,设置为 false 时禁用二级缓存。

<setting name="cacheEnabled" value="true"/>
<2>对象序列化
将所有的 POJO 类实现序列化接口 Java.io. Serializable(这里我用的是Teacher类)
<3>配置映射文件
在 TeacherMapper 映射文件中添加<cache />/<cache></cache>,表示此 mapper 开启二级缓存。
当 SqlSeesion 关闭时,会将数据存入到二级缓存.
注意:可以在使用的方法上配置是否开启二级缓存 使用useCache=""属性可以来开启或关闭二级缓存

3.mybatis架构

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值