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