日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql——JDBC

發布時間:2023/12/13 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量由配置參數決定。當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。

?

?

總結

以上是生活随笔為你收集整理的mysql——JDBC的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。