反射写一个通用的dao层
1. 学了反射,就得学会搞事情
-
我想怎么对实体类操作,就对实体类操作
-
想实现通用的dao,要满足的条件:
- 实体类名与表名一样
- 实体字段名与表字段名一样
- 实体类定义的属性顺序与表名字段名顺序一样
- 使用dao修改,增加时,实体类的属性都要有赋值,因为根据反射拿到所有属性值,和属性名,来拼接成sql语句滴
-
如何用反射操作操作
- 拼接sql语句
- 拿到表名
- 拿到实体类的字段
- 拿到字段的值
2. 反射写dao具体实现
- BaseDao 拿到连接和释放资源
package com.lovely.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BaseDao {
static {
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn() {
Connection conn = null;
String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
try {
conn = DriverManager.getConnection(url, "scott", "scott");
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
public static void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
- 增删改查万能写法
package com.lovely.dao;
import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class CommonDao {
/**
* @param entity 给定一个初始化参数的实体,来做添加操作
* @return 返回数据库受影响行数
*/
public int add(Object entity) {
int count = -1;
Class<?> c = entity.getClass();
StringBuffer sql = new StringBuffer();
// insert into tab_name values (seq_student.nextval, ?, ?, ? ...);
sql.append("insert into " + c.getSimpleName() + " values (seq_" + c.getSimpleName() + ".nextval");
// 拿到实体类私有属性对象的数组
Field[] fs = c.getDeclaredFields();
Field.setAccessible(fs, true);
// 排除主键
for (int j =