1. 程式人生 > >JavaWeb基礎(1):JDBC

JavaWeb基礎(1):JDBC

(一)JDBC

(1)簡介

  • JDBC:Java Database Connection
    • 用於執行SQL語句的Java API
    • 可以連線MySQl、Orcale資料庫

(2)基本操作

  • 一個典型的查詢資料庫表的操作
	public void f1() throws ClassNotFoundException,java.sql.SQLException {
		//註冊驅動
		Class.forName("com.mysql.jdbc.Driver");

		//獲取連線
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test"
,"root","123456"); //建立語句執行 String sql = "select * from category"; //設定引數 PreparedStatement st = conn.prepareStatement(sql); //執行SQL ResultSet rs = st.executeQuery(); //處理結果 while(rs.next()){ System.out.println(rs.getString("cid") + ":" + rs.getString("cname")); } //釋放資源 rs.close
(); st.close(); conn.close(); }

(3)API

  • DriverManager:用於管理JDBC驅動的基本服務
//DriverManager的getConnection方法:
public static Connection getConnection(String url,
                                       String user,
                                       String password)
                                throws
SQLException URL: 協議:資料庫型別 引數 例如:jdbc:mysql://localhost:3306/test user:資料庫使用者名稱 password:密碼
  • Connection:連線(Interface)
    • createStatement()
    • prepareStatement(String sql) 獲取預編譯語句執行者
  • Statement 語句執行者(可能會誘發SQL注入)
  • PreparedStatement
    • setXXX(引數index,對應引數) :給PreparedStatement物件設定引數
    • executeQuery() :返回值為ResultSet物件(返回查詢的具體結果)
    • executeUpdate() :返回值為int型別(執行結果affect的row數)
  • ResultSet
    • next():返回值為boolean型別,如果有下一條記錄,則移動游標。常用於迴圈體判斷條件
    • getint(int n):返回第n列
    • getString(String s):返回欄位名的值
    • getObject():可以獲取任意值

(4)工具類使用

  • 將字元創常量放在.properties檔案(.properties檔案放在src目錄下)中,然後使用ResourceBundle類每次去提取字元創變數對應的值,這樣在專案中修改使用者名稱以及密碼等字串值的時候比較方便
    • 這種操作也體現了面向物件中的封裝思想
  • ResourceBundle
    • getBundle(“properties檔名”):返回值為ResourceBundle物件

(1)dbutils

JavaBean是一個遵循特定寫法的Java類:有一個無參的建構函式,屬性私有化並且通過public方法訪問和修改屬性

  • dbutils
    • 封裝了JDBC程式碼的工具包,簡化Dao層操作
    • 需要匯入的包:commons-dbutils-1.6.jar
    • 核心類是QueryRunner類
		QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource()); //建立QueryRunner物件,傳參為一個ComboPooledDataSource物件
		String sql = "insert into category values(?,?)";
		qr.update(sql,"c013","商品7"); //執行sql語句
  • QueryRunner
    • 構造方法:new QueryRunner(DataSource ds);
    • update(sql,引數1,引數2):執行SQL語句

(5)連線池

  • 連線池
    • 概念:連線池初始化時存入一些連線,要使用的時候獲取,使用完成之後歸還連線
    • 資料庫建立連線是消耗資源的操作,如果對每個請求向資料庫請求連線效率很低
    • 使用Pool維持連線的思想和執行緒池非常相似
  • 常用連線池
    • DBCP
    • C3P0

(1) DBCP

  • DBCP:Database Connection Pool
    • Apache上的Java連線池
    • 需要匯入的包:commons-dbcp.jar,commons-pool.jar
		Properties prop = new Properties();
		prop.load(new FileInputStream("src/dbcp.properties")); //在dbcp.properties中配置屬性
		DataSource ds = new BasicDataSourceFactory().createDataSource(prop); //生成一個連線池
		Connection conn = ds.getConnection(); //獲取一個連線

(2)C3P0

  • Hibernate、Spring使用c3p0
    • 需要匯入jar包比如:c3p0-0.9.1.2.jar
    • 在src目錄下配置c3p0.properties檔案或者使用c3p0-config.xml配置檔案
  • c3p0.properties檔案:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql:///test //資料庫名稱
c3p0.user=root //使用者名稱
c3p0.password=123456 //密碼
  • 獲取連線的方式
		ComboPooledDataSource ds = new ComboPooledDataSource(); //連線池
		Connection conn = ds.getConnection(); //獲取連線

(6)裝飾者模式

  • 裝飾者模式
    • 23種設計模式之一
    • 不改變原類中的方法
    • 建立一個包裝類Wrapper,包裝原來的類,動態的擴充套件一個物件的功能
    • 包裝類和原類都繼承自同一個類或者實現了同一個介面