模块一_MyBatis模块习题

2020-08-04  本文已影响0人  西西弗斯XD

序言:

文章内容输出来源:拉勾教育Java高薪训练营。
本篇文章是学习课程中的一部分课后笔记

自定义框架流程.png

一、自定义持久层框架Ipersistence是如何解决JDBC存在的问题?

二、进行自定义持久层框架Ipersistence优化时主要为了解决哪些问题?

三、关于configuration 与 mappedStatement配置类的说法:

四、关于genericTokenParser类的说法:

五、关于sqlessionFactoyBuilder,sqlessionFactoy ,sqlession的说法:

六、关于resultType与入参的说法:

七、mybatis中接口开发规范:

八、关于mybatis源码内容的说法:

九、Mybatis动态sql是做什么的?都有哪些动态sql?简述一下动态sql的执行原理?

1.动态sql:
2.动态sql:

<where> 、 <if> 、<include> 、<foreach>

<select id="selectUserByCondition" resultType="com.admin.entity.User">
        select
       <include refid="userInfo"/> 
        from
        user 
        <where> 
        <if test="name !=null and name !=''">
            and name = #{name }
        </if>
        <if test="roleIdList!=null and roleIdList.size() > 0 ">
            and role_id in
            <foreach collection="roleIdList" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </if>
        </where>
</select>

map 入参

<select id="selectByMap" resultType="com.admin.entity.User">
  select * from user where
  <foreach collection="map" index="key" item="value"  separator="=">
    ${key} = #{value}
  </foreach>
</select>

<choose>、 <when>、 <otherwise>

<select id="selectUserInfo" resultType="com.admin.entity.User">
select * from user
 <where>
   <choose>
     <when test="name != null and name != ''">
       and name = #{name }
     </when>
     <otherwise>
       1 = 1
     </otherwise>
   </choose>
 </where>
</select>


<set>、 <trim>

<update id="updateUser" parameterType="com.admin.entity.User">
  update user
  <set>
    <if test="name != null and name != ''">
      name = #{name },
    </if>
  </set>
  where id = #{id}
</update>

<select id="selectUserByTrim" resultType="com.admin.entity.User">
  select * from user
  <trim prefix="where" suffix="order by id" prefixOverrides="and | or" suffixOverrides=",">
    <if test="name != null and name != ''">
      and name = #{name }
    </if>
    <if test="id != null and id !='' ">
      and id = #{id} 
    </if>
  </trim>
</select>


 -- 批量更新
<update id="updateUserInfoByList" parameterType="java.util.List">
        update user
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="name =case" suffix="end,">
                <foreach collection="userList" item="item">
                    <if test="item.name!=null">
                        when id=#{item.id} then #{item.name}
                    </if>
                </foreach>
            </trim>
            <trim prefix="role_id =case" suffix="end,">
                <foreach collection="userList" item="item">
                    <if test="item.roleId!=null and item.roleId!=''">
                        when id=#{item.id} then #{item.roleId}
                    </if>
                </foreach>
            </trim>
        </trim>
        <where>
            <foreach collection="userList" separator="or" item="item">
                id = #{item.id}
            </foreach>
        </where>
    </update>

3.动态sql的执行原理:

十、Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

1.Mybatis支持延迟加载
<settings>
    <!-- 打开延迟加载的开关 -->
    <setting name="lazyLoadingEnabled" value="true"/>
    <!-- 将积极加载改为消极加载,即延迟加载 -->
    <setting name="aggressiveLazyLoading" value="false"/>
</settings>
2.实现原理

十一、Mybatis都有哪些Executor执行器?它们之间的区别是什么?

1.三种Executor:
2.区别

十二、简述下Mybatis的一级、二级缓存(分别从存储结构、范围、失效场景。三个方面来作答)?

1.存储结构:
2.范围:
3.失效场景:

十三、简述Mybatis的插件运行原理,以及如何编写一个插件?

1.运行原理:
2.如何编写:
//插件签名,告诉mybatis当前插件拦截哪个对象的哪个方法
//type表示要拦截的目标对象,method表示要拦截的方法,args表示要拦截方法的参数
@Intercepts({
    @Signature(type=StatementHandler.class,method="parameterize",args=java.sql.Statement.class)
})
public class MySecondPlugin implements Interceptor {

    //拦截目标对象的目标方法执行
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("MySecondPlugin拦截目标对象:"+invocation.getTarget()+"的目标方法:"+invocation.getMethod());
        
        /*
         * 插件的主要功能:在执行目标方法之前,可以对sql进行修改已完成特定的功能
         * 例如增加分页功能,实际就是给sql语句添加limit;还有其他等等操作都可以
         * */
        
        //执行目标方法
        Object proceed = invocation.proceed();
        //返回执行后的返回值
        return proceed;
    }
    //包装目标对象:为目标对象创建代理对象
    @Override
    public Object plugin(Object target) {
        System.out.println("MySecondPlugin为目标对象"+target+"创建代理对象");
        //this表示当前拦截器,target表示目标对象,wrap方法利用mybatis封装的方法为目标对象创建代理对象(没有拦截的对象会直接返回,不会创建代理对象)
        Object wrap = Plugin.wrap(target, this);
        return wrap;
    }
    //设置插件在配置文件中配置的参数值
    @Override
    public void setProperties(Properties properties) {
        System.out.println("MySecondPlugin配置的参数:"+properties);
    }

}

<plugins>
    <plugin interceptor="com.mybatis_demo.plugin.MySecondPlugin"></plugin>
</plugins>
上一篇下一篇

猜你喜欢

热点阅读