package com.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
/**
*
* @author cong
* 数据库连接注解
*
*/
@Target(value = {FIELD})//Target:此注解用到的地方有TYPE、FIELD、METHOD
@Retention(value = RUNTIME)//注解的运行环境
public @interface CustomConnection {
String url() default "";
String driverClass() default "";
String username() default "";
String password() default "";
}
注解处理
package com.annotation.processor; import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager; import com.annotation.CustomConnection; @SuppressWarnings("unchecked")//不显示警告提示
public class CustomAnnotationProcessor {
public static <T> void processor(Class<T> clazz) {
try {
//T t = clazz.newInstance();
T t = null;
Field[] fields = clazz.getDeclaredFields();//获取T对象声明变量 Constructor<?>[] constructors = clazz.getDeclaredConstructors();//获取T对象的构造函数,因为构造函数的访问级别问题
for(Constructor<?> constructor : constructors) {
constructor.setAccessible(true);//无论T对象的构造函数是什么访问级别都可以访问其方法
t = (T)constructor.newInstance(new Object[]{});
} for(Field field : fields) {
if(field.isAnnotationPresent(CustomConnection.class)) {
CustomConnection customConnection = field.getAnnotation(CustomConnection.class);
String url = customConnection.url();
String driverClass = customConnection.driverClass();
String username = customConnection.username();
String password = customConnection.password();
Class.forName(driverClass);
Connection connection = DriverManager.getConnection(url, username, password);
field.setAccessible(true);
field.set(t, connection);
continue;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.util;

import java.sql.Connection;

import com.annotation.CustomConnection;
/**
*
* @author Administrator
* 调用注解连接数据库
*
*/
public class DBUtil { private DBUtil() {//构造方法 } @CustomConnection(url = "jdbc:oracle:thin:@//192.168.40.29:1521/PDBMYORACLE",
driverClass = "oracle.jdbc.driver.OracleDriver",
username = "victop",
password = "victop")
private static Connection connection; public static Connection getConnection() {
return connection;
}
}

测试

package com.victop;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import com.annotation.processor.CustomAnnotationProcessor;
import com.util.DBUtil; public class Test { public static void main(String[] args) {
try {
CustomAnnotationProcessor.processor(DBUtil.class);
Connection connection = DBUtil.getConnection();
PreparedStatement preparedStatement = connection.prepareStatement("select * from Users");
ResultSet resultSet = preparedStatement.executeQuery();
while(resultSet.next()) {
System.out.println(resultSet.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
} }

Java 注解实例的更多相关文章

  1. java注解实例-反射生成sql

    定义描述用户表的注解: package dao; import java.lang.annotation.ElementType; import java.lang.annotation.Retent ...

  2. java自定义注解知识实例及SSH框架下,拦截器中无法获得java注解属性值的问题

    一.java自定义注解相关知识 注解这东西是java语言本身就带有的功能特点,于struts,hibernate,spring这三个框架无关.使用得当特别方便.基于注解的xml文件配置方式也受到人们的 ...

  3. Java注解入门

    注解的分类   按运行机制分:   源码注解:只在源码中存在,编译后不存在 编译时注解:源码和编译后的class文件都存在(如@Override,@Deprecated,@SuppressWarnin ...

  4. Java注解的使用

    概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法. Java中的常见注解 JDK自带注解: @Override//覆盖父类的方法 @Deprecated//表示方法过时了 @ ...

  5. JAVA 注解的几大作用及使用方法详解

    JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...

  6. JAVA 注解的几大作用及使用方法详解【转】

    java 注解,从名字上看是注释,解释.但功能却不仅仅是注释那么简单.注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后 某个时刻方便地使用这些数据(通过 解 ...

  7. Java注解配置

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annota ...

  8. Java注解(Annotation)自定义注解入门

    要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为我们提供的元注解和相关定义注解的语法. 元注解: 元注解的作用就是负责注解其他注解.Java5. ...

  9. Java注解实践

    Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ...

随机推荐

  1. Linux系统下ping命令报错 name or service not know

    问题描述 CentOS,但是当执行ping命令的时候,提示name or service not known 解决方法 1.添加DNS服务器 vi /etc/resolv.conf 进入编辑模式,增加 ...

  2. SQL Server Extended Events 进阶 2:使用UI创建基本的事件会话

    第一阶中我们描述了如何在Profiler中自定义一个Trace,并且让它运行在服务器端来创建一个Trace文件.然后我们通过Jonathan Kehayias的 sp_SQLskills_Conver ...

  3. Python - 更改pip源至国内镜像

    永久使用 [windows] 在用户名目录下创建一个目录 C:\Users\xxx\pip [linux] ~/.pip/pip.conf 新建pip.ini [global] index-url = ...

  4. jvm linux 时区设置

    # 背景 在接入集团一个平台的时候,发现录制某个接口到测试环境回放,发现接口入参一致,一个start_day 一个end_day,但回放的时候会多调用一次数据库查询,很是奇怪: 查阅业务代码,发现确实 ...

  5. C#开发微信小程序

    个人见解,欢迎交流,不喜勿喷.   微信小程序相比于微信公众号的开发,区别在于微信小程序只请求第三方的数据,整个界面的交互(view)还是在微信小程序上实现,前后端完全分离,说白了,微信小程序开发与具 ...

  6. NLayerAppV3--基础结构层(Cross-Cutting部分)

    回顾:NLayerAppV3是一个使用.net 2.1实现的经典DDD的分层架构的项目. NLayerAppV3是在NLayerAppV2的基础上,使用.net core2.1进行重新构建的:它包含了 ...

  7. 2D Circular Geometry Kernel ( Geometry Kernels) CGAL 4.13 -User Manual

    1 Introduction The goal of the circular kernel is to offer to the user a large set of functionalitie ...

  8. Docker容器的原理与实践 (下)

    欢迎访问网易云社区,了解更多网易技术产品运营经验. Docker原理分析 Docker架构 镜像原理 镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容Docker以镜像和在镜 ...

  9. docker rpm 下载地址

    http://yum.dockerproject.org/repo/main/centos/7/Packages/

  10. Weekly Contest 128

    1012. Complement of Base 10 Integer Every non-negative integer N has a binary representation.  For e ...