public int insert(T t) throws Exception{ Connection connection=null; PreparedStatement ps=null; StringBuffer sql=new StringBuffer("insert into " ); //得到T的反射类 Class<?> aClass=t.getClass(); //获取类上注解 TableName tableName = aClass.getAnnotation(TableName.class); if (tableName==null){ throw new RuntimeException("未使用注解标记表名"); } //获取表名 String name = tableName.name(); sql.append(name+ " values"); try { List<Object> values = new ArrayList<Object>(); Field[] declaredFields = aClass.getDeclaredFields(); for (Field field : declaredFields) { field.setAccessible(true); Object v1 = field.get(t); values.add("'" + v1 + "'"); } String replace = values.toString().replace("[", "(").replace("]", ")"); sql.append(replace); connection = ConnectionFactory.getConnection(); ps = connection.prepareStatement(sql.toString()); int i = ps.executeUpdate(); return i; }catch (Exception e){ e.printStackTrace(); }finally { ConnectionFactory.close(null,ps,connection); } return 0; }
时间: 2024-02-15 22:28:05 浏览: 34
这段代码是用来实现数据库插入操作的,其中的T是一个泛型参数,可以代表任意一个Java类,而该类必须使用了@TableName注解标记了数据库表名。这个方法首先通过反射获取到T的Class对象,然后从该Class对象中获取@TableName注解并获取表名,接着通过反射获取到该类中所有的Field对象,遍历每个Field对象并获取其值,最后构造出一个SQL语句并执行数据库插入操作。需要注意的是,这段代码并没有对SQL注入进行防范,如果插入的数据中包含特殊字符,可能会导致SQL注入攻击。
相关问题
public static ResultSet queryData(String sql) throws SQLException{ Connection connection = JDBC(); PreparedStatement ps = connection.prepareStatement(sql); ResultSet rs = ps.executeQuery(); return rs; }检查代码并修改
在代码中,虽然正确地获取了数据库连接,但没有关闭连接和释放资源,建议在finally块中关闭连接和释放资源。同时,建议使用try-with-resources语句自动关闭资源,代码修改如下:
```
public static ResultSet queryData(String sql) throws SQLException {
try (Connection connection = JDBC();
PreparedStatement ps = connection.prepareStatement(sql);
ResultSet rs = ps.executeQuery()) {
return rs;
}
}
```
这样,当try语句块结束时,会自动关闭ResultSet、PreparedStatement和Connection对象,无需手动调用close()方法。
public int updateStu(Student stu) throws Exception { Connection conn = null; PreparedStatement pstm = null; ResultSet rs = null; try { conn = dataSource.getConnection(); String sql = "update wn81.student set sname=? ,ssex=?,class=? where sno=?" ; pstm = conn.prepareStatement(sql); pstm.setString(1,stu.getSno()); pstm.setString(2,stu.getSname()); pstm.setString(3,stu.getSsex()); pstm.setString(4,stu.getCalss()); int i = pstm.executeUpdate(); Student s = null; return i ;这个方法有什么问题么
这个方法存在一些问题:
1. 在设置参数时,使用了错误的参数顺序。应该按照 SQL 语句中参数的顺序设置参数,而不是按照 `stu.getSno()`、`stu.getSname()`、`stu.getSsex()`、`stu.getCalss()` 的顺序设置参数。
2. 在 SQL 语句中,将 `sname` 和 `ssex` 的位置颠倒了。应该按照表结构中字段的顺序编写 SQL 语句。
3. 在执行更新操作后,没有对连接、语句和结果集进行关闭。应该使用 try-with-resources 或者 finally 块来关闭这些对象,以释放资源。
下面是修改后的代码:
```java
public int updateStu(Student stu) throws Exception {
try (Connection conn = dataSource.getConnection();
PreparedStatement pstm = conn.prepareStatement(
"UPDATE wn81.student SET sname=?, ssex=?, class=? WHERE sno=?")) {
pstm.setString(1, stu.getSname());
pstm.setString(2, stu.getSsex());
pstm.setString(3, stu.getCalss());
pstm.setString(4, stu.getSno());
int rowCount = pstm.executeUpdate();
return rowCount;
}
}
```
这个方法的参数是一个 `Student` 对象,但是在更新操作中没有使用 `stu` 的 `sno` 属性,因此可能导致更新错误。应该根据实际需求修改 SQL 语句,确保更新操作正确。