java使用Field實現通用資料庫操作

來源:互聯網
上載者:User

標籤:資料庫   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實現通用資料庫操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.