生活随笔
收集整理的這篇文章主要介紹了
利用反射对dao层进行重写
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
反射寫一個通用的dao層
- 1. 學了反射,就得學會搞事情
- 2. 反射寫dao具體實現(xiàn)
1. 學了反射,就得學會搞事情
-
我想怎么對實體類操作,就對實體類操作
-
想實現(xiàn)通用的dao,要滿足的條件:
- 實體類名與表名一樣
- 實體字段名與表字段名一樣
- 實體類定義的屬性順序與表名字段名順序一樣
- 使用dao修改,增加時,實體類的屬性都要有賦值,因為根據(jù)反射拿到所有屬性值,和屬性名,來拼接成sql語句滴
-
如何用反射操作操作
- 拼接sql語句
- 拿到表名
- 拿到實體類的字段
- 拿到字段的值
2. 反射寫dao具體實現(xiàn)
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 {public int add(Object entity
) {int count
= -1;Class
<?> c
= entity
.getClass();StringBuffer sql
= new StringBuffer();sql
.append("insert into " + c
.getSimpleName() + " values (seq_" + c
.getSimpleName() + ".nextval");Field
[] fs
= c
.getDeclaredFields();Field
.setAccessible(fs
, true);for (int j
= 1; j
< fs
.length
; j
++) {sql
.append(", ?");}sql
.append(")");System
.out
.println(sql
);Connection conn
= BaseDao
.getConn();PreparedStatement ps
= null
;try {ps
= conn
.prepareStatement(sql
.toString());for (int i
= 1; i
< fs
.length
; i
++) {ps
.setObject(i
, fs
[i
].get(entity
));}count
= ps
.executeUpdate();} catch (SQLException e
) {e
.printStackTrace();} catch (IllegalArgumentException e
) {e
.printStackTrace();} catch (IllegalAccessException e
) {e
.printStackTrace();} finally {BaseDao
.closeAll(conn
, ps
, null
);} return count
;}public List
<Object> queryAll(Class
<?> c
) {ArrayList
<Object> list
= new ArrayList<Object>();String sql
= "SELECT * FROM " + c
.getSimpleName();Connection conn
= BaseDao
.getConn();PreparedStatement ps
= null
;ResultSet rs
= null
;conn
= BaseDao
.getConn();try {ps
= conn
.prepareStatement(sql
);rs
= ps
.executeQuery();Field
[] fs
= c
.getDeclaredFields();Field
.setAccessible(fs
, true);while (rs
.next()) {Object entity
= c
.newInstance();for (int i
= 0; i
< fs
.length
; i
++) {Object value
= rs
.getObject(fs
[i
].getName());if (fs
[i
].getType() == Integer
.class) {value
= rs
.getInt(fs
[i
].getName());} else if (fs
[i
].getType() == Double
.class) {value
= rs
.getDouble(fs
[i
].getName());} else if (fs
[i
].getType() == Timestamp
.class) {value
= rs
.getTimestamp(fs
[i
].getName());}fs
[i
].set(entity
, value
);}list
.add(entity
);}} catch (SQLException e
) {e
.printStackTrace();} catch (InstantiationException e
) {e
.printStackTrace();} catch (IllegalAccessException e
) {e
.printStackTrace();} finally {BaseDao
.closeAll(conn
, ps
, rs
);}return list
;}public Object
queryOne(Object entity
) {Object obj
= null
;Class
<?> c
= entity
.getClass();Field
[] fs
= c
.getDeclaredFields();Field
.setAccessible(fs
, true); String sql
= "select * from " + c
.getSimpleName() + " where " + fs
[0].getName() + " = ?";Connection conn
= BaseDao
.getConn();PreparedStatement ps
= null
;ResultSet rs
= null
;try {ps
= conn
.prepareStatement(sql
);ps
.setObject(1, fs
[0].get(entity
));rs
= ps
.executeQuery();if (rs
.next()) {obj
= c
.newInstance();for (int i
= 0; i
< fs
.length
; i
++) {Object value
= rs
.getObject(fs
[i
].getName());if (fs
[i
].getType() == Integer
.class) {value
= rs
.getInt(fs
[i
].getName());} else if (fs
[i
].getType() == Double
.class) {value
= rs
.getDouble(fs
[i
].getName());} else if (fs
[i
].getType() == java
.sql
.Timestamp
.class) {value
= rs
.getTimestamp(fs
[i
].getName());}fs
[i
].set(obj
, value
);}}} catch (Exception e
) {e
.printStackTrace();} finally {BaseDao
.closeAll(conn
, ps
, rs
);}return obj
; }public int update(Object entity
) {int count
= -1;Class
<?> c
= entity
.getClass();StringBuffer sql
= new StringBuffer();sql
.append("update " + c
.getSimpleName() + " set ");Field
[] fs
= c
.getDeclaredFields();Field
.setAccessible(fs
, true);try {for (int i
= 1; i
< fs
.length
; i
++) {if (i
< fs
.length
- 1)sql
.append(fs
[i
].getName() + " = ?, ");elsesql
.append(fs
[i
].getName() + " = ? ");}} catch (IllegalArgumentException e
) {e
.printStackTrace();}sql
.append("where " + fs
[0].getName() + " = ?");System
.out
.println(sql
);Connection conn
= BaseDao
.getConn();PreparedStatement ps
= null
;try {ps
= conn
.prepareStatement(sql
.toString());for (int i
= 1; i
< fs
.length
; i
++) {ps
.setObject(i
, fs
[i
].get(entity
));}ps
.setObject(fs
.length
, fs
[0].get(entity
));count
= ps
.executeUpdate();} catch (SQLException e
) {e
.printStackTrace();} catch (IllegalArgumentException e
) {e
.printStackTrace();} catch (IllegalAccessException e
) {e
.printStackTrace();} finally {BaseDao
.closeAll(conn
, ps
, null
);}return count
;}public int delete(Object entity
) {int count
= -1;Class
<?> c
= entity
.getClass();Field primaryKey
= c
.getDeclaredFields()[0];primaryKey
.setAccessible(true);String sql
= "delete from " + c
.getSimpleName() + " where " + primaryKey
.getName() + " = ?";Connection conn
= BaseDao
.getConn();PreparedStatement ps
= null
;try {ps
= conn
.prepareStatement(sql
);ps
.setObject(1, primaryKey
.get(entity
));count
= ps
.executeUpdate();} catch (SQLException | IllegalArgumentException
| IllegalAccessException e
) {e
.printStackTrace();} finally {BaseDao
.closeAll(conn
, ps
, null
);}return count
;}}
- 本代碼適用Oracle,mysql,sqlserver稍微改變下可用。
總結(jié)
以上是生活随笔為你收集整理的利用反射对dao层进行重写的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。