java面试---Mybatis

  1. mybatis 中 #{}和 ${}的区别是什么?
    #{}将传入的数据都当成一个字符串;方式能够很大程度防止sql注入;一般用于传入数据库对象
    将 传 入 的 数 据 直 接 显 示 生 成 在 s q l 中 ; 方 式 无 法 防 止 S q l 注 入 ; M y B a t i s 排 序 时 使 用 o r d e r b y 动 态 参 数 时 需 要 注 意 , 用 {}将传入的数据直接显示生成在sql中;方式无法防止Sql注入;MyBatis排序时使用order by 动态参数时需要注意,用 sql;Sql;MyBatis使orderby而不是#

  2. mybatis 有几种分页方式?
    数组分页、sql分页、拦截器分页、RowBounds分页

  3. RowBounds 是一次性查询全部结果吗?为什么?
    是的。因为RowBounds 采用的是逻辑分页,他将所有的分页信息查出来后在进行分页。

  4. mybatis 逻辑分页和物理分页的区别是什么?
    逻辑分页:即虽然看起来实现了分页的功能,但实际上是将查询的所有结果放置在内存中,每次都从内存获取。
    物理分页:这种分页方法从底层上就是每次只查询对应条目数量的数据,从而实现了真正意义上的分页。

  5. mybatis 是否支持延迟加载?延迟加载的原理是什么?
    支持。将采用高级映射实现多表联查时向数据库发出的SQL语句拆分成若干条单表查询的SQL语句,当需要返回数据时才会向数据库发出只针对当前数据的SQL语句。

  6. 说一下 mybatis 的一级缓存和二级缓存?
    一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。
     二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

  7. mybatis 和 hibernate 的区别有哪些?
    mybatis:1、入门简单,即学即用 2、可以进行更为细致的SQL优化,可以减少查询字段 3、缺点就是框架还是比较简陋,功能尚有缺 4、二级缓存机制不佳
    hibernate :1、功能强大,数据库无关性好,O/R映射能力强2、有更好的二级缓存机制,可以使用第三方缓存 3、缺点就是学习门槛不低,要精通门槛更高

  8. mybatis 有哪些执行器(Executor)?
    SimpleExecutor、ReuseExecutor、BatchExecutor

  9. mybatis 分页插件的实现原理是什么?
    在四大对象创建的时候
    1、每个创建出来的对象不是直接返回的,而是
    interceptorChain.pluginAll( parameterHandler )

    2、获取到所有的interceptor(基于拦截器原理)(插件需要实现的接口)
    调用所有的Interceptor.pluginAll(target);返回target包装后的对象
    3、插件机制,我们可以使用插件为目标对象创建一个代理对象:AOP(面向切面的方式)
    我们的插件可以为四大对象创建出代理对象
    代理对象就可以拦截到四大对象的每一个执行方法

  10. mybatis 如何编写一个自定义插件?
    1). 编写Interceptor的实现类
    2). 使用@Intercepts注解完成插件签名 说明插件的拦截四大对象之一的哪一个对象的哪一个方法
    3). 将写好的插件注册到全局配置文件中

@Intercepts({
    @Signature(type=StatementHandler.class,method="parameterize",args=java.sql.Statement.class)
})
public class MyfirstPlugin implements Interceptor {

    /**
     * 拦截目标对象的目标方法的执行;
     */
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // TODO Auto-generated method stub
        System.out.println("要拦截的方法"+invocation+invocation.getMethod());
        Object prObject = invocation.proceed();
        return prObject;
    }

    /**
     * 包装目标对象的:包装:为目标对象创建一个代理对象
     */
    @Override
    public Object plugin(Object target) {
        // TODO Auto-generated method stub
        System.out.println("包装的对象"+target.toString());
        Object wrap = Plugin.wrap(target, this);
        return wrap;
    }

    /**
     * setProperties:
     *      将插件注册时 的property属性设置进来
     */
    @Override
    public void setProperties(Properties properties) {
        // TODO Auto-generated method stub
        System.out.println(properties);
    }

}

全局配置文件:

<plugins>
    <plugin interceptor="dao.MyfirstPlugin">
    <property name="root" value="jjc"/>
    <property name="pwdword" value="123456"/>
    </plugin>
</plugins>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值