Java 自定义注解
Java 注解很多地方都会用到,也为我们的开发提供了不少便利,但是对于 Java 自定义注解,却没有真正的去使用过,只是停留在概念的阶段,这两天突发奇想,就想利用 Java 的自定义注解做点事情,于是就有了此文。
此文将描述的是一个模拟持久层框架初始化数据的过程。就像 hibernate
那样,不需要手动去数据库建表,就可以通过代码来初始化好数据库。
我本次就是打算模拟该过程,自己去实现一下。
准备注解
这只是一个简单的学习 demo ,所有都只是做一些简单的基本功能实现,代码也都是随便写的,不喜勿喷。
数据库表注解
/**
* table annotation
* @author : gitor
* @date : 2017/11/24 下午10:54
*/@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
//table name
String value();
}
上面就是数据库表注解的代码,这个没有什么,看一眼就明白,我就不说了
数据库主键注解
/**
* id 注解,注解与字段之上,用于标识该字段需要设置为数据库主键
* @author : gitor
* @date : 2017/11/24 下午9:41
*/@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Id {
// 自增标识,true 标识该字段需要数据库自增
boolean value() default false ;
}
数据库主键的注解,这个注解加了一个是否自增的标识
准备 jdbc
/**
* jdbc 工具类
* @author : gitor
* @date : 2017/11/24 下午11:02
*/public class Jdbc {
/**
* get connection * @return
*/
private Connection getConnection(){
try {
//load jdbc Driver
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.out.println("the jdbc driver not found!");
e.printStackTrace();
}
String url = "jdbc:mysql://127.0.0.1:3306/init" ;
String username = "root";
String password = "lwl123";
Connection conn = null ;
try {
conn = DriverManager.getConnection(url,username,password);
} catch (Exception e) {
System.out.println("get connection filed!");
e.printStackTrace();
}
return conn;
}
/**
* excute init */ public void init(String a){
Connection conn = this.getConnection();
if (conn == null){
System.out.println("connection is null !");
return ; }
try {
Statement st = conn.createStatement();
String sql = "SELECT * FROM b ";
PreparedStatement ps = conn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
System.out.println("here !");
while (rs.next()){
String name = rs.getString("name");
System.out.println("name:"+name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
就是一个简单的 jdbc 获取链接,没有做太多的东西
测试用的实体类
**
* 测试用的实体类
* @author : gitor
* @date : 2017/11/24 下午10:56
*/@Table("test")
public class Test {
@Id(true)
private Integer id;
private String name;
private Integer age;
public Test() {
}
public Test(Integer id,String name,Integer age){
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
注解解析类
/**
* 解析注解 * @author : gitor
* @date : 2017/11/25 下午2:35
*/public class ParseOneClass {
/**
* parse annotation */ private static void parseOneClass(Class s){
Annotation a= s.getAnnotation(Table.class);
String className = s.getName();
//获取某个类到所有属性
Field[] fields = s.getDeclaredFields();
//解析类
if (a instanceof Table){
Table table = (Table) a;
System.out.println(className +"该类需要在数据库建表,数据库表名为:"+table.value());
}
//解析字段
System.out.println("该类对应数据库表的字段为:");
for(int i =0;ilength;i++){
String name = fields[i].getName();
Type type = fields[i].getGenericType();
System.out.println("字段名:"+name+",类型:"+type);
Annotation annotation = fields[i].getAnnotation(Id.class);
if(annotation instanceof Id){
//是否自增
boolean auto = ((Id) annotation).value();
if(auto == true){
System.out.println("数据库主键为:"+name+",需要数据设为自增长!");
}else{
System.out.println("数据库主键为:"+name+",不需要数据设为自增长!");
}
}
}
}
/**
* 对应包下面所有的类 */ public static void parse(){
String packageName = "entity";
// List classNames = getClassName(packageName);
// for (String className : classNames) {
// System.out.println(className);
// }
parseOneClass(Test.class);
}
}
目前由于我还为实现获取一个包下的所有类来操作,所以测试的时候为是直接指定类来测试的,后续会继续搞一下。
main 方法
/**
* main Class
* @author : gitor
* @date : 2017/11/24 下午9:38
*/public class Initor {
public static void main(String[] args) {
// Jdbc jdbc = new Jdbc();
// jdbc.init("");
Class s = Test.class;
ParseOneClass.parse();
}
}
测试结果
由于还在拼接 sql 就下班了,所以最终的测试结果就直接控制台打印出来了,晚上回去再研究研究 一整个包进行扫描解析的。不过剩下的都是 jdbc 的事,还有扫描包的话,估计要直接读文件吧,在这个例子中注解的使用应该就这些了,没什么太大的难度。如果最后需要完整的 demo,那就等(二) 吧。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于