java jdbc 注解_Java中的注解原来是这么用的

先看一个普通的例子

packageutil;

importjava.sql.Connection;

importjava.sql.DriverManager;

importjava.sql.SQLException;

public classDBUtil {

static String ip = "127.0.0.1";

static int port = 3306;

static String database = "test";

static String encoding = "UTF-8";

static String loginName = "root";

static String password = "admin";

static{

try{

Class.forName("com.mysql.jdbc.Driver");

} catch(ClassNotFoundException e) {

e.printStackTrace();

}

}

public static Connection getConnection() throwsSQLException {

String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);

returnDriverManager.getConnection(url, loginName, password);

}

public static void main(String[] args) throwsSQLException {

System.out.println(getConnection());

}

}

自定义注解@JDBCConfig

接下来,就要把DBUtil这个类改造成为支持自定义注解的方式。 首先创建一个注解JDBCConfig

1. 创建注解类型的时候即不使用class也不使用interface,而是使用@interface

public @interface JDBCConfig

2. 元注解

@Target({METHOD,TYPE}) 表示这个注解可以用用在类/接口上,还可以用在方法上

@Retention(RetentionPolicy.RUNTIME) 表示这是一个运行时注解,即运行起来之后,才获取注解中的相关信息,而不像基本注解如@Override那种不用运行,在编译时eclipse就可以进行相关工作的编译时注解。

@Inherited 表示这个注解可以被子类继承

@Documented 表示当执行javadoc的时候,本注解会生成相关文档

3. 注解元素,这些注解元素就用于存放注解信息,在解析的时候获取出来

String ip();

int port() default 3306;

String database();

String encoding();

String loginName();

String password();

packageanno;

import staticjava.lang.annotation.ElementType.METHOD;

import staticjava.lang.annotation.ElementType.TYPE;

importjava.lang.annotation.Documented;

importjava.lang.annotation.Inherited;

importjava.lang.annotation.Retention;

importjava.lang.annotation.RetentionPolicy;

importjava.lang.annotation.Target;

@Target({METHOD,TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Inherited

@Documented

public @interfaceJDBCConfig {

String ip();

int port() default 3306;

String database();

String encoding();

String loginName();

String password();

}

注解方式DBUtil

有了自定义注解@JDBCConfig之后,我们就把非注解方式DBUtil改造成为注解方式DBUtil。

如例所示,数据库相关配置信息本来是以属性的方式存放的,现在改为了以注解的方式,提供这些信息了。

注: 目前只是以注解的方式提供这些信息,但是还没有解析,接下来进行解析

packageutil;

importanno.JDBCConfig;

@JDBCConfig(ip = "127.0.0.1", database = "test", encoding = "UTF-8", loginName = "root", password = "admin")

public classDBUtil {

static{

try{

Class.forName("com.mysql.jdbc.Driver");

} catch(ClassNotFoundException e) {

e.printStackTrace();

}

}

}

解析注解

接下来就通过反射,获取这个DBUtil这个类上的注解对象

JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class);

拿到注解对象之后,通过其方法,获取各个注解元素的值:

String ip =config.ip();int port =config.port();

String database=config.database();

String encoding=config.encoding();

String loginName=config.loginName();

String password= config.password();

后续就一样了,根据这些配置信息得到一个数据库连接Connection实例。

packageutil;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importanno.JDBCConfig;

@JDBCConfig(ip= "127.0.0.1", database = "test", encoding = "UTF-8", loginName = "root", password = "admin")public classDBUtil {static{try{

Class.forName("com.mysql.jdbc.Driver");

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

}public static Connection getConnection() throwsSQLException, NoSuchMethodException, SecurityException {

JDBCConfig config= DBUtil.class.getAnnotation(JDBCConfig.class);

String ip=config.ip();int port =config.port();

String database=config.database();

String encoding=config.encoding();

String loginName=config.loginName();

String password=config.password();

String url= String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);returnDriverManager.getConnection(url, loginName, password);

}public static void main(String[] args) throwsNoSuchMethodException, SecurityException, SQLException {

Connection c=getConnection();

System.out.println(c);

}

}

注解的分类

根据注解的作用域@Retention,注解分为

RetentionPolicy.SOURCE: Java源文件上的注解

RetentionPolicy.CLASS: Class类文件上的注解

RetentionPolicy.RUNTIME: 运行时的注解

按照注解的来源,也是分为3类

1. 内置注解 如@Override ,@Deprecated 等等

2. 第三方注解,如Hibernate, Struts等等

3. 自定义注解,如仿hibernate的自定义注解

在工作中,大部分都是使用第三方注解, 当然第三方注解本身就是自定义注解。 本教程的主要作用是帮助大家理解这些第三方注解是如何工作的,让大家用得心里踏实一些。

另一个例子:https://www.jianshu.com/p/f85e5212be55

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值