1. 程式人生 > >JDBC的連接mySql的基本知識

JDBC的連接mySql的基本知識

nts 取數據 ria red local 相對 host 參數 statement

  這只是我自己的隨筆博客~,用於偶爾回憶知識,可能存在一些錯誤,如有錯誤,歡迎指正~

首先對於JDBC連接MySQL,要了解基本的框架結構

技術分享圖片

畫的比較爛,大約就是這樣的結構

然後看一下具體實現的 代碼:;

public class DBUtil {
	private String user = "root";
	private String password = "root";
	private String url = "jdbc:mysql://localhost:3306/mydb6";
	private static DBUtil dbUtil;
	Connection connection = null;

	// 單例:構造方法私有化
	private DBUtil() {

	}

	public synchronized static DBUtil getInstance() {
		if (dbUtil == null) {
			dbUtil = new DBUtil();
		}
		return dbUtil;
	}

	/**
	 * 創建數據庫連接
	 */
	public Connection getConnection() {
		if (connection == null) {
			try {
				// 註冊驅動
				Class.forName("com.mysql.jdbc.Driver");
				// 獲取連接
				connection = DriverManager.getConnection(url, user, password);
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return connection;
	}
}

  上面這個是通過單例模式 建立了DBUtil這樣一個類。通過這個類可以幹什麽呢?可以實現----數據庫的連接!

沒錯,Connection接口的作用就是連接數據庫-
與特定數據庫的連接(會話)。在連接上下文中執行 SQL 語句並返回結果。

怎樣才能得到這個連接呢?--想要建立這個連接,你需要註冊一個驅動---嗯~就是這個代碼 Class.forName("com.mysql.jdbc.Driver");

它是通過反射的機制來獲得的,不了解反射?嗯~那你記住就完了 哈哈哈

connection = DriverManager.getConnection(url, user, password);這一句話的是用來獲取連接的 ,這三個參數分別是 數據的地址,jdbc:mysql://IP地址:端口號/數據庫的名稱

嗯~然年再將一下如何通過jdbc向數據庫寫入數據

public int insertStuByStatement() {
        String sql1 = "insert into stu(sname,sage) values(‘aaa‘,1)";
        String sql2 = "insert into stu(sname,sage) values(‘bbb‘,1)";
        String sql3 = "insert into stu(sname,sage) values(‘ccc‘,1)";
        Connection connection 
= getConnection();// 獲得數據庫的連接 Statement stmt = null; try { stmt = (Statement) connection.createStatement(); connection.setAutoCommit(false); stmt.addBatch(sql1);//批量添加sql語句 stmt.addBatch(sql2);//批量添加sql語句 stmt.addBatch(sql3);//批量添加sql語句 //一次性執行 stmt.executeBatch(); connection.commit(); System.out.println("批處理成功"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } } catch (Exception e2) { } } return i; }

這裏使用的statement 來實現的,寫出你要操作的 sql語句。(提一下,一般這些操作都是放在DBUtil類中的額 ,這個方法我也是放在DBUtil的)。

第二步:根據上面的定義的方法獲取數據庫。

下面就是獲取一個Statement 對象,然後通過這個對象的stmt.executeBatch();就可以在數據庫中執行剛才就的語句了,這樣就做到了靜態插入數據。

那動態插入數據是怎樣的呢 ?-----那就是用到了另一個能夠實現語句的對象PreparedStatement

直接上代碼吧

public int insertStu(String sname,int sage){
        String sql = "insert into stu(sname,sage) values(?,?)";
        Connection connection = getConnection();//獲得數據庫的連接
        PreparedStatement ps = null;
        int i = 0;
        try {
            ps  = (PreparedStatement) connection.prepareStatement(sql);
            ps.setString(1, sname);
            ps.setInt(2, sage);
            
            i=ps.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                if (ps!=null) {
                ps.close();
                }
            } catch (Exception e2) {
            
            }
        }
        return i;
    }

定義的插入方法有了兩個參數的數值

與statement的區別在哪呢?--一個是sql字符串語句的區別,多了“?”,作用是---看下面這兩行代碼

 ps.setString(1, sname);
 ps.setInt(2, sage);
ps.set****(a,b)有兩個參數,sql語句中也有兩個?,所以參數a,代表的是sql語句的第幾個“?”,如果參數是1,則說明sql語句中第一個“?”的位置替換為參數b,
如果 同理
如果參數是2,則說明sql語句中第一個“?”的位置替換為參數b.這樣就做到了動態的插入數據,我們只要在調用插入方法的時候傳入想要插入的數據就好了,不用每次都寫新的sql語句。
對於 i=ps.executeUpdate();語句,它返回的這次你的數據庫操作後有有幾條數據有影響.這種方法對於插入,當然是i=1了

但是對於產出和修改的就不是一定了,刪除修改我直接貼代碼了就不再做講解
//修改
public
int updateStu(int sage,String sname){ String sql = "updae stu set sage = ? where sname = ?"; Connection connection = getConnection(); PreparedStatement ps =null; int i = 0; try { ps = (PreparedStatement) connection.prepareStatement(sql); ps.setInt(1, sage); ps.setString(2, sname); i = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if (ps!=null) { ps.close(); } } catch (Exception e2) { } } return i; } //刪除 public int deleteStu(String sname,int sage) { String sql = "delete from stu where sname=? and sage = ?"; Connection conn = getConnection();//獲得數據庫連接 PreparedStatement ps = null; int i = 0; try { ps = (PreparedStatement) conn.prepareStatement(sql); ps.setString(1, sname); ps.setInt(2,sage ); i = ps.executeUpdate(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally { try { if(ps != null) ps.close(); }catch (Exception e) { // TODO: handle exception } } return i; }

數據庫最重要的是什麽---查詢數據,相對於增刪改--查可能稍微繁瑣一點
代碼如下:
/**
     * 查詢所有學生
     * @return
     */
    public ArrayList<Stu> queryStu(){
        String sql = "select * from stu ";// select *  或的字段的順序和數據庫中的是一致
        Connection conn = getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        ArrayList<Stu> stus = new ArrayList<Stu>();//此集合用於存儲每一個學生對象
        try {
            ps = (PreparedStatement) conn.prepareStatement(sql);
            rs = ps.executeQuery();
            //遍歷rs
            while(rs.next()) {//true表示有下一條數據
                int id = rs.getInt("id");
                String sname = rs.getString("sname");
                int sage = rs.getInt("sage");
                //創建stu對象
                Stu stu = new Stu(id, sname, sage);
                //收集對象
                stus.add(stu);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally {
            try {
                if(rs != null)
                    rs.close();
                if(ps != null)
                    ps.close();
            }catch (Exception e) {
                // TODO: handle exception
            }
        }
        
        return stus;
    }

講一下重點的地方 ResultSet rs = null; 這個對象存儲的一個查詢的結果集合。select * from stu這個返回的 應該是查詢的學生表中每個學生的所有數據,

所以rs就可以儲存這樣的一個集合,然後通過遍歷得到其中的數據,將數據賦值給一個學生對對象,將對象加入到集合中,就得到可表中所有的數據~

這次講的主要是基礎部分,等下次繼續探討JDBC聯合其他的一些操作~


Class.forName("com.mysql.jdbc.Driver");

JDBC的連接mySql的基本知識