基於sql相關jar包的原生的數據庫訪問和操作,sql server、mysql以及oracle只有鏈接數據的參數不一樣,方法一樣,以mysql為例,先封裝一個簡單的類,用於打開和關閉數據連接:
package com.wmqiangproject.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBUtil { /** * 連接數據庫的操作,用戶名,密碼,使用jdbc連接 */ public static String username = "root"; public static String password = "root"; public static String url = "jdbc:mysql://localhost:3306/wmqiangproject"; static{ try { Class.forName("com.mysql.jdbc.Driver"); } catch(ClassNotFoundException e){ e.printStackTrace(); } } public static Connection getConnectDb(){ Connection conn = null; try{ conn = DriverManager.getConnection(url,username,password); } catch (SQLException e){ e.printStackTrace(); } return conn; } public static void CloseDB(ResultSet rs, PreparedStatement stm, Connection conn){ if(rs!=null) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stm!=null) { try { stm.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
代碼中訪問數據庫增刪改查,以一個圖書管理系統Dao層數據庫訪問層代碼為例:
package com.wmqiangproject.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Calendar; import com.wmqiangproject.bean.AdminBean; import com.wmqiangproject.bean.BookBean; import com.wmqiangproject.bean.HistoryBean; import com.wmqiangproject.bean.TypeBean; import com.wmqiangproject.util.DBUtil; /** * 關於圖書連接數據庫的所有操作的類 */ public class BookDao { /** * 添加圖書信息,傳入所有的信息 * @param card * @param name * @param type * @param autho * @param press * @param num */ public void addBook(String card, String name, String type, String autho, String press, int num) { // TODO Auto-generated method stub Connection conn = DBUtil.getConnectDb(); String sql = "insert into book(card,name,type,autho,press,num) values(?,?,?,?,?,?)"; int rs = 0; PreparedStatement stm = null; try { stm = conn.prepareStatement(sql); stm.setString(1, card); stm.setString(2, name); stm.setString(3, type); stm.setString(4, autho); stm.setString(5, press); stm.setInt(6, num); rs = stm.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 獲取所有的圖書信息,返回的是ArrayList數組形式 * @return */ public ArrayList<BookBean> get_ListInfo(){ ArrayList<BookBean> tag_Array = new ArrayList<BookBean>(); Connection conn = DBUtil.getConnectDb(); String sql = "select * from book"; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ BookBean tag = new BookBean(); tag.setBid(rs.getInt("bid")); tag.setName(rs.getString("name")); tag.setCard(rs.getString("card")); tag.setType(rs.getString("type")); tag.setAutho(rs.getString("autho")); tag.setPress(rs.getString("press")); tag.setNum(rs.getInt("num")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return tag_Array; } /** * 獲取借閱記錄的全部信息,傳入的條件有status,aid,表示搜索正在借閱的,或者已經還書的信息,aid代表當前登錄用戶 * @param status * @return */ public ArrayList<HistoryBean> get_HistoryListInfo(int status,String aid){ ArrayList<HistoryBean> tag_Array = new ArrayList<HistoryBean>(); Connection conn = DBUtil.getConnectDb(); String sql = "select * from history where aid="+aid+" and status="+status; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ HistoryBean tag = new HistoryBean(); tag.setHid(rs.getInt("hid")); tag.setAid(rs.getInt("aid")); tag.setBid(rs.getInt("bid")); tag.setBookname(rs.getString("bookname")); tag.setCard(rs.getString("card")); tag.setAdminname(rs.getString("adminname")); tag.setUsername(rs.getString("username")); tag.setBegintime(rs.getString("begintime")); tag.setEndtime(rs.getString("endtime")); tag.setStatus(rs.getInt("status")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return tag_Array; } /** * 獲取借閱記錄的全部信息,傳入的條件有status,表示搜索正在借閱的,或者已經還書的信息 * @param status * @return */ public ArrayList<HistoryBean> get_HistoryListInfo2(int status){ ArrayList<HistoryBean> tag_Array = new ArrayList<HistoryBean>(); Connection conn = DBUtil.getConnectDb(); String sql = "select * from history where status="+status; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ HistoryBean tag = new HistoryBean(); tag.setHid(rs.getInt("hid")); tag.setAid(rs.getInt("aid")); tag.setBid(rs.getInt("bid")); tag.setBookname(rs.getString("bookname")); tag.setCard(rs.getString("card")); tag.setAdminname(rs.getString("adminname")); tag.setUsername(rs.getString("username")); tag.setBegintime(rs.getString("begintime")); tag.setEndtime(rs.getString("endtime")); tag.setStatus(rs.getInt("status")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return tag_Array; } /** * 獲取單個圖書的信息,根據傳入的bid來查找,返回一個BookBean數據類型 * @param bid * @return */ public BookBean get_BookInfo(int bid){ BookBean tag = new BookBean(); Connection conn = DBUtil.getConnectDb(); String sql = "select * from book where bid="+bid; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ tag.setBid(rs.getInt("bid")); tag.setName(rs.getString("name")); tag.setCard(rs.getString("card")); tag.setType(rs.getString("type")); tag.setAutho(rs.getString("autho")); tag.setPress(rs.getString("press")); tag.setNum(rs.getInt("num")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return tag; } /** * 修改圖書的信息,bid作為條件, */ public void updateBook(int bid, String card, String name, String type, String autho, String press, int num) { // TODO Auto-generated method stub Connection conn = DBUtil.getConnectDb(); String sql = "update book set name=?,card=?,type=?,autho=?,press=?,num=? where bid=?"; PreparedStatement stm = null; try { stm = conn.prepareStatement(sql); stm.setString(1, name); stm.setString(2, card); stm.setString(3, type); stm.setString(4, autho); stm.setString(5, press); stm.setInt(6, num); stm.setInt(7, bid); stm.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 刪除圖書信息,根據傳入的bid作為條件 * @param bid */ public void deleteBook(int bid) { // TODO Auto-generated method stub Connection conn = DBUtil.getConnectDb(); String sql = "delete from book where bid=?"; PreparedStatement stm = null; try { stm = conn.prepareStatement(sql); stm.setInt(1, bid); stm.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //System.out.println(uid); } /** * 用戶查找圖書,根據輸入的名稱,使用like進行模糊查詢,然后返回一個ArrayList數組類型 * @param name * @return */ public ArrayList<BookBean> getLikeList(String name) { // TODO Auto-generated method stub ArrayList<BookBean> tag_Array = new ArrayList<BookBean>(); Connection conn = DBUtil.getConnectDb(); String sql = "select * from book where name like '%"+name+"%'"; PreparedStatement stm = null; ResultSet rs = null; try { stm = conn.prepareStatement(sql); rs = stm.executeQuery(); while(rs.next()){ BookBean tag = new BookBean(); tag.setBid(rs.getInt("bid")); tag.setName(rs.getString("name")); tag.setCard(rs.getString("card")); tag.setType(rs.getString("type")); tag.setAutho(rs.getString("autho")); tag.setPress(rs.getString("press")); tag.setNum(rs.getInt("num")); tag_Array.add(tag); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ DBUtil.CloseDB(rs, stm, conn); } return tag_Array; } /** * 圖書借閱函數,根據傳入bid圖書id,adminbean當前登錄用戶的信息,在借閱記錄數據表中新插入一條記錄 * @param bid * @param adminbean */ public void borrowBook(int bid, AdminBean adminbean) { // TODO Auto-generated method stub BookBean bookbean = new BookBean(); bookbean = this.get_BookInfo(bid); //生成日期的功能 Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DATE); //生成借閱開始日期 String begintime = ""+year+"-"+month+"-"+day; month = month + 1; //生成截止還書日期 String endtime = ""+year+"-"+month+"-"+day; Connection conn = DBUtil.getConnectDb(); String sql = "insert into history(aid,bid,card,bookname,adminname,username,begintime,endtime,status) values(?,?,?,?,?,?,?,?,?)"; int rs = 0; PreparedStatement stm = null; try { stm = conn.prepareStatement(sql); stm.setInt(1, adminbean.getAid()); stm.setInt(2, bookbean.getBid()); stm.setString(3, bookbean.getCard()); stm.setString(4, bookbean.getName()); stm.setString(5, adminbean.getUsername()); stm.setString(6, adminbean.getName()); stm.setString(7, begintime); stm.setString(8, endtime); stm.setInt(9, 1); rs = stm.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 還書功能的函數,根據傳入的hid借閱記錄id,講status字段的值改為0,並將還書日期改變為當前日期 * @param hid */ public void borrowBook2(int hid) { // TODO Auto-generated method stub //生成日期 Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DATE); //生成還書日期 String endtime = ""+year+"-"+month+"-"+day; Connection conn = DBUtil.getConnectDb(); String sql = "update history set endtime=?,status=? where hid=?"; PreparedStatement stm = null; try { stm = conn.prepareStatement(sql); stm.setString(1, endtime); stm.setInt(2, 0); stm.setInt(3, hid); stm.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
其中,每次查詢操作時候必須要在結束后再調用鏈接數據庫的工具類再關閉鏈接,不要占用資源,對性能優化有影響,會有造成阻塞死鎖的風險;
java.sql包中的PreparedStatement 接口繼承了Statement,並與之在兩方面有所不同:有人主張,在JDBC應用中,如果你已經是稍有水平開發者,你就應該始終以PreparedStatement代替Statement.也就是說,在任何時候都不要使用Statement;ResultSet 為執行查詢返回的結果集,結果集(ResultSet)是數據中查詢結果返回的一種對象,可以說結果集是一個存儲查詢結果的對象,但是結果集並不僅僅具有存儲的功能,他同時還具有操縱數據的功能,可能完成對數據的更新等;