参考答案
1、MyBatis 是一个半自动 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 SQL,可以严格控制 SQL 执行性能,灵活度高。 2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 3、通过 xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过 Java 对象和 statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。(从执行 SQL 到返回 result 的过程)。
参考答案
优点: 1、基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 SQL 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。 2、与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接; 3、很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。 4、能够与 Spring 很好的集成; 5、提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。 缺点: 1、SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。 2、SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
参考答案
ORM 的全称是 Object Relational Mapping,即对象关系映射。它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作。因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。
参考答案
1、MyBatis 和 Hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要程序员自己编写 Sql 语句。 2、MyBatis 直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是 MyBatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套 sql 映射文件,工作量大。 3、Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 Hibernate 开发可以节省很多代码,提高效率。
参考答案
#{}是预编译处理,${}是字符串替换。 MyBatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值; MyBatis 在处理${}时,就是把${}替换成变量的值。 使用#{}可以有效的防止 SQL 注入,提高系统安全性
参考答案
MyBatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql。 执行原理是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。 MyBatis 提供 了 9 种动态 sql 标签 :trim | where | set | foreach | if | choose| when | otherwise | bind。
参考答案
一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。 二级缓存与一级缓存其机制相同,默认也是采用 HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态), 可在它的映射文件中配置 ; 对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces) 的进行 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。
参考答案
分页插件是:PageHelper。 原理是:分页插件的原理就是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的 SQL,然后根据设置的 dialect(方言),和设置的分页参数,重写 SQL ,生成带有分页语句的 SQL,执行重写后的 SQL,从而实现分页所以原理还是基于拦截器。
参考答案
IoC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在 Java 开发中,IoC 意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
参考答案
AOP 是 OOP 的延续,是 Aspect Oriented Programming 的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。 AOP 设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP 可以说也是这种目标的一种实现。我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),但这些代码往往是重复,复制——粘贴式的代码会给程序的维护带来不便,AOP 就实现了把这些业务需求与系统需求分开来做。
参考答案
前置通知(Before Advice) 后置通知(After Advice) 返回后通知(After Return Advice) 环绕通知(Around Advice) 异常通知(After Throwing Advice)
参考答案
@Component 组件,没有明确的角色 @Service 在业务逻辑层使用(service 层) @Repository 在数据访问层使用(dao 层) @Controller 在展现层使用,控制器的声明(controller 层) @Autowired:属性注入 @Configuration 声明当前类为配置类,相当于 xml 形式的 Spring 配置(类上) @Bean 注解在方法上,声明当前方法的返回值为一个 bean,替代 xml 中的方式(方法上) @ComponentScan 用于对 Component 进行扫描,相当于 xml 中的(类上) @WishlyConfiguration 为@Configuration 与@ComponentScan 的组合注解,可以替代这两个注解 @After 在方法执行之后执行(方法上) @Before 在方法执行之前执行(方法上) @Around 在方法执行之前与之后执行(方法上)
参考答案
@RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。 @RequestParam:参数绑定注解 @ResponseBody:不进行视图跳转,直接进行数据响应 @PathVariable:可以将 URL 中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“) @SessionAttributes:即将值放到 session 作用域中,此注解可声明在类、接口、注解或枚举类上。 @CookieValue:可以把 Request header 中关于 cookie 的值绑定到方法的参数上 @RequestHeader:可以把 Request 请求 header 部分的值绑定到方法的参数上