日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

使用JDBC連接數(shù)據(jù)庫執(zhí)行sql語句,創(chuàng)建數(shù)據(jù)庫連接池

作者:qq_48475590 更新時(shí)間: 2022-09-26 編程語言
JDBC俗稱java數(shù)據(jù)庫連接(java database connectivity)

我們使用IDEA開發(fā)工具,準(zhǔn)備工作如下:
pom.xml配置mysql:<!--配置mysql驅(qū)動(dòng)-->
               <dependency>
                   <groupId>mysql</groupId>
                   <artifactId>mysql-connector-java</artifactId>
                   <version>8.0.27</version>
               </dependency>
完成以上配置即可在.java文件中進(jìn)行操作了

首先我們應(yīng)該清楚知道java開發(fā)工具連接數(shù)據(jù)庫有什么好處
    1、將數(shù)據(jù)放數(shù)據(jù)庫能更好的保存數(shù)據(jù),數(shù)據(jù)庫里的數(shù)據(jù)也更好操作管理
    2、可以用java語言操縱sql語句去調(diào)用數(shù)據(jù)庫數(shù)據(jù)到程序中
    3、JDBC是有SUM提供的一套API,是使用java連接數(shù)據(jù)的一套標(biāo)準(zhǔn)API接口,各個(gè)數(shù)據(jù)庫提供上都實(shí)現(xiàn)了這一條接口提供了
      連接其提供的數(shù)據(jù)庫產(chǎn)品的實(shí)現(xiàn)類(以jar包形式,又稱為連接該數(shù)據(jù)庫的驅(qū)動(dòng)包)

使用JDBC連接數(shù)據(jù)庫分為以下三步:
        1、加載驅(qū)動(dòng): Class.forName("數(shù)據(jù)庫包名")
        2、連接數(shù)據(jù)庫:DriverManager.getConnection("數(shù)據(jù)庫url(每種數(shù)據(jù)庫有指定格式)",用戶名,密碼);
        3、獲取執(zhí)行對(duì)象:有兩種方式,一種是預(yù)編譯執(zhí)行對(duì)象prepareStatement(sql語句);還有一種是直接編譯創(chuàng)建createStatement(sql語句);

前兩步是固定操作(隨著數(shù)據(jù)庫的改變而改變),我們重點(diǎn)學(xué)習(xí)第3步驟
    首先我們介紹執(zhí)行sql語句的方法有:
                execute是執(zhí)行DDL(create、drop、alter)語句;
                executeUpdate是執(zhí)行DML(delete、update、insert)語句; 返回int數(shù)據(jù),插入N條數(shù)據(jù)成功返回值就返回成功值N
                executeQuery是執(zhí)行DQL(select)語句;返回結(jié)果集ResultSet,可以查詢表中g(shù)et對(duì)應(yīng)字段信息。
    1、createStatement用法:
                Statement st = Connection連接對(duì)象.createStatement();
                int num = st.executeUpdate(sql語句);
                ResultSet rs = st.executeQuery(sql語句);
                while(ResultSet返回值結(jié)果集.next()){
                    字段類型 name = get[字段類型](字段名/字段位置);
                    ...
                };

     執(zhí)行方法:① 創(chuàng)建Statement執(zhí)行對(duì)象。
              ② 執(zhí)行Statement執(zhí)行對(duì)象方法execute(傳入拼接好的sql語句)。
              ③ 多次執(zhí)行同一條語句每次執(zhí)行的是將整個(gè)執(zhí)行對(duì)象發(fā)送給數(shù)據(jù)庫服務(wù)器(耗性能)
              ④ 判斷返回值要是碰到DQL語句executeQuery的話返回ResultSet結(jié)果集還需要進(jìn)行操作。
              ⑤ ResultSet結(jié)果集拿取數(shù)據(jù)首先要獲取下一個(gè)行next()(這是mysql的操作,一次只能拿取一行信息,數(shù)據(jù)庫不同拿取操作和內(nèi)容也不徑相同)。
              ⑥ 可以通過next()拿取一行數(shù)據(jù)來獲取字段信息。當(dāng)然我們可加個(gè)while循環(huán)判斷就可以拿取查詢的全部行信息了。
              ⑦ 在next拿到數(shù)據(jù)行之后,使用get字段類型("字段名"/字段位置)來獲取當(dāng)前一行中某個(gè)字段(相當(dāng)于指定行指定列找到單元格一樣),不同的字段需要不同的類型接收。


    2、prepareStatement用法:
                String sql = "sql語句 可變參數(shù)用?表示[不能代表字段或表來使用,只能做一  ????????????????????????????????個(gè)參數(shù)變量]"
                PreparedStatement ps = Connection連接對(duì)象.prepareStatement(sql);
                ps.set[字段類型](第幾個(gè)?號(hào)位置,傳入字段數(shù)據(jù));
                ...
                int返回值 = ps.execteUpdate();

                ResultSet返回值結(jié)果集 = ps.execteQuery();
                while(ResultSet返回值結(jié)果集.next()){
                    字段類型 name = get[字段類型](字段名/字段位置);
                    ...
                };
     執(zhí)行方式:① 先將帶參(占位符?)的sql語句prepareStatement預(yù)處理(同條sql語句只執(zhí)行一次,在不斷變化的是參數(shù)值)
              ② 將參數(shù)用set方式給?占位符傳遞,可以不同的位置多次傳遞,傳遞對(duì)象是判斷條件中的字面量或者字段值,但是不能將占位符看做表來使用。
              ③ 用不同的execte執(zhí)行方法執(zhí)行不同的sql語句,預(yù)編譯時(shí)傳了sql語句,且返回值也不同。
              ④ 判斷返回值要是碰到DQL語句executeQuery的話返回ResultSet結(jié)果集還需要進(jìn)行操作。
              ⑤ ResultSet結(jié)果集拿取數(shù)據(jù)首先要獲取下一個(gè)行next()(這是mysql的操作,一次只能拿取一行信息,數(shù)據(jù)庫不同拿取操作和內(nèi)容也不徑相同)。
              ⑥ 可以通過next()拿取一行數(shù)據(jù)來獲取字段信息。當(dāng)然我們可加個(gè)while循環(huán)判斷就可以拿取查詢的全部行信息了。
              ⑦ 在next拿到數(shù)據(jù)行之后,使用get字段類型("字段名"/字段位置)來獲取當(dāng)前一行中某個(gè)字段(相當(dāng)于指定行指定列找到單元格一樣),不同的字段需要不同的類型接收。

    如此我們可以兩者區(qū)分得出以下結(jié)論:
            1、PreparedStatement的sql語句可通過?占位來傳參。Statement是通過字符串拼接的方式傳遞參數(shù)。
                兩者最大的區(qū)別是什么呢?
            2、?占位傳參的話是需要指定?號(hào)位置和傳入對(duì)應(yīng)參數(shù)指定字段類型的。而字符串拼接是連sql句都可以傳入進(jìn)去(易被sql注入風(fēng)險(xiǎn))直接更改執(zhí)行語句。
            3、在執(zhí)行性能上,如果執(zhí)行N條相同的sql語句時(shí)Statement(傳n條執(zhí)行語句)執(zhí)行效率是比不上PreparedStatement(傳n條語句的每個(gè)占位符實(shí)參)的。
            4、多次執(zhí)行同一條[傳參]sql語句的話不建議使用Statement,無論從語法可讀性、安全考慮還是性能考慮都應(yīng)該使用預(yù)編譯執(zhí)行方式PreparedStatement。




數(shù)據(jù)庫連接池
pom配置:<!-- 數(shù)據(jù)庫連接池 -->
          <dependency>
              <groupId>com.alibaba</groupId>
              <artifactId>druid</artifactId>
              <version>1.1.21</version>
          </dependency>

Druid是阿里提供的數(shù)據(jù)庫連接池。
連接池的主要作用:
    1、控制連接數(shù)量
    2、重用連接
常用操作語法: DruidDataSource dds = new DruidDataSource(); //設(shè)置連接池
            //設(shè)置連接池?cái)?shù)據(jù)庫的基本信息:
            dds = new DruidDataSource(); //實(shí)例化連接池對(duì)象
            dds.setUrl(數(shù)據(jù)庫Url地址(不同的數(shù)據(jù)庫有不同的地址));
            dds.setUsername(數(shù)據(jù)庫用戶名);
            dds.setPassword(數(shù)據(jù)庫密碼);
            dds.setInitialSize(初始線程數(shù));
            dds.setMaxActive(最大連接數(shù)(當(dāng)初始線程數(shù)不夠用時(shí)才使用));
          //就可以開始連接數(shù)據(jù)庫了
          Connection connection = dds.getConnection(可以設(shè)置連接超時(shí)間隔時(shí)間);

原文鏈接:https://blog.csdn.net/qq_48475590/article/details/127041394

欄目分類
最近更新