1. 什么是MyBatis?

    mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

  2. #{}和${}的区别是什么?

    (1) 1)#{} 为参数占位符 ?,即sql 预编译

    ​ 2)${} 为字符串替换,即 sql 拼接

    (2) 1)#{}:#{}是经过预编译的,是安全的, 能防止sql 注入

    ​ 2){}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入**。

  3. 在mapper中如何传递多个参数,都有哪几种

    方法1:顺序传参法 #{}`里面的数字代表你传入参数的顺序。

    方法2:@Param注解传参法 #{}里面的名称对应的是注解@Param`括号里面修饰的名称。

    方法3:Map传参法 #{}里面的名称对应的是Map`里面的key名称。

    方法4:Java Bean传参法 #{}里面的名称对应的是User`类里面的成员属性。

  4. 说出MyBatis动态标签(至少5个)

    1.if(用于之后作为条件判断,用于更新的操作)

    2.choose(when,otherwise)(类似于我们Java中的switch语句)

    trim(where,set)

    4.foreach(多用于批量操作)

    5.set

  5. parameterType和resultType的区别

    resultType: 主要针对于从数据库中提取相应的数据出来

    parameterType:通过parameterType传入简单类型或对象

  6. 在用MyBatis插入时,如何得到数据库自增的主键值?

    keyProperty :返回的主键值赋给哪个属性

    useGeneratedKeys: 是否自动生成主键,默认false

    主键自动生成,取决于数据库是否支持自增主键。实际上当设置了useGeneratedKeys=“true”,Mybatis会调用JDBC的getGeneratedKeys方法,并将获取的主键值赋值给keyProperty 指定的属性。

  7. MyBatis批量删除时,请问如何实现?

     <delete id="batchDeleteUsers">
         DELETE FROM user WHERE user_id IN 
         <foreach collection="list" item="id" open="(" separator="," close=")">
             #{id}
         </foreach>
     </delete>
  8. MyBatis批量添加时,请问如何实现?

    <insert id="batchAddUser" parameterType="user">
         INSERT INTO user(user_name,create_time) VALUES 
         <foreach collection="users" item="item"  separator="," >
             (#{item.userName},#{item.createTime})
         </foreach>
     </insert>
  9. JDBC为什么比Mybatis效率快?

    MyBaties 也是基于JDBC的。Java与数据库操作仅能通过JDBC完成。MyBaties也要通过JDBC完成数据查询、更新这些动作。MyBaties 仅仅是在JDBC基础上做了,OO化、封装事务管理接口这些东西。

    反射相对而言是比较影响性能

  10. MyBatis框架中用到了哪些设计模式?(3个)

    1. Builder模式 : 例如 SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;
    2. 工厂模式 : 例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;
    3. 单例模式 :例如ErrorContext和LogFactory;
    4. 代理模式 :Mybatis实现的核心,比如MapperProxy、ConnectionLogger,用的jdk的动态代理;还有executor.loader包使用了cglib或者javassist达到延迟加载的效果;
    5. 组合模式 :例如SqlNode和各个子类ChooseSqlNode等;
    6. 模板方法模式 : 例如BaseExecutor和SimpleExecutor,还有BaseTypeHandler和所有的子类例如IntegerTypeHandler;
    7. 适配器模式 : 例如Log的Mybatis接口和它对jdbc、log4j等各种日志框架的适配实现;
    8. 装饰者模式 : 例如cache包中的cache.decorators子包中等各个装饰者的实现;
    9. 迭代器模式 : 例如迭代器模式PropertyTokenizer;