java 利用注解实现BaseDao 增删查改
第一步,编写两个注解类,用于表明实体类对应的表名及字段。
TableInfo.java 此注解用于标注表名及主键名
import static java.lang.annotation.ElementType.TYPE; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /* * TableName对应表名称 * PrimaryKey对应主键字段名 */ @Target({TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface TableInfo { public String TableName(); public String PrimaryKey(); }
ColumnInfo.java 此注解用于标注实体类字段对应表字段
import static java.lang.annotation.ElementType.FIELD; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /* * 用于标识表字段名 */ @Target({FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface ColumnInfo { String columnName(); }
第二步:编写一个实体类,并注明好注解
1 import static java.lang.annotation.ElementType.CONSTRUCTOR; 2 import static java.lang.annotation.ElementType.FIELD; 3 import static java.lang.annotation.ElementType.LOCAL_VARIABLE; 4 import static java.lang.annotation.ElementType.METHOD; 5 import static java.lang.annotation.ElementType.PARAMETER; 6 import static java.lang.annotation.ElementType.TYPE; 7 8 import java.lang.annotation.Retention; 9 import java.lang.annotation.RetentionPolicy; 10 import java.lang.annotation.Target; 11 import java.util.Date; 12 13 import annotation.ColumnInfo; 14 import annotation.TableInfo; 15 16 17 /* 18 * 19 */ 20 @TableInfo(TableName = "student", PrimaryKey = "id") 21 public class Student { 22 @ColumnInfo(columnName="id") 23 private int sid; 24 @ColumnInfo(columnName="sname") 25 private String sname; 26 @ColumnInfo(columnName="sclass") 27 private int sclass; 28 @ColumnInfo(columnName="startdate") 29 private Date startdate; 30 @ColumnInfo(columnName="stopdate") 31 private Date stopdate; 32 33 public Date getStopdate() { 34 return stopdate; 35 } 36 public void setStopdate(Date stopdate) { 37 this.stopdate = stopdate; 38 } 39 public Date getStartdate() { 40 return startdate; 41 } 42 public void setStartdate(Date startdate) { 43 this.startdate = startdate; 44 } 45 46 public int getSid() { 47 return sid; 48 } 49 public void setSid(int sid) { 50 this.sid = sid; 51 } 52 public String getSname() { 53 return sname; 54 } 55 public void setSname(String sname) { 56 this.sname = sname; 57 } 58 public int getSclass() { 59 return sclass; 60 } 61 public void setSclass(int sclass) { 62 this.sclass = sclass; 63 } 64 @Override 65 public String toString() { 66 return "Student [id=" + sid + ", sname=" + sname + ", sclass=" + sclass 67 + ", startdate=" + startdate + ", stopdate=" + stopdate + "]\n"; 68 } 69 }
第三部:编写BaseDao.java(对数据库的操作基于c3p0组件)
1 import java.lang.reflect.Field; 2 import java.lang.reflect.ParameterizedType; 3 import java.lang.reflect.Type; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import org.apache.commons.dbutils.ResultSetHandler; 10 import org.apache.commons.dbutils.handlers.BeanHandler; 11 12 import annotation.ColumnInfo; 13 import annotation.TableInfo; 14 15 import fnz.utils.JdbcUtil2; 16 17 public class BaseDao{ 18 19 private Class clazz; //类的字节码文件 20 private String tableName;//表明 21 private String primaryKey;//主键 22 private Field[] fields;//所有的字段 23 public BaseDao(){ 24 Type type = this.getClass().getGenericSuperclass();//当前运行类的父类,即为“BaseDao<实体类>”,其实就是“参数化类型”ParameterizedType 25 ParameterizedType pt = (ParameterizedType)type;// 强制转换为“参数化类型” BaseDao<实体类> 26 Type types[] = pt.getActualTypeArguments(); // 获取“参数化类型”中的实体类 27 clazz = (Class)types[0]; 28 //tableName = clazz.getSimpleName();//获取类名(不带包名) 29 TableInfo tab = (TableInfo)clazz.getAnnotation(TableInfo.class); 30 tableName = tab.TableName(); 31 primaryKey = tab.PrimaryKey(); 32 fields = clazz.getDeclaredFields(); 33 } 34 35 36 /** 37 * 主键查询 38 * @param id 主键值 39 * @return 返回封装后的对象 40 * @throws SQLException 41 */ 42 public T getOne(Object id){ 43 try { 44 return JdbcUtil2.getQueryRunner().query("select * from "+tableName+" where "+ primaryKey+" = ?", new MBeanHandler (clazz,mMethod.SELECT),id); 45 } catch (SQLException e) { 46 e.printStackTrace(); 47 throw new RuntimeException(e); 48 } 49 } 50 51 /** 52 * 查询全部 53 * @return 返回所有记录,封装成List 54 * @throws SQLException 55 */ 56 public List getAll(){ 57 try { 58 return JdbcUtil2.getQueryRunner().query("select * from "+tableName, new MBeanListHandler (clazz)); 59 } catch (SQLException e) { 60 e.printStackTrace(); 61 throw new RuntimeException(e); 62 } 63 } 64 /** 65 * 保存 66 * @param t 要保存的实体对象 67 * @return 保存后的对象 68 */ 69 public T baseSave(T t){ 70 try{ 71 List
C3P0配置文件
<c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driverproperty> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test01property> <property name="user">rootproperty> <property name="password">123456property> <property name="initialPoolSize">5property> <property name="maxPoolSize">10property> default-config> <named-config name="C3P0TestName"> <property name="driverClass">com.mysql.jdbc.Driverproperty> <property name="jdbcUrl">jdbc:mysql://localhost:3306/test01property> <property name="user">rootproperty> <property name="password">123456property> <property name="initialPoolSize">5property> <property name="maxPoolSize">10property> named-config> c3p0-config>
JdbcUtil2.java(上面的BaseDao.java用到的工具类)
1 import java.sql.Connection; 2 import org.apache.commons.dbutils.QueryRunner; 3 4 import com.mchange.v2.c3p0.ComboPooledDataSource; 5 6 7 public class JdbcUtil2 { 8 private static ComboPooledDataSource dataSource = null; 9 static{ 10 //初始化操作 11 // 自动加载src目录下c3p0的配置文件【c3p0-config.xml】 12 dataSource = new ComboPooledDataSource();// 使用默认的配置 13 //使用c3p0-config.xml配置文件中named-config的name属性为C3P0TestName的配置 14 //dataSource = new ComboPooledDataSource("C3P0TestName"); 15 } 16 17 //获取QueryRunner对象 18 public static QueryRunner getQueryRunner(){ 19 return new QueryRunner(dataSource); 20 } 21 //获取连接 通过c3p0核心类对象获取(此例子没用到该方法) 22 public static Connection getConnection(){ 23 try { 24 return dataSource.getConnection(); 25 } catch (Exception e) { 26 e.printStackTrace(); 27 throw new RuntimeException(e); 28 } 29 } 30 }
最后:简单编写一下测试类
StudentDao继承BaseDao
1 @Test 2 public void test6(){ 3 StudentDao dao = new StudentDao(); 4 Student s = dao.getOne(1); 5 System.out.println(s); 6 }
输出结果:Student [id=1, sname=张三, sclass=1, startdate=2016-09-22 00:00:00.0, stopdate=2016-09-23]
over