将操作数据库的相关方法封装成一个数据库工具类,实现基本的CRUD,本文主要利用反射,注解,泛型等实现添加数据功能 首先定义DBUtil工具类
public class DBUtil { private static PreparedStatement ps = null; private static ResultSet rs=null; }用于标记实体类中字段的注解
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Column { String values(); }数据库表对应的对象实体类,为成员变量加上注解,值与数据库对应字段完全相同
public class Emp implements Serializable{ private static final long serialVersionUID = 456852456852L; @Column(values = "empno") private Integer empno; @Column(values = "ename") private String ename; @Column(values = "job") private String job; @Column(values = "sal") private Double sal; @Column(values = "hiredate") private Date hiredate; @Column(values = "mgr") private Integer mgr; @Column(values = "comm") private Double comm; @Column(values = "deptno") private Integer deptno; public Emp() { super(); } public Emp(Integer empno,String ename, String job, Double sal, Date hiredate, Integer mgr, Double comm, Integer deptno) { super(); this.empno=empno; this.ename = ename; this.job = job; this.sal = sal; this.hiredate = hiredate; this.mgr = mgr; this.comm = comm; this.deptno = deptno; } public Integer getEmpno() { return empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public Double getSal() { return sal; } public void setSal(Double sal) { this.sal = sal; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public Integer getMgr() { return mgr; } public void setMgr(Integer mgr) { this.mgr = mgr; } public Double getComm() { return comm; } public void setComm(Double comm) { this.comm = comm; } public Integer getDeptno() { return deptno; } public void setDeptno(Integer deptno) { this.deptno = deptno; } @Override public String toString() { return "Emp [empno=" + empno +",ename=" + ename + ", job=" + job + ", sal=" + sal + ", hiredate=" + hiredate + ", mgr=" + mgr + ", comm=" + comm + ", deptno=" + deptno + "]"; } }在DBUtil类中实现添加数据的方法
/** * * @param INSERT INTO emp(ename,job,sal,hiredate,mgr,comm,deptno) VALUES (?,?,?,?,?,?,?) * @param emp * @param 是否需要获取自增的主键值 * @return 自增的主键值\0 * @throws Exception */ public static<T> int add(Connection con,String sql,T t,boolean isGetKey) throws Exception{ ps = con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); Class<?> cls = t.getClass(); String[] columnNames = sql.split("\\(")[1].split("\\)")[0].trim().split(","); for (int i=0;i<columnNames.length;i++) { Field[] fields = cls.getDeclaredFields(); for (Field field : fields) { Column column = field.getAnnotation(Column.class); if(column!=null && columnNames[i].equals(column.values())){ String fieldName = field.getName(); Method m; m = cls.getDeclaredMethod("get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1)); Object o = m.invoke(t); ps.setObject(i+1,o); } } } ps.executeUpdate(); if(isGetKey){ rs = ps.getGeneratedKeys(); rs.next(); return rs.getInt(1); } return 0; }