#JDBC#JavaWeb學習筆記(2020/2/24)

一、數(shù)據(jù)庫連接池

數(shù)據(jù)庫連接池是一個容器焕梅,用于存儲多個連接對象伯诬,這樣java程序就不用向系統(tǒng)申請創(chuàng)建新的連接對象,提高了性能企软。
從連接池中獲取的Connection連接對象,使用close方法不是釋放掉饭望,而是返回連接池仗哨。

標準連接池接口:DataSource

方法:

  • 獲取連接:getConnection()
  • 歸還連接:Connection.close()形庭。
    \color{red}{如果連接對象Connection是從連接池中獲取的,那么調(diào)用close()方法厌漂,則不會再關閉連接了萨醒,而是歸還連接。}

常用的連接池技術:
C3P0技術
Druid:阿里巴巴提供的苇倡。

C3P0的使用:

\color{red}{記得導入數(shù)據(jù)庫驅(qū)動包}

  • 1富纸、導包 c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
  • 2旨椒、定義配置文件:
    • 名稱: c3p0.properties 或者 c3p0-config.xml
    • 路徑:直接將文件放在src目錄下即可晓褪。會自動讀取配置文件。
  • 3综慎、創(chuàng)建連接池涣仿,獲取連接對象,歸還連接對象
 public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement psttm = null;
        try {
            DataSource ds = new ComboPooledDataSource();
            conn = ds.getConnection();
            String sql = "INSERT INTO USER VALUE (null,?,?)";
            psttm = conn.prepareStatement(sql);
            psttm.setString(1,"やちよ");
            psttm.setString(2,"111");
            int count = psttm.executeUpdate();
            System.out.println(count);
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            if (psttm != null){
                try {
                    psttm.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null){
                try {
                    conn.close();   //歸還到連接池
                    psttm.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

Druid的使用示惊,與C3P0不同好港,Druid需要自己寫讀配置文件的代碼

  • 1.導包 druid-1.0.9.jar
  • 2.寫配置文件
  • 3.讀取配置文件,創(chuàng)建連接池對象米罚,獲取連接钧汹,歸還連接

我們這里也把這些步驟封裝成一個JDBCUtils工具類

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

//封裝Druid的創(chuàng)建,獲取連接對象录择,釋放連接對象拔莱,以及配置文件的讀取的功能
public class JDBCUtils {
    //讀取配置文件
    static DataSource ds = null;
    static {
        try {
            Properties prop = new Properties();
            prop.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(prop);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 獲取Druid連接池的連接對象
     * @return
     * @throws SQLException
     */
    public static Connection getConnnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 釋放資源
     * @param conn
     * @param sttm
     * @param rs
     */
    public static void close(Connection conn, Statement sttm, ResultSet rs){
        if (rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (sttm!=null){
            try {
                sttm.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (conn != null){
           try {
               conn.close();    //歸還連接
           } catch (SQLException e) {
               e.printStackTrace();
           }
       }
    }

    /**
     * 釋放資源
     * @param conn
     * @param sttm
     */
    public static void close(Connection conn, Statement sttm){
        close(conn,sttm,null);
    }

}

DruidDemo,看代碼變少了好多隘竭!

public class Demo {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement psttm = null;
        try {
           conn = JDBCUtils.getConnnection();
           String sql = "DELETE FROM USER WHERE uid = ?;";
           psttm = conn.prepareStatement(sql);
           psttm.setInt(1,2);
           int count = psttm.executeUpdate();
           System.out.println(count);

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtils.close(conn,psttm);
        }
    }
}

但是查詢操作的結果處理也很麻煩塘秦,于是我們使用Spring JDBC來封裝查詢起來的結果。

Spring JDBC

Spring框架中提供了JDBCTemplate類來簡化JDBC的開發(fā)货裹。

JDBCTemplate的使用方法

  • 1.導入jar包
  • 2.創(chuàng)建jdbctemplate對象嗤形,構造方法的參數(shù)是DataSource對象
  • 3.方法:
    • update():執(zhí)行DML語句。增弧圆、刪赋兵、改語句

    • queryForMap():查詢結果將結果集封裝為map集合,將列名作為key搔预,將值作為value 將這條記錄封裝為一個map集合

      • 注意:這個方法查詢的結果集長度只能是1
    • queryForList():查詢結果將結果集封裝為list集合

      • 注意:將每一條記錄封裝為一個Map集合霹期,再將Map集合裝載到List集合中
    • query():查詢結果,將結果封裝為JavaBean對象

      • query的參數(shù):RowMapper
      • 一般我們使用BeanPropertyRowMapper實現(xiàn)類拯田±欤可以完成數(shù)據(jù)到JavaBean的自動封裝
      • new BeanPropertyRowMapper<類型>(類型.class)
    • queryForObject:查詢結果,將結果封裝為對象
      * 一般用于聚合函數(shù)的查詢

使用實例:

import org.junit.Test;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import utils.JDBCUtils;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 需求:
 1. 修改1號數(shù)據(jù)的 salary 為 10000
 2. 添加一條記錄
 3. 刪除剛才添加的記錄
 4. 查詢id為1的記錄,將其封裝為Map集合
 5. 查詢所有記錄吭产,將其封裝為List
 6. 查詢所有記錄侣监,將其封裝為Emp對象的List集合
 7. 查詢總記錄數(shù)
 */
public class TestDemo {
    JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
    @Test//     1. 修改1號數(shù)據(jù)的 salary 為 10000
    public void test1(){
        String sql = "UPDATE person SET salary = ? WHERE id = ? ";
        template.update(sql,1000,1);
    }
    @Test   //        2. 添加一條記錄
    public void test2(){
        String sql = "INSERT INTO person VALUE (NULL,?,?)";
        template.update(sql,"八千代",6000);
    }
    @Test // 3. 刪除記錄
    public void test3(){
        String sql = "DELETE FROM person WHERE id = ?";
        template.update(sql,3);
    }
   @Test  // 4. 查詢id為4的記錄,將其封裝為Map集合
    public void test4(){
        String sql = "SELECT * FROM person WHERE id = ?";
       Map<String, Object> map = template.queryForMap(sql, 4);
       System.out.println(map); //重寫了toString方法
   }
//    5. 查詢所有記錄臣淤,將其封裝為List
    @Test
   public void test5(){
        String sql = "SELECT * FROM person;";
        List<Map<String, Object>> maps = template.queryForList(sql);
        for (Map<String, Object> map : maps) {
            System.out.println(map.toString());
        }
    }
    @Test
//     6. 查詢所有記錄橄霉,將其封裝為Emp對象的List集合 ps:emp表在db1數(shù)據(jù)庫,記得改配置文件
    public void test6(){
        String sql = "SELECT * FROM emp";
        List<EMP> emps = template.query(sql, new BeanPropertyRowMapper<EMP>(EMP.class));
        for (EMP emp : emps) {
            System.out.println(emp);
        }
    }
    @Test
//     7. 查詢總記錄數(shù)
    public  void test7(){
        String sql = "SELECT COUNT(id) FROM person";
        Long total = template.queryForObject(sql, Long.class);
        System.out.println("一共條"+total+"記錄");
    }

}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邑蒋,一起剝皮案震驚了整個濱河市姓蜂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌医吊,老刑警劉巖钱慢,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卿堂,居然都是意外死亡束莫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門御吞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麦箍,“玉大人漓藕,你說我怎么就攤上這事陶珠。” “怎么了享钞?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵揍诽,是天一觀的道長。 經(jīng)常有香客問我栗竖,道長暑脆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任狐肢,我火速辦了婚禮添吗,結果婚禮上,老公的妹妹穿的比我還像新娘份名。我一直安慰自己碟联,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布僵腺。 她就那樣靜靜地躺著鲤孵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辰如。 梳的紋絲不亂的頭發(fā)上普监,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音,去河邊找鬼凯正。 笑死毙玻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的廊散。 我是一名探鬼主播淆珊,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奸汇!你這毒婦竟也來了施符?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤擂找,失蹤者是張志新(化名)和其女友劉穎戳吝,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贯涎,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡听哭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了塘雳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陆盘。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖败明,靈堂內(nèi)的尸體忽然破棺而出隘马,到底是詐尸還是另有隱情,我是刑警寧澤妻顶,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布酸员,位于F島的核電站,受9級特大地震影響讳嘱,放射性物質(zhì)發(fā)生泄漏幔嗦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一沥潭、第九天 我趴在偏房一處隱蔽的房頂上張望邀泉。 院中可真熱鬧,春花似錦钝鸽、人聲如沸汇恤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屁置。三九已至,卻和暖如春仁连,著一層夾襖步出監(jiān)牢的瞬間蓝角,已是汗流浹背阱穗。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留使鹅,地道東北人揪阶。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像患朱,于是被迫代替她去往敵國和親鲁僚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350