反射实现增删改查(DAO层)——插入数据
2024-08-26 10:52:12
先贴出代码,后续补充自己的思路、配置文件、使用方式:
/**
* 插入数据
*/
@Override
public void addObject(Object object, String tableName) {
StringBuilder sql = new StringBuilder("INSERT " + tableName
+ " VALUES(");
Connection connection = null;
PreparedStatement preparedStatement = null;
// 用于存放传入的对象的参数,默认将id值(主键)的key设为0,方便条件设置
Map<Integer, Object> fieldsValues = new HashMap<Integer, Object>();
try {
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
fieldsValues.put(i, fields[i].get(object));
sql.append("?");
if (i < (fields.length - 1))
sql.append(", ");
}
sql.append(")");
connection = DBConnection.getConnection();
preparedStatement = connection.prepareStatement(sql.toString());
Class<?> fieldClass = null;
for (int i = 1; i <= fieldsValues.size(); i++) {
/**
* 获取存入map中对象的参数的类类型,根据类类型选择preparedStatement的set方法
*/
if (fieldsValues.get(i - 1) != null) {
fieldClass = fieldsValues.get(i - 1).getClass();
// 如果类类型为String.class,则执行setString
if (fieldClass.equals(String.class)) {
preparedStatement.setString(i,
(String) fieldsValues.get(i - 1));
}
// 如果类类型为Float.class,则执行setString
if (fieldClass.equals(Float.class)) {
preparedStatement.setFloat(i,
(Float) fieldsValues.get(i - 1));
}
// 如果类类型为Integer.class,则执行setString
if (fieldClass.equals(Integer.class)) {
preparedStatement.setInt(i,
(Integer) fieldsValues.get(i - 1));
}
// 如果类类型为Timestamp.class,则执行setString
if (fieldClass.equals(Timestamp.class)) {
preparedStatement.setTimestamp(i, new Timestamp(
((Date) fieldsValues.get(i - 1)).getTime()));
}
} else {
preparedStatement.setObject(i, null);
}
}
// 执行sql语句,返回更新参数
int columnsCount = preparedStatement.executeUpdate();
System.out.println("有" + columnsCount + "条数据被更新!");
} catch (SQLException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NumberFormatException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
DBConnection.close(connection, preparedStatement, null);
}
}
基本流程:(这张表结合源码备注理解应该问题不大)如果看不清楚,复制图片地址在新窗口中查看
最新文章
- ContextFlyout 在10586或10240的使用
- redmine常见问题
- js不间断平滑地自动向上滚动
- 通用FASTREPORT打印模块及接口方法
- 一个CS出身的基本素养
- Topo软件
- [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
- devexpress实现单元格根据条件显示不同的样式(颜色、字体、对齐方式,大小等)
- javascript编码规范总结
- 201521123085 《Java程序设计》 第2周学习总结
- Java NIO 之 Buffer
- python精进之路1---基础数据类型
- 3--TestNG多线程
- Opaque data type--不透明类型
- git push declined due to email privacy restrictions 解决方法
- shell 用环境变量的值修改properties文件
- java中常见异常汇总(根据自己遇到的异常不定时更新)
- Junit使用的超简单介绍
- Django的models方法返回值异常,待解决
- Intel微处理结构.docx