網(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
相關(guān)推薦
- 2022-03-27 C++引用和指針的區(qū)別你知道嗎_C 語言
- 2022-05-12 databinding 與 RecyclerView.Adapter
- 2022-10-30 Android中二維碼的掃描和生成(使用zxing庫)_Android
- 2022-03-20 .NET?6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)DELETE請(qǐng)求與HTTP請(qǐng)求冪等性_實(shí)用技巧
- 2022-09-08 詳解Dijkstra算法原理及其C++實(shí)現(xiàn)_C 語言
- 2022-08-25 Python進(jìn)階Matplotlib庫圖繪制_python
- 2022-11-12 Python?Multinomial?Naive?Bayes多項(xiàng)貝葉斯模型實(shí)現(xiàn)原理介紹_python
- 2022-04-11 關(guān)于指令重排現(xiàn)象的兩個(gè)階段詳解_相關(guān)技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支