JDBC工具類實現對資料庫資料的增刪改查
阿新 • • 發佈:2020-08-21
1、先將連線的地址和賬號密碼放在屬性檔案中,本地連線直接///代替,java1.6以後自動載入驅動
url = jdbc:mysql:///testdata user = root password = 123456
2、讀取屬性檔案獲取值
private static String url; private static String user; private static String password; static{ getLogin(); } public static void getLogin(){ try { Properties p= new Properties(); InputStream is = new FileInputStream("E:/java_workspace/Demojdbc/src/jdbc.properties"); //這個路徑是屬性檔案存在的位置 p.load(is); url = p.getProperty("url"); user = p.getProperty("user"); password = p.getProperty("password"); } catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace(); } }
3、獲取連線
private static Connection conn = null; private static PreparedStatement ps = null; private static ResultSet rs = null; /** * 連線資料庫 * @return 資料庫連線物件 */ public static Connection getConn(){ try { conn= DriverManager.getConnection(url, user,password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; }
4、關閉流
public static void close(Connection conn,PreparedStatement ps,ResultSet rs){ if (conn!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ps != null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(rs != null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } }
5、增刪改操作:傳入sql語句和引數,引數可以是任意個
舉例:String sql = "select * from user"; 呼叫時直接是 crud(sql);
String sql = "update user set name = ? where id = ? "; 根據佔位符傳引數,引數與佔位符的位置一一對應,有幾個佔位符對應幾個引數。
public static void crdu(String sql,Object...array){ //獲取連線 conn = getConn(); try { ps = conn.prepareStatement(sql); for (int i = 0; i < array.length; i++) { ps.setObject(i+1, array[i]); } ps.execute(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ jdbc.close(conn, ps, rs); } }
6、查詢操作
使用舉例:
public List<User> find(String name) { String sql = "select * from cat where name like concat('%',?,'%')"; List<User> list = jdbc.read(sql, User.class, name); return list; }
/** * 對資料進行查詢 * @param <E> 第一個E代表返回的型別是泛型,第二個E代表list存的是泛型E * @param sql 操作的sql語句 * @param c 要操作的類物件,對那個物件操作傳哪個 * @param array 引數陣列 */ public static <E> List<E> read(String sql,Class<E> c,Object...array){ List<E> list = null; //獲取連線 conn = getConn(); try { list = new ArrayList<>(); ps = conn.prepareStatement(sql); for (int i = 0; i < array.length; i++) { ps.setObject(i+1, array[i]); } rs = ps.executeQuery(); while(rs.next()){ E e = c.newInstance(); // 獲得ResultSetMetaData 物件,可以通過他來獲得列的數量和名稱 ResultSetMetaData data = rs.getMetaData(); // 獲得列的數量 int count = data.getColumnCount(); for (int i = 1; i <= count; i++) { // 獲取到所有的列名稱 String colname = data.getColumnLabel(i); //獲得class中指定屬性 Field f = c.getDeclaredField(colname); //破壞訪問修飾符,讓許可權釋放,否則不能訪問私有屬性 f.setAccessible(true); //對私有屬性賦值 f.set(e, rs.getObject(i)); } list.add(e); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); }finally{ close(conn, ps, rs); } return list; }
以上除了屬性檔案裡的內容都是寫在一個類中的,可以直接複製貼上測試。