简单介绍下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方法。