概述
註解與註釋,
註解,告訴編譯器如何運行程序!
註釋,給程序員閱讀,對編譯、運行沒有影響;
註解作用,
1.告訴編譯器如何運行程序;
2.簡化(取代)配置文件
常用的註解如下:
//重寫父類的方法 @Override public String toString() { returnsuper.toString(); }
//抑制編譯器警告 @SuppressWarnings({"unused","unchecked"}) privatevoid save() { List list =null; }
//標記方法以及過時 @Deprecated privatevoid } |
元註解:表示註解的註解
指定註解的可用範圍:
@Target({
TYPE, 類
FIELD, 字段
METHOD, 方法
PARAMETER, 參數
CONSTRUCTOR,構造器
LOCAL_VARIABLE 局部變量
})
元註解 - 2.指定註解的聲明週期
@Retention(RetentionPolicy.SOURCE) 註解只在源碼級別有效
@Retention(RetentionPolicy.CLASS) 註解在字節碼即別有效 默認值
@Retention(RetentionPolicy.RUNTIME) 註解在運行時期有效
註解案例之優化BaseDao的代碼
一、創建Bean實體類
package cn.sp.utils;
@Table(tableName="admin")
public class Admin2 {
@ID
@Column(columnName="id")
private int id2;
@Column(columnName="userName")
private String userName2;
@Column(columnName="pwd")
private String pwd2;
public int getId2() {
return id2;
}
public void setId2(int id2) {
this.id2 = id2;
}
public String getUserName2() {
return userName2;
}
public void setUserName2(String userName2) {
this.userName2 = userName2;
}
public String getPwd2() {
return pwd2;
}
public void setPwd2(String pwd2) {
this.pwd2 = pwd2;
}
@Override
public String toString() {
return "Admin2 [id2=" + id2 + ", userName2=" + userName2 + ", pwd2=" + pwd2 + "]";
}
}
二、創建註解類
package cn.sp.utils;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.dbutils.ResultSetHandler;
import cn.sp.dao.JdbcUtil;
public class BaseDao_2 <T>{
private Class<T> clazz;
private String tableName;
private String id_primary;
public BaseDao_2() {
Type type=this.getClass().getGenericSuperclass();
ParameterizedType pt=(ParameterizedType) type;
Type[] types = pt.getActualTypeArguments();
clazz=(Class<T>) types[0];
/*******獲取表名******/
Table table = clazz.getAnnotation(Table.class);
tableName = table.tableName();
//已經拿到Admin2.class
//獲取當前運行類的所有字段,遍歷。獲取每一個字段上的id註解
Field[] fs = clazz.getDeclaredFields();
for (Field field : fs) {
//設置強制訪問
field.setAccessible(true);
//獲取每一個字段上的ID註解
ID anno_id = field.getAnnotation(ID.class);
//判斷
if(anno_id!=null){
//如果當前字段有ID註解,說明是主鍵,再獲取字段名稱
Column column = field.getAnnotation(Column.class);
//主鍵
id_primary=column.columnName();
break;
}
}
System.out.println("表:"+tableName);
System.out.println("主鍵:"+id_primary);
}
public T findById(int id){
try {
String sql="select * from "+tableName+" where id=?";
return JdbcUtil.getQueryRunner().query(sql, new MyBeanHandler<T>(clazz),id);
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public List<T> getAll(){
try {
String sql="select * from "+tableName;
return JdbcUtil.getQueryRunner().query(sql, new MyBeanListHandler<T>(clazz));
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
/**
* 自定義結果集封裝單個Bean對象
*/
class MyBeanHandler<T> implements ResultSetHandler<T>{
private Class<T> clazz;
public MyBeanHandler(Class<T> clazz) {
this.clazz=clazz;
}
@Override
public T handle(ResultSet rs) throws SQLException {
try {
T t=clazz.newInstance();
if(rs.next()){
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs) {
String fieldName=f.getName();
Column column = f.getAnnotation(Column.class);
String columnName=column.columnName();
Object columnValue=rs.getObject(columnName);
//設置 BeanUtils組件
BeanUtils.copyProperty(t, fieldName, columnValue);
}
}
return t;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**自定義結果集封裝多個Bean對象
*/
class MyBeanListHandler<T> implements ResultSetHandler<List<T>>{
private Class<T> clazz;
public MyBeanListHandler(Class<T> clazz) {
this.clazz=clazz;
}
public List<T> handle(ResultSet rs) throws SQLException {
ArrayList<T> list = new ArrayList<T>();
try {
while(rs.next()){
T t=clazz.newInstance();
Field[] fs = clazz.getDeclaredFields();
for (Field f : fs) {
String fieldName=f.getName();
Column column = f.getAnnotation(Column.class);
String columnName=column.columnName();
Object columnValue=rs.getObject(columnName);
//設置 BeanUtils組件
BeanUtils.copyProperty(t, fieldName, columnValue);
}
list.add(t);
}
return list;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
創建類AdminDao2(用於測試執行)
package cn.sp.utils;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
public class AdminDao2 extends BaseDao_2<Admin2> {
@Test
public void testName() throws Exception {
AdminDao2 dao2 = new AdminDao2();
Admin2 ad2 = dao2.findById(1);
List<Admin2> list = dao2.getAll();
System.out.println(ad2);
System.out.println(list);
}
}
相關注解代碼:
package cn.sp.utils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* 用於描述主鍵
* @author Administrator
*
*/
@Retention(RetentionPolicy.RUNTIME) // 指定註解在運行時期有效
public @interface ID {
}
package cn.sp.utils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) // 指定註解在運行時期有效
public @interface Table {
String tableName();
}
package cn.sp.utils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME) // 指定註解在運行時期有效
public @interface Column {
String columnName();
}
注意:一定要在註解上加元註解@Retention(RetentionPolicy.RUNTIME),否則運行時註解失效,會報空指針異常!