您好,登錄后才能下訂單哦!
小編給大家分享一下java中如何實現JDBC增刪改查操作,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
我們先看一遍步驟:
這里不推薦使用Statement,兩個原因:
1.存在拼串操作,繁瑣。
2.存在sql注入問題。
那我們使用誰來代替Statement呢?
操作前,我們先解決上面的問題,我們使用PreparedStatement來代替Statement。
可以通過調用 Connection 對象的 preparedStatement(String sql) 方法獲取 PreparedStatement 對象
PreparedStatement 接口是 Statement 的子接口,它表示一條預編譯過的 SQL 語句
PreparedStatement 對象所代表的 SQL 語句中的參數用問號(?)來表示,調用 PreparedStatement 對象的 setXxx() 方法來設置這些參數. setXxx() 方法有兩個參數,第一個參數是要設置的 SQL 語句中的參數的索引(從 1 開始),第二個是設置的 SQL 語句中的參數的值
優點:
解決字符串拼串問題,防止sql注入提高性能
這里給出一個針對不同表的通用增刪改操作,拿著直接用就可以了。
//通用增刪改操作 public boolean updateInfo(String sql,Object...args){ Connection conn = null; PreparedStatement ps = null; boolean b = true; try { //1.建立連接 conn = JDBCUtils.getConnection(); //2.預編譯sql語句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i <args.length ; i++) { ps.setObject(i+1,args[i]); } //4.執行操作 b = ps.execute(); } catch (Exception e) { e.printStackTrace(); } finally { //5.關閉資源 JDBCUtils.close(conn,ps); } return b; }
是不是復制使用會報錯,這是因為博主把數據庫連接和關閉資源也封裝成了一個類JDBCUtils。
下面給出這個類的具體代碼:
配置文件就自己寫吧,畢竟每個人的數據庫都不一樣。以及該導入的包自己動動手就行了。
public class JDBCUtils { //連接 public static Connection getConnection(){ Connection conn = null; try { //1.加載配置文件 InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties"); Properties prop = new Properties(); prop.load(is); //2.讀取配置文件 String user = prop.getProperty("user"); String password = prop.getProperty("password"); String url = prop.getProperty("url"); String driverClass = prop.getProperty("driverClass"); //3.加載驅動 Class.forName(driverClass); //4.建立連接 conn = DriverManager.getConnection(url, user, password); } catch (Exception e) { e.printStackTrace(); } return conn; } //關閉 public static void close(Connection conn, PreparedStatement ps){ try { if (conn != null){ conn.close(); } if (ps != null){ ps.close(); } } catch (SQLException e) { e.printStackTrace(); } } //關閉帶resultset public static void close(Connection conn, PreparedStatement ps , ResultSet rs){ try { if (conn != null){ conn.close(); } if (ps != null){ ps.close(); } if (rs != null){ rs.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
我們來測試一下上面的代碼
這里有一張order表,里面有初始數據:
然后我們通過上面提供的方法給他增加一條數據:
public class Test { public static void main(String[] args) { Operation operation = new Operation(); String insertSql = "INSERT INTO `order`(order_id,order_name,order_date) VALUES (?,?,?)"; boolean b = operation.updateInfo(insertSql, 3, "CC", new Date(12312132)); if (!b){ System.out.println("操作成功!"); }else { System.out.println("操作失敗!"); } } }
控制臺打印輸出:
那么是不是已經插入成功了呢,我們去數據庫中看一下:
我們 SELECT * FROM `order`;
看來我們確實成功了!所以我們給出的方法還是沒有問題。
接下來我們就是查操作了。
public <T> T doQuery(Class<T> clazz,String sql,Object...args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.建立連接 conn = JDBCUtils.getConnection(); //2.預編譯sql語句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i <args.length ; i++) { ps.setObject(i+1,args[i]); } //4.得到結果集ResultSet rs = ps.executeQuery(); //5.得到結果集元數據 ResultSetMetaData rsdm = rs.getMetaData(); //6.通過rs得到列值,rsdm得到列名和列數 //得到列數 int columnCount = rsdm.getColumnCount(); if (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i <columnCount ; i++) { //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的別名 String columnLabel = rsdm.getColumnLabel(i + 1); //通過反射給對象賦值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } return t; } } catch (Exception e) { e.printStackTrace(); } finally { //關閉資源 JDBCUtils.close(conn,ps,rs); } return null; }
老樣子,測試!
public class Test { public static void main(String[] args) { Operation operation = new Operation(); String sql = "SELECT order_id orderId,order_name orderName,order_date orderDate FROM `order` WHERE order_id = ?;"; Order order = operation.doQuery(Order.class, sql, 2); System.out.println(order); } }
控制臺輸出:
public <T> List doQueryMore(Class<T> clazz,String sql,Object...args){ Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //1.建立連接 conn = JDBCUtils.getConnection(); //2.預編譯sql語句 ps = conn.prepareStatement(sql); //3.填充占位符 for (int i = 0; i <args.length ; i++) { ps.setObject(i+1,args[i]); } //4.得到結果集ResultSet rs = ps.executeQuery(); //5.得到結果集元數據 ResultSetMetaData rsdm = rs.getMetaData(); //6.通過rs得到列值,rsdm得到列名和列數 //得到列數 int columnCount = rsdm.getColumnCount(); //創建集合 ArrayList<T> list = new ArrayList<>(); while (rs.next()){ T t = clazz.getDeclaredConstructor().newInstance(); for (int i = 0; i <columnCount ; i++) { //得到列值 Object columnvalue = rs.getObject(i + 1); //得到列的別名 String columnLabel = rsdm.getColumnLabel(i + 1); //通過反射給對象賦值 Field field = clazz.getDeclaredField(columnLabel); //暴力反射 field.setAccessible(true); field.set(t,columnvalue); } list.add(t); } return list; } catch (Exception e) { e.printStackTrace(); } finally { //關閉資源 JDBCUtils.close(conn,ps,rs); } return null; }
看完了這篇文章,相信你對“java中如何實現JDBC增刪改查操作”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。