mysql——JDBC

概述

JDBC:java Data Base Connectivity ,java數據庫連接,它是一種用于執行sql語句的java API,為多種關系數據庫提供統一訪問。

其實就是一組用java編寫的類和接口。

JDBC API 提供兩類主要接口:

1)面向開發人員的java.sql程序包,使得Java程序員能夠進行數據庫連接,執行SQL查詢,并得到結果集合。

2)面向底層數據庫廠商的JDBC Drivers

程序員只需要寫一個程序,就可以訪問所有的數據庫。

提供者:sun公司

內容:

集成在java.sql和javax.sql包下,比如:

DriverManager類:管理各種驅動

Connection接口:數據庫連接

Statement接口:發送命令得到結果

等等。。。

?

JDBC訪問數據庫步驟

1.加載數據庫的驅動程序

------------Class.forName(“driverName”);

2.建立數據庫連接? ? ? ? ? ? ?

------------Connection conn=DriverManager.getConnection(String url, String user, String?password )

------------url的格式:"jdbc:<JDBC驅動程序名:端口號>:數據源"

------------例子:"jdbc:mysql://localhost:3306/myuser"

3.執行數據庫操作SQL

------------Statement stmt = conn.createStatement();

------------ResultSet rs = stmt.executeQuery(sql);

4.得到ResultSet進行結果處理

?5.關閉數據庫連接

PreparedStatement

:是Statement的子接口

?PreparedStatement類效率會更高。使用PreparedStatement有很多優勢,總結如下:

防止SQL注入攻擊(使用占位符“?)

提高SQL的執行性能(在執行之前有預處理)

避免使用SQL方言提高JDBC中有關SQL代碼的可讀性。

簡單的寫一個例子熟悉大體流程:

花卉類:

package pojo;
/*** 花卉實體類* @author fan**/
public class Flower {private int id;//編號private String name;//名稱private double price;//價格private String prodution;//產地public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public String getProdution() {return prodution;}public void setProdution(String prodution) {this.prodution = prodution;}
}

對應的mysql:

CREATE TABLE `flower` (`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '編號',`name` varchar(100) NOT NULL COMMENT '名稱',`price` double(10,2) NOT NULL COMMENT '價格',`production` varchar(100) NOT NULL COMMENT '產地',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

我們要JDBC完成對所有花卉的讀取操作:

package dao.impl;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;import com.sun.crypto.provider.RSACipher;
import com.sun.java.util.jar.pack.Package.Class;
import com.sun.org.apache.regexp.internal.recompile;import dao.FlowerDao;
import pojo.Flower;public class FlowerDaoImpl implements FlowerDao{//查詢所有花卉信息@Overridepublic List<Flower> getFlowerInfoDao() {//聲明jdbc變量Connection conn=null;PreparedStatement ps=null;ResultSet rs=null;//創建集合List<Flower> lf=null;try {//加載驅動Class.forName("com.mysql.jdbc.Driver");//創建連接對象conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis", "root", "ytywan1314");//sql命令String sql="select * from flower";//創建sql命令對象ps=conn.prepareStatement(sql);//給占位符賦值//執行rs=ps.executeQuery();lf=new ArrayList<>();//遍歷,封裝到對象中while(rs.next()) {Flower f=new Flower();f.setId(rs.getInt("id"));f.setName(rs.getString("name"));f.setPrice(rs.getDouble("price"));f.setProdution(rs.getString("production"));lf.add(f);}} catch (Exception e) {e.printStackTrace();}finally {//關閉資源rs.close();ps.close();conn.close();}//返回return lf;}}

util

我們發現,增刪改其實都差不多,我們寫的時候都是把其中一個的代碼拿來改一改,并且打開啊關閉啊這些操作也類似,所以我們要把操作們都得封裝到一個類里,需要時直接傳入sql語句還有參數調用即可。

public class BaseDao {private static String driver = "com.mysql.jdbc.Driver";		//數據庫驅動字符串private static String url ="jdbc:mysql://localhost:3306/jeep";private static String user ="sa";		//用戶名private static String password ="";	//密碼protected Connection conn;protected PreparedStatement pstmt;protected java.sql.ResultSet rs;/*** * 獲取數據庫連接對象*/public  Connection getConnection(){Connection conn = null;		//數據庫連接對象//獲取連接并捕捉異常try {Class.forName(driver);conn = DriverManager.getConnection(url,user,password);} catch (Exception e)	{e.printStackTrace();	}return conn;	//返回連接對象}/*** * 關閉數據庫連接*/public void closeAll(Connection conn, Statement stmt, java.sql.ResultSet rs){//若結果集對象不為空,則關閉if (rs !=null){try {rs.close();} catch (Exception e){e.printStackTrace();}}//若Statement對象不為空,則關閉if (stmt !=null){try {stmt.close();} catch (Exception e){e.printStackTrace();}}//若數據庫連接對象不為空,則關閉if (conn !=null){try {conn.close();} catch (Exception e){e.printStackTrace();}}}/*** 增刪改*/public int exceuteUpdate(String sql,Object...prams){int result = 0;//獲取連接conn = this.getConnection();try {pstmt = conn.prepareStatement(sql);for (int i=0;i<prams.length;i++){pstmt.setObject(i+1, prams[i]);}result = pstmt.executeUpdate();} catch (SQLException e){e.printStackTrace();} finally {//關閉資源closeAll(conn,pstmt,rs);}return result;}
}

properties

對于常量信息,如果每次都修改代碼無疑是痛苦的事,所以我們可以提取出相應的配置文件。

比如:dbinfo.properties文件內容:

db.driver=com.mysql.jdbc.Driver
db.connectUrl=jdbc:mysql://127.0.0.1:3306/myqq_db?useUnicode=true&characterEncoding=UTF-8
db.user=root
db.pwd=

?java:

private static Properties dbProps = new Properties();
InputStream is = DBUtil.class.getResourceAsStream("/dbinfo.properties");
dbProps.load(is);
Class.forName(dbProps.getProperty("db.driver"));

?之后我們連接時就可以根據文件的記錄來取值了。

	public static Connection getCon() {try {return DriverManager.getConnection(dbProps.getProperty("db.connectUrl"), dbProps.getProperty("db.user"),dbProps.getProperty("db.pwd"));}catch(Exception e) {e.printStackTrace();return null;}}

JDBC知識積累

?

?

1、數據連接池的工作機制?

考察點:連接池

參考回答:

J2EE 服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量由配置參數決定。當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445373.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數組精選題目三連(6)

題目一&#xff1a;調整有序的arr數組&#xff0c;使得左半部分有序且不重復&#xff0c;不用保證右邊是否有序。 思路&#xff1a; u : 左邊的最后位置&#xff0c;即0---u為答案 i : 從u到右遍歷 當arr[i]和arr[u]不相等時&#…

大數據學習(2-2)- 使用docker安裝配置Hadoop環境

我的思路是這樣&#xff1a;安裝ubuntu系統---->下載docker---->在docker里拉取hadoop鏡像---->在此鏡像里創建三個容器(Master、Slave1、Slave2)---->完成完全分布式 1. 安裝ubuntu系統(無論你是安裝的單系統&#xff0c;還是用虛擬機安裝了ubuntu) 如果想安裝單…

自然語言處理(2)-信息論基礎

自然語言處理-數學基礎概述1.信息論基礎1.1熵1.2 聯合熵和條件熵1.3 相對熵和交叉熵1.4 互信息和雙字耦合度1.5 噪聲信道模型概述 本系列文章計劃總結整理中國科學院大學宗成慶老師《自然語言處理》課程相關知識&#xff0c;參考數目《統計自然語言處理》-第二版&#xff0c;宗…

servlet基礎總結

什么是servlet Servlet&#xff08;Server Applet&#xff09;是Java Servlet的簡稱&#xff0c;是小服務程序或服務連接器&#xff0c;是用Java編寫的服務器端程序&#xff0c;主要功能在于交互式地瀏覽和修改數據&#xff0c;生成動態Web內容. 狹義的Servlet是指Java語言實…

大數據學習(3)- 分布式文件系統HDFS

文章目錄目錄1.分布式文件系統1.1 計算機集群概念1.2 分布式文件系統結構2.HDFS簡介2.1 HDFS設計的目標2.2HDFS的局限性2.3 塊的概念2.4 HDFS主要組件及其功能2.4.1 名稱節點2.4.2 第二名稱節點2.4.3 數據節點3.HDFS體系結構3.1 HDFS體系結構介紹3.2 HDFS體系結構的局限性4.HDF…

Python 圖片轉簡單字符畫

字符畫是一系列字符的組合&#xff0c;我們可以把字符看作是比較大塊的像素&#xff0c;一個字符能表現一種顏色&#xff08;暫且這么理解吧&#xff09;&#xff0c;字符的種類越多&#xff0c;可以表現的顏色也越多&#xff0c;圖片也會更有層次感。 灰度值&#xff1a;指黑…

大數據學習(4)--分布式數據庫HBase

文章目錄目錄1.HBase概述1.1BigTable1.2 HBase簡介1.3 HBase和傳統的關系型數據庫之間的區別2.HBase訪問接口3.HBase數據模型3.1 數據模型概述3.2 數據模型相關概念3.3 數據坐標3.4 概念視圖3.5 物理視圖3.6 面向列的存儲4.HBase的實現原理4.1 HBase功能組件4.2 表和region4.3 …

servlet中的數據存儲

在servlet基礎中&#xff0c;我們&#xff1a; 用以下幾種方式實現數據存儲和共享&#xff1a; 1&#xff09;在客戶端頁面和服務器端程序之間&#xff0c;用request中的getParameter()方法共享數據 2&#xff09;在請求和請求之間&#xff0c;可以用get/setAttribute方法來共…

Linux(2)-tar,find,grep,xargs

常用命令1. 打包壓縮/解包解壓縮 tar1.1 打包 tar -czvf xxx.tar.gz xxx1.2 解壓 tar -xzvf xxx.tar.gz2.文件/目錄搜索2.1 find文件/目錄查找2.2 grep文本匹配3. 復合命令3.1 > 重定向3.2 | 管道.shutdown1. 打包壓縮/解包解壓縮 tar tar和gzip是對黃金搭檔&#xff1a;ta…

Event Recommendation Engine Challenge(基礎版)---代碼

第一步&#xff1a;統計user和event相關信息 #查看train_csv的數據 import pandas as pd df_train pd.read_csv(train.csv) df_train.head()usereventinvitedtimestampinterestednot_interested03044012191877122502012-10-02 15:53:05.75400000:000013044012150228424802012…

servlet——三兄弟的另外兩個:過濾器/監聽器

過濾器 我們寫多了servlet會發現&#xff0c;很多代碼和功能是重復的&#xff0c;比如&#xff1a;解決中文亂碼問題、權限驗證、日志的記錄等&#xff0c;他們的特點是&#xff1a;代碼相同或相似、分散在不同位置、不利于維護。 過濾器就是他們的解決辦法。 過濾器是請求到…

矩陣論-線性變換的特征值與特征變換

線性空間與線性變換綜述1.2 線性變換及其矩陣1.2.3 特征值與特征向量綜述 本系列博文主要總結學習矩陣論的心得筆記&#xff0c;參考數目《矩陣論》–張凱院&#xff1b;整個文章的整理體系參照行書過程。 1.2 線性變換及其矩陣 1.2.3 特征值與特征向量 本節討論如何選擇線…

Python(1)-源起、設計目標、設計哲學、特點

python簡介1. python的起源2. 解釋器3. python 語言的設計目標4. python 語言的設計哲學5. Python 特點人生苦短&#xff0c;我用python–吉多范羅蘇姆&#xff08;Guido van Rossum&#xff09;1. python的起源 1989年吉多在圣誕節想寫一個新的解釋程序作為ABC語言的繼承者。…

kaggle(05)---Event Recommendation Engine Challenge(基礎版)

文章目錄目錄1.比賽相關介紹1.1 比賽介紹1.2 數據集介紹1.3 評價標準介紹1.4 個人理解2. 解決方案2.1 統計用戶和event信息2.2 計算用戶相似度2.3 用戶社交關系信息處理2.4 構建event和event相似度數據2.5 活躍度/event熱度數據2.6 構建特征2.7 模型構建和預測3. 遇到的問題4. …

多校一道KMP+DP的題

難啊&#xff0c;多校當時根本不會做 題目描述 White Cloud has a rectangle carpet of n*m. Grid (i,j) has a color colorA[i][j] and a cost costA[i][j]. White Rabbit will choose a subrectangle B of p*q from A and the color of each grid is colorB[0...p-1][0..…

Python(2)-第一個python程序、執行python程序三種方式

第一個Python 程序1. 第一個Python 程序2. 常用兩Python個版本3. 程序執行的三種方式3.1 解釋器3.2 交互式運行Python程序3.3 IDE&#xff08;集成開發環境&#xff09;-pycharm1. 第一個Python 程序 Python 源程序就是一個特殊格式的文本文件&#xff0c;所以可以采用任意的文…

推薦算法---FM,協同過濾

文章目錄目錄1.FM算法產生背景2.FM算法模型3.FM算法VS其他算法4.推薦算法總結目錄 1.FM算法產生背景 在傳統的線性模型如LR中&#xff0c;每個特征都是獨立的&#xff0c;如果需要考慮特征與特征直接的交互作用&#xff0c;可能需要人工對特征進行交叉組合&#xff1b;非線性…

借助桶排序思想完成的一道題

問題&#xff1a; 數組排序之后的相鄰數的最大差值&#xff1b; 嗯&#xff0c;你可以排序&#xff0c;然后找相鄰的最大差值。 但是你覺得這么簡單我寫他干啥。 最優解&#xff1a;時間復雜度O(N)&#xff0c;空間O(1) 那我們開始說這種方法&#xff1a; 1&#xff09;遍…