Java:Mybatis拓展

一、动态Sql

1、if和where标签

多条件查询使用if标签,

where标签的作用:让where子句更加动态智能。

所有条件都为空时,where标签保证不会生成where子句;自动去除某些条件前面多余的and或or。

    <select id="select" parameterType="banner" resultType="banner" >
        select * from banner
        <where>
        <if test="bannerDec != null and bannerDec != ''">
            banner_dec = #{bannerDec}
        </if>
        <if test="bannerStatus != null and bannerStatus != ''">
            banner_status = #{bannerStatus}
        </if>
        </where>
    </select>

2、set标签

主要使用在update语句当中,用来生成set关键字,同时去掉最后多余的“,”

     <update id="update" parameterType="banner" >
        update banner
        <set>
            <if test="bannerImg != null and bannerImg != ''">
                banner_img = #{bannerImg},
            </if>
            <if test="bannerDec != null and bannerDec != ''">
                banner_dec = #{bannerDec},
            </if>
            <if test="bannerStatus != null and bannerStatus != ''">
                banner_status = #{bannerStatus},
            </if>
        </set>
        where banner_id = #{bannerId}
    </update>

3、choose when otherwise

<choose>
  <when></when>
  <when></when>         
  <otherwise></otherwise>
</choose>              

相当于if(){}else{}if(){}

4、foreach标签

循环数组或集合,动态生成sql;多数用在批量删除和添加

<delete id="deleteById">
  delete from banner where id in
  <foreach collection="ids" item="id" separator="," open="(" close=")">
    #{id}
  </foreach>
</delete>
<insert id="insert">
  insert into banner values 
  <foreach collection="banners" item="banner" separator=",">
    (null,#{bannerDec}, #{bannerStatus})
  </foreach>
</insert>

5、sql标签和incluede标签

sql标签用来声明sql片段、include标签用来将声明的sql片段包含到某个sql语句当中

作用:代码复用、易维护。

二、Mybatis高级映射与延迟加载

1、多对一

①:级联属性映射、

②:association(关联)---修改resultMap中的配置:association即可。

<resultMap id="studentResultMap" type="Student">
  <id property="sid" column="sid"/>
  <result property="sname" column="sname"/>
  <association property="clazz" javaType="Clazz">
    <id property="cid" column="cid"/>
    <result property="cname" column="cname"/>
  </association>
</resultMap>

③:分布查询(用的多) ----可以实现延迟加载

<!--
select:设置分步查询,查询某个属性的值的sql的标识(namespace.sqlId)
column:将sql以及查询结果中的某个字段设置为分步查询的条件
-->
<association property="dept"
select="com.isluantic.mapper.DeptMapper.getEmpDeptByStep" column="did">
</association>

​

2、一对多

一对多的实现,通常是在一的一方中有List集合属性。

①:collection

<resultMap id="clazzResultMap" type="Clazz">
  <id property="cid" column="cid"/>
  <result property="cname" column="cname"/>
  <collection property="stus" ofType="Student">
    <id property="sid" column="sid"/>
    <result property="sname" column="sname"/>
  </collection>
</resultMap>

②:分布查询----可以实现延迟加载

<!--
select:设置分步查询,查询某个属性的值的sql的标识(namespace.sqlId)
column:将sql以及查询结果中的某个字段设置为分步查询的条件
-->
<association property="dept"
select="com.isluantic.mapper.DeptMapper.getEmpDeptByStep" column="did">
</association>

 

3、多对一延迟加载

延迟加载:需要在association标签中添加fetchType="lazy"

 <association property="clazz" column="cid"fetchType="lazy"/>

全局延迟加载:开启全局延迟加载之后,所有的sql都会支持延迟加载。

<settings>
  <setting name="lazyLoadingEnabled" value="true"/>
</settings>

不想全局加载,需要单独配置fetchType="eager",针对某个特定的sql,就关闭了延迟加载机制。

4、resultMap及其子标签和属性的含义

在 MyBatis 中,resultMap 是用来完成 SQL 查询结果到 Java对象的映射关系的重要配置项。下面列出 resultMap 常用的子标签和属性以及其含义:

<resultMap> 标签:为一个结果集指定唯一的 ID 名称,可以通过 select 的 resultMap 属性或其他需要使用 resultMap 的地方引用该 resultmap。
id:结果映射的名称,必须唯一。
type:映射的目标对象类型。
extends:继承现有的 ResultMap 配置
<id> 标签:映射表的主键,在将查询结果集映射成 Java 对象时必须设置。
property:Java 对象中对应的属性名。
column:查询结果集中对应的字段名。
javaType:对应的Java实体类类型。
<result> 标签:将列值映射成 Java 对象属性。
property:Java 对象中对应的属性名。
column:查询结果集中对应的字段名。
javaType:Java 类型。
<association> 标签:用于一对一的映射。
property:当前对象(包含该 association)所属类在 Java 中对应的属性名
resultMap:该关联关系映射使用的另外一个 resultMap
notNullColumn:指定一条属性不为空的列名字。ManyToOne 情况下可以指定
javaType:该属性的数据类型
<collection> 标签:用于一对多的映射。
property:在对象中用来表示关联数据集合的属性名
ofType:用于定义集合元素所映射的 Java 类型
resultMap:指定此一对多关系对应的另一个 resultMap 名称

三、缓存机制

1、缓存的作用:

通过减少IO的方式,来提高程序的执行效率。

2、mybatis的缓存:

将select语句的查询结果放到缓存(内存)当中,下一次还是这条select语句的话,直接从缓存中取,不再查数据库。一方面是减少了IO。另一方面不再执行繁琐的查找算法。效率大大提升。

3、mybatis缓存包括:

①一级缓存:将查询到的数据存储到SqlSession中。

一级缓存默认是开启的。不需要做任何配置。

原理:只要使用同一个SqlSession对象执行同一条SQL语句,就会走缓存。

②二级缓存:将查询到的数据存储到SqlSessionFactory中。

二级缓存的范围是SqlSessionFactory。

使用二级缓存需要具备以下几个条件:

全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。默认就是true,无需设置。

<setting name="cacheEnabled" value="true">

在需要使用二级缓存的SqlMapper.xml文件中添加配置:<cache />。

使用二级缓存的实体类对象必须是可序列化的,也就是必须实现java.io.Serializable接口。

SqlSession对象关闭或提交后,一级缓存中的数据才会被写入到二级缓存中,二级缓存才可用。

4、一级缓存失效

①不同的SqlSession对象。

第一次查询和第二次查询之间,手动清空了一级缓存。

②:查询条件变化了。

第一次查询和第二次查询之间,执行了增删改操作。

这个增删改和哪张表没有关系,只要有insert delete update操作,一级缓存就失效。

缓存只针对于DQL语句,也就是说缓存机制只对应select语句

5、二级缓存失效

二级缓存的失效:只要两次查询之间出现了增删改操作。二级缓存就会失效。一级缓存也会失效。

6、缓存顺序

先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存;
如果一级缓存也没有命中,则查询数据库;
SqlSession关闭之后,一级缓存中的数据会写入二级缓存。

四、分页功能

1、添加依赖

        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.0</version>
        </dependency>

2、在mybatis-config.xml里面添加组件

<plugins>
    <!--设置分页插件-->
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

3、分页插件的使用

a>在查询功能之前使用PageHelper.startPage(int pageNum, int pageSize)开启分页功能
pageNum:当前页的页码 、pageSize:每页显示的条数
b>在查询获取list集合之后,使用PageInfo<T> pageInfo = new PageInfo<>(List<T> list, int
navigatePages)获取分页相关数据
list:分页之后的数据 、navigatePages:导航分页的页码数
c>分页相关数据
PageInfo{
pageNum=8, pageSize=4, size=2, startRow=29, endRow=30, total=30, pages=8,
list=Page{count=true, pageNum=8, pageSize=4, startRow=28, endRow=32, total=30,
pages=8, reasonable=false, pageSizeZero=false},
prePage=7, nextPage=0, isFirstPage=false, isLastPage=true, hasPreviousPage=true,
hasNextPage=false, navigatePages=5, navigateFirstPage4, navigateLastPage8,
navigatepageNums=[4, 5, 6, 7, 8]
}
pageNum:当前页的页码、pageSize:每页显示的条数、size:当前页显示的真实条数、
total:总记录数、pages:总页数、prePage:上一页的页码、nextPage:下一页的页码isFirstPage/isLastPage:是否为第一页/最后一页、hasPreviousPage/hasNextPage:是否存在上一页/下一页、navigatePages:导航分页的页码数、navigatepageNums:导航分页的页码,[1,2,3,4,5]

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IsLuNaTiC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值