注解
@Target(value = { ElementType.FIELD }) @Retention(value = RetentionPolicy.RUNTIME) public @interface Column { public String name(); } /** * 标识主键列对应的属性 */ @Target(value = { ElementType.FIELD }) @Retention(value = RetentionPolicy.RUNTIME) public @interface Id { } /** * 标识当前实体类映射的表名 */ @Target(value = { ElementType.TYPE }) @Retention(value = RetentionPolicy.RUNTIME) public @interface Table { String name(); }实体类
package com.project.bean; import java.io.Serializable; @Table(name="t_product") public class ProductBean implements Serializable{ @Column(name = "pk_id") @Id private int id; @Column(name = "p_name") private String name; @Column(name = "p_price") private int price; @Column(name = "p_factory") private String factory; public ProductBean() { super(); } public ProductBean(String name, int price, String factory) { super(); this.name = name; this.price = price; this.factory = factory; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getFactory() { return factory; } public void setFactory(String factory) { this.factory = factory; } }封装添加删除操作
public void insert(Object obj) { try { //封装值列表的集合 List valueList = new ArrayList<>(); //得到保存对象的类模板 Class beanClass = obj.getClass(); //得到该类中Table注解对象 Table table = (Table)beanClass.getDeclaredAnnotation(Table.class); String sql = "insert into "+table.name()+"("; String sqlQuery = ""; //得到属性列表 Field[] farray = beanClass.getDeclaredFields(); for(Field f : farray) { if(f.isAnnotationPresent(Column.class) && f.isAnnotationPresent(Id.class) == false) { //得到Column注解中封装的列名 String columnName = f.getAnnotation(Column.class).name(); sql += columnName + ","; f.setAccessible(true); //得到对象指定属性的值 Object fieldValue = f.get(obj); valueList.add(fieldValue); } } sql = sql.substring(0,sql.length()-1); sql += ") values("; for(int i = 0 ; i < valueList.size() ; i++) { sql += "?,"; } sql = sql.substring(0,sql.length()-1); sql += ")"; System.out.println(sql); this.updateData(sql,valueList.toArray()); } catch (Exception e) { e.printStackTrace(); } } public void deleteById(Class beanClass,Object key) { //得到表名 Table table = (Table) beanClass.getAnnotation(Table.class); String tableName = table.name(); //得到主键列的列名 Field[] farray = beanClass.getDeclaredFields(); String columnName = null; for(Field f : farray) { //判断该属性是否有Id注解,如果有表示该属性为主键属性 if(f.isAnnotationPresent(Id.class)) { //得到Column注解的name元素,从而得到列名 columnName = f.getAnnotation(Column.class).name(); break; } } String sql = "delete from " + tableName + " where " + columnName +"=?"; this.updateData(sql, key); } private void updateData(String sql,Object... valueArray) { this.setConnection(); try { ps = con.prepareStatement(sql); for(int i = 0 ; i < valueArray.length ;i++) { ps.setObject(i+1, valueArray[i]); } ps.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); }finally { this.closeConnection(); } }实现类调方法
@Override public class ProductDaoImpl extends BaseDao implements IProductDao{ public void add(Object obj) { this.insert(obj); } @Override public void del(int id) { this.deleteById(ProductBean.class, id); } }main测试
public static void main(String[] args) { IProductDao dao = new ProductDaoImpl(); dao.add(new ProductBean("剃须刀", 100, "飞利浦")); dao.del(1); }数据库表结构
CREATE TABLE t_product( pk_id INT PRIMARY KEY AUTO_INCREMENT, p_name VARCHAR(20), p_price INT , p_factory VARCHAR(20) );插入数据
INSERT INTO t_product(p_name,p_price,p_factory)VALUES ('电视机',1822,'长虹'), ('洗衣机',3500,'海尔'), ('笔记本',6987,'戴尔'), ('手机',3600,'OPPO'), ('手表',15200,'卡西欧'), ('空调',6000,'格力')