上次介绍了Field,可以其可以在运行时候获取类中的信息,这是个好东西,我们可以用它来实现数据库的增删改查操作
当然,需要有一些限制:
1.表和实体类字段要对应
2.表和实体类名字要对应
3.实体类的第一个字段必须是主键(这个主要在更新的时候用到,具体根据个人情况而定)
数据库操作类如下
public class ReflectDao {
private static String uri = "jdbc:mysql://localhost/reflect";
private static String password = "123";
private static String username = "xhe";
private String insert = "insert into ";
private String update = "update ";
private String delete = "delete from ";
private String select = "select * from ";
public Connection getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(uri, username, password);
return conn;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public void save(Object obj, Class clazz) {
Connection conn = null;
Statement s = null;
try {
Field[] fields = clazz.getDeclaredFields();
insert += clazz.getSimpleName() + " values(";
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
if (fields[i].get(obj) != null) {
if (i == 0) {
insert = insert + "'" + fields[i].get(obj) + "'";
} else {
insert = insert + ",'" + fields[i].get(obj) + "'";
}
} else {
if (i == 0) {
insert = insert + "" + fields[i].get(obj) + "";
} else {
insert = insert + "," + fields[i].get(obj) + "";
}
}
}
insert += ")";
System.out.println(insert);
conn = getConnection();
s = conn.createStatement();
s.execute(insert);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (s != null)
s.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public void update(Object obj, Class clazz) {
Connection conn = null;
Statement s = null;
try {
Field[] fields = clazz.getDeclaredFields();
update += clazz.getSimpleName() + " set ";
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
if (fields[i].get(obj) != null) {
if (i == 0) {
update = update + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
} else {
update = update + "," + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
}
}
}
update += " where " + fields[0].getName() + " = " + fields[0].get(obj);
System.out.println(update);
conn = getConnection();
s = conn.createStatement();
s.executeUpdate(update);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (s != null)
s.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public List find(Object obj, Class clazz) {
Connection conn = null;
Statement s = null;
ResultSet rs = null;
List list = new ArrayList();
try {
Field[] fields = clazz.getDeclaredFields();
select += clazz.getSimpleName() + " where 1 = 1";
for (int i = 0, length = fields.length; i < length; i++) {
fields[i].setAccessible(true);
if (fields[i].get(obj) != null) {
select = select + " and " + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
}
}
System.out.println(select);
conn = getConnection();
s = conn.createStatement();
rs = s.executeQuery(select);
while (rs.next()) {
Object o = clazz.newInstance();
for (int i = 0, length = fields.length; i < length; i++) {
fields[i].setAccessible(true);
fields[i].set(o, rs.getObject(i + 1));
}
list.add(o);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (s != null)
s.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return list;
}
public void delete(Object obj, Class clazz) {
Connection conn = null;
Statement s = null;
ResultSet rs = null;
try {
Field[] fields = clazz.getDeclaredFields();
delete += clazz.getSimpleName() + " where 1 = 1";
for (int i = 0, length = fields.length; i < length; i++) {
fields[i].setAccessible(true);
if (fields[i].get(obj) != null) {
delete = delete + " and " + fields[i].getName() + " = '" + fields[i].get(obj) + "'";
}
}
System.out.println(delete);
conn = getConnection();
s = conn.createStatement();
s.executeUpdate(delete);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (s != null)
s.close();
if (conn != null)
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
这个类很简单,外部调用的时候只需要传入对应的对象和class对象,就可以进行增删改查操作
测试类如下
public static void main(String[] args) {
ReflectDao reflect = new ReflectDao();
Student s = new Student();
s.setAge(12);
s.setName("tom");
s.setSex("man");
s.setStudentid(1130299110);
reflect.save(s, s.getClass());
}
这样就可以把Student的信息保存到数据库的Student表了(表就4个字段)
不得不说Field是一个好东西,不过这里主要是大概的提供一种应用,所以上面的程序会有BUG或者不完美的地方,各位可以使用Field去写一个自己的操作方法