文档章节

java注解和反射制作dao基类的练习

th小米粥
 th小米粥
发布于 2012/06/04 13:50
字数 815
阅读 3509
收藏 14

最近做项目中有接触到反射的使用简单的做了一个注释

首先的想法是根据类中不为空的值生成sql

 

首先是三个注解

主键注解

package comments;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 主键
 * @author  Administrator
 */
@Target(ElementType.FIELD)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
@Inherited 
public @interface  Key {
}

package comments;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 如果不和数据关联则设置此注解
 * @author  Administrator
 *
 */
@Target(ElementType.FIELD)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
@Inherited 
public @interface  notRecord {
}

package comments;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 设置表名
 * @author  Administrator
 *
 */
@Target(ElementType.TYPE)   
@Retention(RetentionPolicy.RUNTIME)   
@Documented  
@Inherited 
public @interface  Table {
	public String name();
}

然后是自定义异常类

package org;

/**
 * 设置自定义异常
 * @author  Administrator
 *
 */
public class NumException extends Exception {
	private String name;
	public NumException(String name){
		this.name=name;
	}
	public String toString(){
		  return name;
	}
}

实体类

package org;

import comments.Key;
import comments.Table;
import comments.notRecord;

@Table(name = "student")
public class Student {
	@Key 
	private String id;
	private String name;
	@notRecord
	private String sex;
	private int age;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

处理实体类生成sql的类。

package org;

import java.lang.reflect.Field;

import comments.Key;
import comments.Table;
import comments.notRecord;

public class Processing {
	
	/**
	 * 通过实体类生成 insert into sql语句
	 * @param cl
	 * @return 
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws NumException
	 */
	public String save(Object cl) throws IllegalArgumentException, IllegalAccessException, NumException{
		String sql="insert into ";
		if(cl!=null){
			Field[] fiels=cl.getClass().getDeclaredFields();//获得反射对象集合
			boolean t=cl.getClass().isAnnotationPresent(Table.class);//获得类是否有注解
			if(t){
				Table tab=cl.getClass().getAnnotation(Table.class);
				sql+=tab.name();//获得表名
				String name ="";//记录字段名
				String value ="";//记录值名称
				boolean bl=false;//记录主键是否为空
				for(Field fl:fiels){//循环组装
					fl.setAccessible(true);//开启支私有变量的访问权限
					Object tobj=fl.get(cl);
					if(tobj!=null){
						if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
							bl=true;
						}
						if(!fl.isAnnotationPresent(notRecord.class)){
							name+=fl.getName()+",";
							value+="'"+tobj.toString()+"',";
						}
					}
				}
				if(bl){
					if(name.length()>0)
						name=name.substring(0,name.length()-1);
					if(value.length()>0)
						value=value.substring(0,value.length()-1);
					sql+="("+name+") values("+value+")";
				}else
					throw new NumException("未找到类主键 主键不能为空");
			}else
				throw new NumException("传入对象不是实体类");
		}else
			 throw new NumException("传入对象不能为空");//抛出异常
		return sql;
	}
	/**
	 * 传入对象更新
	 * @param obj
	 * @return 
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 * @throws NumException
	 */
	public String update(Object obj) throws IllegalArgumentException, IllegalAccessException, NumException{
		String sql="update ";
		if(obj!=null){
			Field[] fiels=obj.getClass().getDeclaredFields();//获得反射对象集合
			boolean t=obj.getClass().isAnnotationPresent(Table.class);//获得类是否有注解
			if(t){
				Table tab=obj.getClass().getAnnotation(Table.class);
				sql+=tab.name()+" set ";//获得表名
				String wh ="";//记录字段名
				String k="";
				boolean bl=false;//记录主键是否为空
				for(Field fl:fiels){//循环组装
					fl.setAccessible(true);//开启支私有变量的访问权限
					Object tobj=fl.get(obj);
					if(tobj!=null){
						if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
							bl=true;
							k=fl.getName()+"='"+tobj.toString()+"' where  ";
						}else{
							if(!fl.isAnnotationPresent(notRecord.class)){
								wh+=fl.getName()+"='"+tobj.toString()+"',";
							}
						}
					}
				}
				if(bl){
					if(wh.length()>0)
						wh=wh.substring(0,wh.length()-1);
					if(k.length()>0)
						k=k.substring(0,k.length()-1);
					sql+=k+wh;
				}else
					throw new NumException("未找到类主键 主键不能为空");
			}else
				throw new NumException("传入对象不是实体类");
		}else
			 throw new NumException("传入对象不能为空");//抛出异常
		return sql;
	}
}

 

最后是测试类

package org;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import comments.Table;
import comments.Key;

public class temp {
	public static void main(String[] aa) throws IllegalArgumentException, IllegalAccessException, NumException{
		Student stu=new Student();
		stu.setId("ccc");
		stu.setName("姓名");
		stu.setAge(18);
		stu.setSex("男");
		//stu=null;
		System.out.println(new Processing().save(stu));
		System.out.println(new Processing().update(stu));
	}
}

这里如果要套用着DAO用就好了。我只是简单的实现一下。欢迎拍砖。

 

 

 

 

 

 

© 著作权归作者所有

th小米粥

th小米粥

粉丝 20
博文 19
码字总数 2443
作品 0
珠海
程序员
私信 提问
加载中

评论(10)

virusfu
virusfu
79
萝卜酱
萝卜酱
撸过学习一下。简洁明了,让我10分钟就明白了自定义注解是怎么玩的。
Runing9520
Runing9520

引用来自“skyecho”的评论

if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
bl=true;
}
这个 key.class 哪里来的 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

引用来自“th小米粥”的评论

有一个类叫做 key 你看一下?

引用来自“skyecho”的评论

在哪里啊,你有吗,能给我发一份吗 急用 。。

引用来自“th小米粥”的评论

DEMO早删除了。你自己复制下来应该可以用的。
用不了,导入的包名不是comments.Key,,,这个key 是你自己写的吗,还是。。。如何才能得到它 。
Runing9520
Runing9520
我的 qq 657812102
th小米粥
th小米粥 博主

引用来自“skyecho”的评论

if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
bl=true;
}
这个 key.class 哪里来的 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

引用来自“th小米粥”的评论

有一个类叫做 key 你看一下?

引用来自“skyecho”的评论

在哪里啊,你有吗,能给我发一份吗 急用 。。
DEMO早删除了。你自己复制下来应该可以用的。
Runing9520
Runing9520

引用来自“skyecho”的评论

if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
bl=true;
}
这个 key.class 哪里来的 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

引用来自“th小米粥”的评论

有一个类叫做 key 你看一下?
在哪里啊,你有吗,能给我发一份吗 急用 。。
th小米粥
th小米粥 博主

引用来自“skyecho”的评论

if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
bl=true;
}
这个 key.class 哪里来的 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
有一个类叫做 key 你看一下?
Runing9520
Runing9520
if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
bl=true;
}
这个 key.class 哪里来的 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
Timco
Timco
实践了一下,挺有意思的
田叶清
田叶清
^_^ O(∩_∩)O哈哈哈~来学习,正好我在这儿碰到问题
OSC开源的POJO类的问题 和 项目中使用annotation java基础

这几天都在看OSC开源的几个类,见识很多用法,比如反射,注解,泛型...... 1. 在 POJO中 http://www.oschina.net/code/snippet_12_2746 有id 的 get 和 set 方法 public long getId() {retur...

小猫王
2013/04/29
196
2
【翻译】C#编程语言和JAVA编程语言的比较(上)

【翻译】C#编程语言和JAVA编程语言的比较(上) 原文地址:http://www.25hoursaday.com/CsharpVsJava.html 简介 C#语言是一门面向对象的语言,开发者可以使用C#和微软.NET平台快速构建各种应...

fbf
2013/08/13
0
0
注解+反射+JDBC,实现一个简易的泛型DAO接口

一、实现思路 1、定义3个Annotation(注解):Entity、Id、Column,Entity作用于Type级别,用于标识JavaBean与数据库表名的映射关系。Id作用于Field级别,用于标识JavaBean中ID属性与表中ID字...

yangxin0917
2014/12/18
0
1
java反射+注解实现Entity类与Dto类相互转换

序言   近期在工作中管理代码时发现,在项目中从Dao层到Service层数据传递中通过大量的get(),set()方法去一个一个的去拿值去赋值,导致代码篇幅过长,对此甚是讨厌,并且严重消耗开发时间。...

架构师springboot
2018/12/26
0
0
学Android开发,入门语言java知识点

Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学java语言吧。 Android开发入门教程 -Java语言,最差...

抉择很难
2015/12/11
185
0

没有更多内容

加载失败,请刷新页面

加载更多

北斗三号IGSO-2卫星发射成功!

6月25日,中国航天科技集团官方公众号宣布,北斗三号IGSO-2卫星发射成功! 航天科技集团表示,6月25日2点09分,我国在西昌卫星发射中心用长征三号乙运载火箭成功将北斗三号第2颗倾斜地球同步...

linuxCool
4分钟前
0
0
阿里java开发规约的Idea插件安装(英文)

Idea Plugin Prepare Project JDK: 1.7+ Gradle: 3.0+(Require JDK1.8+ for gradle) Build cd p3c-ideagradle clean buildPlugin Run plugin cd p3c-ideagradle runIde# run speci......

Airship
14分钟前
0
0
很多人转行做程序员选择web前端学习,前端简单在哪里?

不管你是工人阶层还是服务行业,是否想过转行IT,转行IT后肯定会选择一门编程语言进行深入学习,很多转行的人基础都不是太好,不是科班出身,甚至有的是专科乃至中专,前端的HTML和CSS相对其...

智云编程
27分钟前
0
0
一文读懂内网、公网和NAT

我们做弱电监控系统的时候,都避免不了要跟IP地址打交道,比如摄像头、NVR、服务器等这些设备安装好之后,就需要给它们配上IP,那这个IP地址你了解嘛?今天我们就一起来聊聊什么是内网、公网和...

老孟的Linux私房菜
31分钟前
3
0
聊聊dubbo的ExecuteLimitFilter

序 本文主要研究一下dubbo的ExecuteLimitFilter ExecuteLimitFilter dubbo-2.7.2/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/ExecuteLimitFilter.java public clas......

go4it
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部