Java注解(三)
上一篇了解了自定义注解的使用,不过里面的例子没有多大使用价值,这一回来个有用点的Demo。
目标:将实体bean保存到数据库
先来定义一个实体注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Entity {
String getTableName();
}
这个注解可用在类上,它有一个变量参数getTableName。
其实意义很明显,就是一个实体类对应一张数据库的表,通过Entity注解将类和数据库表名关联起来
那么,通过什么将类的参数和数据库表中的列关联起来呢?再来定义一个注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String getName();
}
有了Column注解,类里面的属性就和表中的列关联起来了。
下面来看看POJO中怎么用这两个注解:
@Entity(getTableName = "user")
public class User {
@Column(getName = "user_id")
private String id;
@Column(getName = "user_name")
private String name;
@Column(getName = "user_age")
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 int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}
通过Entity和Column注解,就将一个实体bean和一张数据库表连接起来了。很多ORM映射就是采取这种方式实现的。
最后,来感受一下注解给我们带来的便利,来个方法见证下~~
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement; public class Session {
public static void main(String[] args) {
Session session = new Session();
System.out.println(session.getInsertSql(new User()));
} //在实际项目中,你可以save(obj)方法来保存一个bean
public void save(Object obj) {
// get a connection
//PreparedStatement pstmt = getStatement(con, obj);
//pstmt.execute();
} //得到PreparedStatement
public PreparedStatement getStatement(Connection con, Object obj)
throws Exception {
PreparedStatement pstmt = con.prepareStatement(getInsertSql(obj));
Class<?> c = obj.getClass();
Field[] fs = c.getDeclaredFields();
for (int i = 0; i < fs.length; i++) {
fs[i].setAccessible(true);
pstmt.setObject(i + 1, fs[i].get(obj));
}
return pstmt;
} //insert into tableName(ziduan1,ziduan2...) values(?,?...)
public String getInsertSql(Object obj) {
StringBuilder s = new StringBuilder();
s.append("insert into "); Class<?> c = obj.getClass();
String tableName = c.getSimpleName();//类名,不包含包名 User
Entity entity = (Entity) c.getAnnotation(Entity.class);
if (entity != null) {
tableName = entity.getTableName();
}
s.append(tableName).append("(");
Field[] fs = c.getDeclaredFields(); for (int i = 0; i < fs.length; i++) {
String fieldName = fs[i].getName();
Column column = fs[i].getAnnotation(Column.class);
if (column != null) {
fieldName = column.getName();
}
s = i == 0 ? s.append(fieldName) : s.append(",").append(fieldName);
}
s.append(") values").append(getString(fs.length));
return s.toString(); } //得到(?,?,?,...?,?)
private String getString(int length) {
StringBuilder s = new StringBuilder();
s.append("(");
for (int i = 0; i < length; i++) {
s = i == 0 ? s.append("?") : s.append(",?");
}
s.append(")");
return s.toString();
}
}
OK,That's all!
Java注解(三)的更多相关文章
- 19.Java 注解
		19.Java注解 1.Java内置注解----注解代码 @Deprecated //不推荐使用的过时方法 @Deprecated ... 
- 框架基础——全面解析Java注解
		为什么学习注解? 学习注解有什么好处? 学完能做什么? 答:1. 能够读懂别人写的代码,特别是框架相关的代码: 2. 让编程更加简洁,代码更加清晰: 3. 让别人高看一眼. spring.mybati ... 
- Java注解教程及自定义注解
		Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ... 
- Java注解实践
		Java注解实践 标签 : Java基础 注解对代码的语意没有直接影响, 他们只负责提供信息给相关的程序使用. 注解永远不会改变被注解代码的含义, 但可以通过工具对被注解的代码进行特殊处理. JDK ... 
- java 注解Annotation
		什么是注解? 注解,顾名思义,注解,就是对某一事物进行添加注释说明,会存放一些信息,这些信息可能对以后某个时段来说是很有用处的. java注解又叫java标注,java提供了一套机制,使得我们可以对 ... 
- Java注解知识点摘抄
		Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许 ... 
- Java - 注解 (Annotation)
		Java - 注解 (Annotation) 一.基本的 Annotation > 使用 Annotation 时要在其前面增加 @符号,并把该 Annotation 当成一个修饰符 ... 
- java注解(基础)
		一.认识注解 1.注解的定义: java提供了一种原程序中的元素关联任何信息和元数据的途径和方法. 2.学习注解的目的: (1)能够读懂别人写的代码,特别是框架相关的代码(框架中使用注解是非常方便的) ... 
- Java 注解 入门
		这几天在学习Spring3.x,发觉现在许多框架都用上了java注解功能,然后自己就对java注解这方面初步学习了一下. 首先,注解跟注释不是一个意思,也根本不是同一个事物. 注释就是我们平常平常中对 ... 
- 使用Java注解来简化你的代码
		注解(Annotation)就是一种标签,可以插入到源代码中,我们的编译器可以对他们进行逻辑判断,或者我们可以自己写一个工具方法来读取我们源代码中的注解信息,从而实现某种操作.需要申明一点, ... 
随机推荐
- docker registry 私有仓库 安装配置、查询、删除
			#++++++++++++++++++++++++++++++ #docker-registry 私有仓库 #搜索,下载register镜像 docker search registry docker ... 
- list页面-按照choice筛选丶传condition过滤筛选项丶筛选与显示同步
			1.list页面:筛选功能优化,显示choices,传condition过滤筛选项 list_filter = [ # sites.FilterOption("name", ... 
- jzoj5906
			我們首先發現,每一條邊都至少走1次,因為我們必須走到每一個節點按按鈕 如果我們不走一個節點,說明這個節點已經有傳送門了,但是必須走到這個節點開傳送門,矛盾 然後我們發現,每一條邊至多經過2次 如果我們 ... 
- 简单的卷积神经网络(CNN)的搭建
			卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现.与普通神经网络非常相 ... 
- java实现简单扫雷游戏
			/** * 一个简单的扫雷游戏 MainFram.java */ package www.waston; import java.awt.BorderLayout; import java.awt.C ... 
- 八,mysql优化——读写分离
			读写分离目的是给大型网站缓解查询压力. 
- mapreduce程序的按照key值从大到小降序排列
			在近期的Hadoop的学习中,在学习mapreduce时遇到问题:让求所给数据的top10,们我们指导mapreduce中是有默认的排列机制的,是按照key的升序从大到小排列的 然而top10问题的求 ... 
- 【BZOJ2732】【HNOI2012】射箭 二分+半平面交
			此题重点在卡精度!!! 本地已经下载数据测试并通过了,然而$B$站上还是$WA$的,可能是$CPU$对于$long\ double$ 的资瓷不一样. 此题答案显然是可以二分出来的,设当前要监测是否能射 ... 
- 【bzoj3489】 A simple rmq problem k-d树
			由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ... 
- OS之进程管理---孤儿进程和僵尸进程
			僵尸进程 当一个进程终止时,操作系统会释放其资源,不过它位于进程表中的条目还是在的,直到它的父进程调用wait():这是因为进程表中包含了进程的退出状态.当进程已经终止,但是其父进尚未调用wait() ... 
