背景
原来的项目,经常使用hibernate作为持久层框架。但是随着智能手机兴起等各方面的因素,现在早已经跨入了互联网时代。
在互联网的大环境下,Java也需要与时俱进,现在企业越来越多的都是需要搭建互联网服务器,不是针对某个公司,某个企业,而是针对全国甚至是全球。在这种前提之下,系统的高并发、高性能就的处理能力就变得尤为重要。
hibernate作为曾经orm框架的首选者,在互联网时代却处于非常尴尬的地步。高度的封装给程序员带来了最大化的便利,只需简单几个方法就能实现数据库的各种操作,程序员完全无需关心sql语句的编写,曾经这种高度自动化的封装几乎让hibernate一统天下,但是随着程序对性能的要求越来越高的同时,这种程序员无法干预sql语句的做法,反而不利于sql语句的优化,在某些需要对sql进行高度优化的需求面前,hibernate就显得无能为力。这个时候,MyBatis就进入了大家的视野。
MyBatis使用的是半自动化的封装,对程序员来说sql还是需要手写的,另外对存储过程的良好兼容,让一些对sql语句性能有着高度要求的系统找到了很好的解决方案。为了顺应时代的号召,笔者也开始学着如何使用Mybatis。
问题
图解
APT
开发工具-Eclipse
首先创建一个普通的Java工程。创建一个自定义注解:
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
String value() default "Hello";
}
需要注意一点,注解的Retention必须设置为RetentionPolicy.CLASS,表示在编译期可以访问。
@SupportedSourceVersion(SourceVersion.RELEASE_7)
@SupportedAnnotationTypes({"com.apt.MyAnnotation"})
public class MyProcession extends AbstractProcessor{
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
return false;
}
}
这里需要介绍下@SupportedSourceVersion和@SupportedAnnotationTypes两个注解:
private Messager messager;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
messager = processingEnv.getMessager();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
//获得所有注解了MyAnnotation的类集合 - 每个类对于APT来说就是一个Element对象
Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(MyAnnotation.class);
//循环遍历所有节点(映射接口)
for(Element ele : elements){
//输出测试信息
messager.printMessage(Kind.WARNING, "测试信息!!!!!!" + ele.getSimpleName(), ele);
}
return true;
}
大概含义已经用注解解释的很清楚了,这里需要说下,因为process方法是在编译时运行的,所以不能用System.out.println();输出语句输出信息。这里采用了APT给我们提供的一个信息输出工具类Messager。Messager的获取是在另一个重写方法init中获得的,在init中还可以获得后续我们需要用到的一些工具类。
com.qf.apt.procession.MyProcession (即AbstractProcessor实现类的全路径)
测试
右键工程 -> Properties -> Java Compiler -> Annotation Processing,如图:
接着设置Annotation Processing下的Factory Path,点击Add JARs...,选中APT生成的jar包。然后点击Advanced...,选中MyProcess类,具体如下图:
@MyAnnotation
public class TestAnnotation {
}
ctrl + s 保存该类,会触发Eclipse的自动编译,这时会看到Problems页签下输出测试信息: