利用注解封装添加、删除数据

注解


@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,'格力')

猜你喜欢

转载自blog.csdn.net/Mr_Dracy/article/details/109196169