java之手搓简单ORM框架--SQL的DELETE
1.手搓简单SQL增删改查框架-删除
1.1创建简单类,并使用泛型类,这里可能使用到之间写的三篇知识的内容,如果不了解的小伙伴可以去
当然,前提是必须要把数据库相关连接弄好,这里会专门出一篇 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语句删除,如有漏缺请在下方留言告知,我会及时补充