Java面试准备-Mybatis篇
原创
©著作权归作者所有:来自51CTO博客作者rundreamsFly的原创作品,请联系作者获取转载授权,否则将追究法律责任
简单介绍下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方法。