標籤:資料庫 java
上次介紹了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去寫一個自己的操作方法
java使用Field實現通用資料庫操作