简单介绍下Mybatis

  • Mybatis是一个半ORM框架,它封装了JDBC,开发时只需要关注SQL本身,不需要再去做 驱动加载、创建连接等操作,这样使用起来更简洁,领活动够高。
  • Mybatis可以使用XML或者注解来配置原生信息,提高效率

Mybatis的优缺点

  • 优点:
  • 基于SQL语句编程,不会对应用程序有影响,SQL写在XML里面,解除SQL和代码的耦合,便于统一管理,XML支持多种标签,可复用。
  • 只关注于SQL的业务逻辑编写,不关注驱动加载、创建连接等。
  • 很好的和各种数据库兼容,如Mysql、Postgre等
  • 能够和Spring很好的集成
  • 缺点:
  • SQL编写工作量大,特别是字段多,关联表多时
  • SQL语句依赖数据库,数据库移植性差 ,不能随意更换数据库。

#{}和${}的区别是什么

  • #{}是预编译处理、${}是字符串替换
  • #{}可以有效的防止SQL注入,提高系统的安全性

当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

  • 在查询的时候,as 别名,保持和entity类中一致
  • 通过resultMap 配置字段名和实体类名

Mybatis是如何将sql执行结果封装为目标对象并返回的?

  • 使用XML标签,挨个定义数据库列名和实体类
  • 使用SQL的别名,将列的别名写成实体属性
  • 有了列名和属性名的映射关系后,Mybatis通过反射创建对象,同时通过反射给对象属性挨个赋值并返回,如果找不到对应关系的,是没办法进行赋值的

Mybatis是否支持延迟加载,延迟加载的原理是什么

  • 可以配置是否启用延迟加载 lazyLoadingEnabled=true|false
  • 原理是:使用CGlib创建目标对象的代理对象,当调用目标方法时,进入拦截方法。
  • 当去获取一个属性值时,如果这个值为null,那么会单独发送实现保存好的SQL,去把这个属性查询出来,进行赋值,这个时候这个属性就有值了,这就是延迟加载的基本原理。

JDBC编程有哪些步骤

  • 加载驱动 Class.forName(“com.mysql.jdbc.Driver”);
  • 建立Connection连接
  • 创建执行对象和执行语句
  • 获取返回结果
  • 关闭资源

Mybatis中用到哪些设计模式

  • 代理模式:延迟加载CGlib
  • 模板方法模式:Executor
  • 工厂模式:SqlSessionFactory

MyBatis 中比如 UserMapper.java 是接口,为什么没有实现类还能调用

  • 因为是使用JDK来实现动态代理、本质上调用的是 MapperProxy的invoke方法。