java之手搓简单ORM框架--SQL的DELETE

1.手搓简单SQL增删改查框架-删除

1.1创建简单类,并使用泛型类,这里可能使用到之间写的三篇知识的内容,如果不了解的小伙伴可以去

java高级之泛型

java高级之映射

java高级之反射

当然,前提是必须要把数据库相关连接弄好,这里会专门出一篇 java之jdbc

现在咱们继续手搓框架开始叭!

1.2 前期的准备工作

这里已经在【手搓简单SQL增删改查框架-插入】的时候准备完成,如果没有准备的小伙伴可以去瞅瞅

并且这次依然延续用前两篇文章的模板,及dao、userdao、自定义接口、测试类文件

1.3 手搓!!!

删除的就很简单

直接开搓就完事了

就是干!!!

public int del(T t) throws Exception{
    //以下代码依然要拼接一条删除sql语句 DELETE FROM user WHERE id=88
    StringBuffer delete = new StringBuffer("DELETE FROM ");
    //通过反射获取类对象
    Class<?> aClass = t.getClass();
    //获取表名,前提是要判断类名与表名是否一致
    String simpleName = aClass.getSimpleName();
    TableName annotation = aClass.getAnnotation(TableName.class);
    if (annotation != null){
        simpleName = annotation.value();
    }
    //拼接表名
    delete.append(simpleName);

    //拿到id列名与列值
    String where = " where ";
    Field[] declaredFields = aClass.getDeclaredFields();
    for (Field declaredField : declaredFields) {
        declaredField.setAccessible(true);
        //通过注解获取id值
        TableId annotation1 = declaredField.getAnnotation(TableId.class);
        //判断id值,通过注解主要功能为判断id是否为主键,判断id是否与列名id一致
        if(annotation1 != null){
            String id = annotation1.value();
            Object o = declaredField.get(t);
            //拼接where
            where= where + id + "=" + o;
        }
    }
    delete.append(where);
    //        调用jdbc数据库运行sql语句
    Connection connection = DButils.getConnection();
    PreparedStatement preparedStatement = connection.prepareStatement(delete.toString());
    int i = preparedStatement.executeUpdate();
    return i;
}

1.3.1 猜想

这里有个猜想,如果可以的话,我感觉把对象传入直接换成id传入,可以更简便,要不然每次调用DELETE方法还要创建对象进去,属实麻烦。

如果可以直接传入id,万能id

感觉有可能

--------

有可能就搞!

2.0 手搓简单SQL增删改查框架-删除(plass版)

首先,如果直接传入id删除,那么此时就遇到了因为不能直接获取类对象的反射类而抑制

那么,只能通过暴力解决

此时我们要通过寻找子类继承父类泛型的反射类

听起来很迷糊,实际上咱们要寻找的就是这玩意:

怎么获取,直接上操作:

2.1 获取父类泛型反射类

定义本dao层的一个类对象

private Class currency;

随后把本类的无参构造整出来:

public CurrencyDao(){

}

随后在无参构造里整:

public CurrencyDao(){
    Class<? extends CurrencyDao> aClass = this.getClass();
    ParameterizedType genericSuperclass = (ParameterizedType)aClass.getGenericSuperclass();
    Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
    currency = (Class)actualTypeArguments[0];
}

这一步可以直接拿到父类的泛型反射类,也就意味着,谁new就这个反射类就是谁

2.2 完整步骤

只要能拿到反射类,剩下的就好办了:还是如同基本步骤一样

//通用的删除方法,针对所有的表都有用
private Class currency;

//获取泛型类中对象类
public CurrencyDao(){
    Class<? extends CurrencyDao> aClass = this.getClass();
    ParameterizedType genericSuperclass = (ParameterizedType)aClass.getGenericSuperclass();
    Type[] actualTypeArguments = genericSuperclass.getActualTypeArguments();
    currency = (Class)actualTypeArguments[0];
}
public int del(Object id) throws Exception{

    //以下代码依然要拼接一条删除sql语句 DELETE FROM user WHERE id=88
    StringBuffer delete = new StringBuffer("DELETE FROM ");

    //获取表名,前提是要判断类名与表名是否一致
    String simpleName = currency.getSimpleName();

    TableName annotation = (TableName) currency.getAnnotation(TableName.class);
    if (annotation != null){
        simpleName = annotation.value();
    }
    //拼接表名
    delete.append(simpleName + " where ");
    //拿到id列名与列值
    Field[] declaredFields = currency.getDeclaredFields();
    for (Field declaredField : declaredFields) {
        declaredField.setAccessible(true);
        //通过注解获取id值
        TableId annotation1 = declaredField.getAnnotation(TableId.class);
        //判断id值,通过注解主要功能为判断id是否为主键,判断id是否与列名id一致
        if(annotation1 != null){
            String ids = annotation1.value();
            //拼接where
            delete.append(ids + "=" + "'" + id + "'");
        }
    }

    //        调用jdbc数据库运行sql语句
    Connection connection = DButils.getConnection();
    PreparedStatement preparedStatement = connection.prepareStatement(delete.toString());
    int i = preparedStatement.executeUpdate();
    return i;
}

【 对了,这里需要注意,子类继承父类的时候,泛型的参数一定要跟上,要不然会报错】

就是这里,泛型参数你要删除那个表的谁就写那个表对应的实体类

 

 以上便是ORM框架中的SQL语句删除,如有漏缺请在下方留言告知,我会及时补充

 

posted @ 2023-08-12 10:30  九极致之术  阅读(51)  评论(0编辑  收藏  举报