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

歡迎訪問 生活随笔!

生活随笔

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

数据库

java篇-数据库MySQL

發布時間:2023/12/20 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java篇-数据库MySQL 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據庫基礎

  • 數據庫作用
    減少內存(掉電就丟失),存儲數據,管理數據,增刪改查,保存數據的容器

  • DB:數據庫
    有組織的數據

  • DBMS:數據庫管理系統
    數據庫是通過DBMS創建和操作容器

  • SQL:structured query language 結構化查詢語言,定義了操作所有關系數據庫得規則
    與數據庫通信的語言,幾乎所有的DBMS都支持SQL

  • 數據庫的特點:
    數據->表->庫
    一個數據庫可以有多個表,表名唯一
    表具有特性,存儲
    表由列組成,也可以稱為字段,所有的表由一個或多個列組成,每一列類似Java中的屬性
    行組成

  • 產品特點
    成本低,開源代碼,免費
    性能高
    簡單

  • DBMS分兩類
    基于文件共享的
    基于客戶機-服務器的DBMS

  • 啟動和停止mysql
    使用cmd(管理員),net stop/start mysql
    mysql自帶的客戶端:不方便
    windows客戶端**P:端口號
    h:主機
    p:密碼
    mysql -h localhost -P 3306 -u root -p
    mysql -h localhost -P 3306 -u root -p1234
    **
    退出:exit/ctrl+c

常見命令

show databases; 展示數據庫

只有test庫可以動
打開庫:use +庫名稱;
查看在哪個庫,select database();
創建表:mysql> create table biaoming(
-> id int,
-> name varchar(20));
查看表的結構:desc biaoming;
查看服務器版本:登錄mysql服務端 select version()
沒有登錄:mysql --version

  • mysql的語法規范:

1 不區分大小寫,但建議關鍵字大寫,表名列名小寫
2 每條命令最好用分號結尾
3 每條命令根據需要,可以進行縮進或者換行
4 注釋
單行:#注釋文字
單行:-- 注釋文字,注意兩個-后面有空格空格
多行:/注釋/

  • SQL分類:
    DDL:操作數據庫、表,關鍵字:create,drop,alter等
    DQL:查尋表中得數據, 關鍵字:select,where
    DML:增刪改表中得數據,關鍵字:insert, delete, updata

    DCL:授權,關鍵字:grant,revoke

- DDL:操作數據庫、表

1、操作數據庫 CRUD

**C: create創建**· 創建數據庫:create database 數據庫名稱;· 創建數據庫判斷是否存在:create database if not exists 數據庫名稱· 創建數據庫并指定字符集名稱:create database 數據庫名稱 character set 字符集名稱;·創建一個數據庫并判斷是否存在,并制定字符集dbg;create database if not exists db4 character set gbk;**R:retrieve:查詢**· 查詢所有數據庫得名稱:show databases;· 查看某個數據庫得字符集:查詢莫格數據庫得創建語句:show create database mysql;**U:update:修改**· 修改數據庫得字符集 alter database 數據庫名稱 character set 字符集名稱**D: delete 刪除**· 刪除數據庫: drop database 數據庫名稱;· 判斷數據庫存在,存在刪除: drop database if exists 數據庫名稱;**使用數據庫**· 查詢當前正在使用得數據庫名稱: select database();· 使用數據庫: use 數據庫名稱;**2、操作表 CRUD** **C: create創建** ·創建:create table 表名(列名1 數據類型1,列名2 數據類型2,...列名n 數據類型n ); 數據庫類型:int :整數,double:小數類型(scroe double(5,2)),date:日期,只包含年月日(yyyy-MM-dd),datetime:日期,包含時分秒,timestamp:時間錯類型:包含時分秒,如果將來不給這個字段賦值,或者為Null,則自動賦值,varchar:字符串類型,如name varchar(20),此處得20表述姓名最大20字符。create table student(id int,name varchar(32),age int,score double(4,1),birthday date,inserttime timestamp); 復制表creat table 新建得表名 like 需要復制表得表名**R:retrieve:查詢**· 查詢某個數據庫中所有得表名稱 show tables;· 查詢表結構: desc 表名;**U:update:修改** ·修改表名稱: alter table 表名 rename to 新得表名 ·修改表得字符集 :alter table 表名稱 character set 字符集名稱; ·添加列:alter table 表名 add 列名 數據類型; ·修改列類型,名稱:alter table 表名 change gender 列名 新列名 新數據類型;或者alter table 表名 modify 列名 新數據類型;; ·刪除列: alter 表名 stu drop 列名; **D: delete 刪除** ·drop table 表名; ·drop table if exists 表名;

客戶端圖形化工具:SQLYOG

DML:增刪改表中得數據

1 添加數據
語法:insert into 表名(列名1,列名2,。。。列名n) values(值1,值2,。。值n);
**注意事項:**列名和值要一一對應
如果表名后不定義列名,則給所有列添加值
除了數字類型,其他類型需要使用引號引起來,單雙都可以
2 刪除數據
語法:delete from 表名 where 條件
注意
如果不加條件,則刪除所有的記錄,一般都屬不建議使用這個
如果要刪除所有的記錄: TRUNCATE TABLE 表名;-- 刪除表,然后建立一個一摸一樣的空表

3 修改數據
語法: update 表名 set 列名1 = 值1,列名 = 值2,。。。 where 條件
注意:
如果不加任何條件,就會修改所有的條件

DQL:查詢表中的記錄
select * from 表名

DQL:查尋表中得數據

  • 查詢語句
    select * from 表名
    語法:
select 列表字段from表名列表where條件列表grop by分組字段having分組之后的條件限定order排序(倒敘:DESC,順序:ASCLIMIT分頁限定

基礎的查詢
多個字段的查詢:select 字段名1,字段名2 from 表名
如果查詢所有字段:可以使用*替代這個列表。
去除 重復的結果:delect distinct 列名 from 表名;
計算列:可以使用四則表達式計算一些列的表達式

條件查詢
where子句后跟條件
運算符

like:

1 排序查詢
語法:

order by 子句order by 排序字段1,排序方式1, 排序字段2,排序方式2....排序方式 :ASC:升序,默認的DESC:降序

注意:當有多個排序條件,只有當前面的值相等時,才會判斷當前的排序語句

2 聚合函數:將一列數據作為整體,進行縱向計算
count:計算個數
一般選擇非空的列:主鍵
count(*)
max:計算最大值
min:計算最小值
sum:求和
avg:平均值

注意:聚合函數的計算,會排除空的值
解決方案:選擇不包含非空的列:主鍵
IFNULL函數
3 分組查詢
語法:group by

- 按照年齡分組, SELECT age ,AVG(score) FROM stu GROUP BY age; -- 分數低于90分不參與分組SELECT age ,AVG(score) FROM stu WHERE score>90 GROUP BY age;-- 分數低于90分不參與分組,且分組人數大于1SELECT age ,AVG(score) FROM stu WHERE score>90 GROUP BY age HAVING COUNT(id)>1;

注意:
分組之后查詢的字段:分組字段和聚合函數
where和having的區別:where在分組之前就進行限定,不滿足則不進行分組。having是在分組之后限定,如果不滿足條件,不會顯示出來
where 后不可以跟聚合函數,having可以跟
4 分頁查詢
語法: limit 開始的索引,每頁查詢的條數;

-- 每一頁顯示三條 SELECT * FROM stu LIMIT 0,3;-- 第一頁 SELECT * FROM stu LIMIT 3,3;-- di二頁-- 公式,開始的索引 = (當前頁碼-1*3

分頁操作是 一個“方言”limit只能在mysql中使用

  • 約束:對表中的數據限定,保證數據的正確性,有效性和完整性
    分類:
    1 主鍵約束:primary key
    、注意:含義:非空且唯一
    一張表只能有一個字段為主鍵
    主鍵就是表中記錄的唯一標識
    、在創建表時,添加主鍵約束
CREATE TABLE student(id INT PRIMARY KEY,-- 給id 添加主鍵約束phone_number VARCHAR(20) );

、刪除主鍵

ALTER TABLE student DROP PRIMARY KEY;

、創建完表后,添加主鍵

ALTER TABLE student MODIFY id INT PRIMARY KEY;

、自動增長:

  • 如果一列數值類型,使用auto_increment可以完成值的自動增長
  • 再創建表時,添加主鍵約束,并且完成自鍵自增長
create table student(id int primary key auto_increment,-- 給id添加主鍵約束name varchar(20) ) ;
  • 刪除自動增長
ALTER TABLE student MODIFY id INT;
  • 添加自動增長
ALTER TABLE student MODIFY id INT AUTO_INCREMENT;

2 非空約束:not null
、在創建表時創建約束

CREATE TABLE STUDENT(id INT,NAME VARCHAR(20) NOT NULL-- name 非空 );

、創建表后添加非空約束

ALTER TABLE student MODIFY NAME VARCHAR(20) NOT NULL;

、刪除非空約束

-- 刪除name的非空約束 ALTER TABLE student MODIFY NAME VARCHAR(20);

3 唯一約束:unique,值不能重復

-- 創建表時添加唯一約束 CREATE TABLE student(id INT,phone_number VARCHAR(20) UNIQUE -- 添加唯一約束 );-- 刪除唯一約束 -- alter table student modify phone_number varchar(20);-- 刪除不了,這是錯誤的 ALTER TABLE student DROP INDEX phone_number;-- 創建表之后添加唯一約束 ALTER TABLE student MODIFY phone_number VARCHAR(20) UNIQUE;

注意唯一限定可以有多個null值

4 外鍵約束:foregin key
、在創建表時,可以添加外鍵
* 語法:

create table 表名(....外鍵列constraint 外鍵名稱 foreign key (外鍵列名稱) references 主表名稱(主表列名稱));

、刪除外鍵:

ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

、創建表后添加外鍵

ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id);

、級聯操作:在修改和刪除主表的主鍵時,同時更新或刪除副表的外鍵值,稱為級聯操作

  • 添加刪除級聯操作
ALTER TABLE 表名 ADD CONSTRAINT 外鍵名稱 FOREIGN KEY (外鍵字段名稱) REFERENCES 主表名稱(主表列名稱) ON UPDATE CASCADE ON DELETE CASCADE;
  • 分類
    級聯更新 ON UPDATE CASCADE
    級聯刪除 ON DELETE CASCADE;

在實際的操作中,會非常謹慎使用

數據庫的設計

  • 多表之間的關系
    、分類
    1 一對一:如人和身份證
    分析一個人只有一個身份證,一個身份證只能對應一個人
    2一對多,多對一:
    如部門和員工
    3 多對多
    如學生和課程
    、實現關系
    1一對多,多對一:
    在 多的一方建立外鍵,指向一的一方的主鍵

2 多對多:
要借助中間表(在后面介紹)中間表至少包含兩個字符,這兩個字符作為第三張表的外鍵,分別指向兩張表的主鍵
聯合主鍵

- 范式:設計數據庫時,所需要遵循的關系

分類:

  • 1 第一范式(1NF):每一列都是不可分割的原子數據項
  • 2 第二范式(2NF): 在1NF的基礎上,非碼屬性必須依賴于候選碼(在1NF基礎上消除非主屬性對主碼的部分函數依賴)
    幾個概念
    函數依賴:A->B,如果可以通過A的值能夠確定B的值,那可以說B依賴于A
    完全函數依賴:A->B,如果A是一個屬性組,則B的值是由A屬性組所有的屬性值所確定
    部分函數依賴:A-》B,如果A是一個屬性組則B的屬性值的確認只需要A屬性組的值
    傳遞函數依賴A->B,B->C,則稱C傳遞函數依賴于C
    碼:如果在一張表中,一個屬性或屬性組,被其他所有屬性所完全依賴,則稱這個屬性(屬性值)為該表的碼
    主屬性:碼所有的屬性
    非主屬性:除對碼屬性組的屬性
  • 3 第三范式(3NF):在2NF的基礎上,任何非主屬性不依賴于其他非主屬性(在2NF基礎上消除傳遞依賴)

數據庫的備份和還原:
1 命令行
備份
mysqldump -u用戶名 -p密碼 >保存的路徑
還原
登錄數據庫,創建數據庫,使用數據庫,執行文件,source

2 圖形化工具

多表查詢:

笛卡爾積:有兩個集合A和B取這兩個集合的組合情況
要完成多表查詢,需要消除無用的數據
分類:
1 內連接查詢:

  • 隱式內鏈接:使用where條件消除無用得
-- 查詢員工表得名稱,性別,部門表得名稱SELECT emp.name,emp.gender,dept.name FROM emp,dept WHERE emp.`dept_id`=dept.`id`; SELECT t1.name,t1.gender,t2.name FROM emp t1,dept t2 WHEREt1.`dept_id`=t2.`id`;
  • 顯示內連接:
    注意事項:
    從那些表中查詢數據
    查詢條件是什么
    查詢哪些字段
語法:select 字段列表 from 表名1 inner join 表名2 on 條件 -- inner可以省略 例如 SELECT *FROM emp INNER JOIN dept ON emp.`dept_id`=dept.`id`; SELECT *FROM emp JOIN dept ON emp.`dept_id`=dept.`id`;

2 外連接查詢

  • 左外鏈接
    查詢的是左表所有數據以及其交集部分
語法 select 查詢的字段列表 from1 left [outer] join2 on 條件-- outer 可以省略
  • 右外鏈接
    查詢的是右表所有數據以及其交集部分
語法 select 查詢的字段列表 from1 right [outer] join2 on 條件-- outer 可以省略

3 子查詢
概念:查詢中嵌套子查詢,稱嵌套的查詢為子查詢
例如

SELECT *FROM emp WHERE emp.`salary`=(SELECT MAX(salary) FROM emp);

子查詢不同情況:
1單行單列:
子查詢可以作為條件,使用運算符操作 > >= < <= =

2多行單列
子查詢可以作為條件,查詢的結果多行單列,使用in

-- cha財務部員工信息 SELECT id FROM dept WHERE NAME='財務部' OR NAME='市場部'; SELECT *FROM emp WHERE dept_id=3 OR dept_id=2;SELECT *FROM emp WHERE dept_id IN (3,2); SELECT *FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME='財務部' OR NAME='市場部');

3多行多列
子查詢可以作為一張虛擬表

SELECT *FROM dept t1,(SELECT *FROM emp WHERE emp.`join_date`>'2011-11-11') t2 WHERE t1.`id`=t2.dept_id;

事務

1. 基本介紹:

  • 基本概念: 如果一個包含多個步驟的業務操作被事務管理,那么這些操作同時成功,要么同時失敗
  • 操作:
    開啟事務 start transaction
    回滾 rollback
    提交 commit
    MySQL中事務默認自動提交:事務提交的兩種方式:自動提交,MySQL是自動提交的,一條DML(真刪改)語句會自動提交一次事務
    手動提交:需要先開啟事務,在提交
    修改事務的默認提交方式:
    SELECT @@autocommit;-- 1 自動提交,0手動提交
    SET @@autocommit=0;-- 修改
    Oracle數據庫是手動提交的,所以要神效要用commit語句
-- 創建數據表 CREATE TABLE account ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(10), balance DOUBLE ); -- 添加數據 INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);SELECT *FROM account; -- zhangsan給李四專賬500-- 開啟事務 START TRANSACTION; -- 張三賬戶減500`account` UPDATE account SET balance=balance-500 WHERE NAME= 'zhangsan';-- 李四賬戶加500UPDATE account SET balance=balance+500 WHERE NAME= 'lisi'; -- 沒有問題,提交事務 COMMIT; ROLLBACK;

2. 事務四大特征(面試)

  • 原子性:是不可分割的最小操作單位,要么同時成功,要么同時失敗
  • 持久性:如果事務一旦提交或回滾,數據庫的數據會持久化的保存更數據
  • 隔離性:多個事務之間相互獨立
  • 一致性:事務操作前后數據總量不變
  • 3. 事務的隔離級別

    多個事務之間相互獨立,如果多個事務操作同一批數據會出現一些問題,設置不同的隔離級別就可以解決這些問題

  • 存在問題:
    • 臟讀:一個事務讀取到另一個事務中沒有提交的數據
    • 不可重復讀:在同一個事務中,兩次讀取的數據不一樣
    • 幻讀:一個事務(DML)數據表中所有記錄,另一個事務添加了一條數據,則第一個事務查詢不到自己的修改
  • 隔離級別:
    • read uncommitted: 讀未提交
      產生的問題:臟讀、不可重讀、幻讀
    • read committed:讀以提交
      產生的問題:不可重讀、幻讀
    • repeatable read:可重復度
      產生的問題:幻讀
    • serializable:串行化
      可以解決所有的問題
      注意隔離級別從小到大安全性越高,但是效率越低
    • 數據庫設置隔離級別
      set global transaction isolation level 級別字符串;
    • 讀取數據庫隔離級別
      select @@tx_isolation;
  • DCL:

    DDL:操作數據庫和表
    DML:增刪改表中的數據
    DQL:查詢表中數據
    DCL:管理用戶和授權

    DBA:數據庫管理員

  • 管理用戶:
  • -- 切換到MySQL數據庫 USE mysql;-- 查詢user 表 SELECT * FROM USER; -- 創建用戶,使用 CREATE USER '用戶名'@'主機名' IDENTIFIED BY '密碼'; CREATE USER 'liyifeng'@'localhostli' IDENTIFIED BY '7777'; -- 刪除 DROP USER '用戶名'@'主機名'; DROP USER 'liyifeng'@'localhostli' ; -- 修改liyifeng的密碼 UPDATE USER SET PASSWORD=PASSWORD('新密碼') WHERE USER='用戶名'; UPDATE USER SET PASSWORD=PASSWORD('anc') WHERE USER='liyifeng'; -- 忘記密碼怎么辦 -- 1 cmd 停止MySQL,需要管理源運行 -- 2 啟動MySQL,使用的是無驗證的方式 mysql -- skip-grant-tables --
  • 權限管理
    • 查詢權限-- 查詢權限 SHOW GRANTS FOR '用戶名'@'主機名';
    • 授予權限-- 授予權限 grant 權限列表 on 數據庫名.表名 to '用戶名'@ '表名'
    • 撤銷權限
  • JDBC

  • 概念:Java database connectivity Java ,Java數據庫連接
    定義了一套操作所有關系型數據庫的規則(接口)
    JDBC本質:其實是官方公司定義的一套操作所有關系型數據庫的規則,即接口。各個數據庫廠商去實現這套接口,提供數據庫驅動JAR包,我們可以使這套接口(JDBC)編程,真正執行的代碼是驅動jar包中的實現類

  • 快速入門:
    步驟:導入驅動jar包: mysql-connector-java-5.1.37-bin.jar,復制這個包到項目某個目錄下,右鍵–build path add jdbc
    注冊驅動:
    獲取數據庫的連接對象 connection
    定義sql 語句
    獲取執行sql 語句的對象 statement
    執行sql,接收返回的結果
    處理結果
    釋放資源

  • // 導入驅動jar包//注冊驅動Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("數據庫驅動加載成功");//獲取數據庫的連接對象Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "1234");//獲取執行sql 語句的對象 statementjava.sql.Statement stat = conn.createStatement();//定義sql 語句String sql = "select * account where id =1";//執行sql,接收返回的結果int count=stat.executeUpdate(sql);//處理結果System.out.println(count);//釋放資源stat.close();conn.close();
  • 各個對象

    • DriverManager:驅動管理對象
      功能:

    • 注冊驅動 :告訴程序使用哪個類驅動。通過查看源碼發現在com.mysql.cj.jdbc.Driver類中存在靜態代碼塊
    • 獲取數據庫連接:
      Connection getConnection (String url, String user, String password) 通過連接字符串,用戶名,密碼來得到數據庫的連接對象
    • Connection :數據庫連接對象

    • Statement createStatement() 創建一條 SQL 語句對象
    • Statement :執行sql語句

    • ResultSet:結果集對象

      如:getInt(參數);
      參數:- int代表列的參數,從1開始 -string 代表列的名稱
      注意:
      使用步驟
      游標向下移動一行,判斷是否有數據,再獲取數據
      抽取JDBC工具類
      目的:簡化
      分析
      注冊驅動
      抽取一個方法獲取連接對接
      不想傳遞參數,還得保證工具類的通用性
      解決方案:配置文件
      jdbc.properties
      url=

      釋放資源

  • while(rs.next()) {//獲取數據int id = rs.getInt(1);String name= rs.getNString(2);double balance= rs.getDouble(3);System.out.println("id:"+id+" name:"+name+" balance"+balance);} package database1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement;public class shili {public static void main(String[] args) {// TODO Auto-generated method stub//Statement sta= null;Connection con=null;try {Class.forName("com.mysql.jdbc.Driver");//String sql="insert into account values(null,'wanngwu',3000)";//insert語句//獲取connection對象con=DriverManager.getConnection("jdbc:mysql://localhost:3306/db3", "root", "1234");//hu執行sql對象 statementsta=con.createStatement();int m=sta.executeUpdate(sql);System.out.println(m);if(m>0) {System.out.println("添加成功");}else {System.out.println("失敗");}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {if(sta!=null) {try {sta.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(con!=null) {try {con.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}
  • PreparedStatement:執行sql對象,后期都會用這個完成增刪改查的所有操作,可以防止sql注入,效率更高

    • sql注入問題:在拼接sql時,有一些特殊關鍵字參與拼接,會造成安全性問題
    • 解決sql注入問題:使用PreparedStatement(STATEMENT的子接口)
    • 預編譯:
    • 步驟:導入驅動jar包: mysql-connector-java-5.1.37-bin.jar,復制這個包到項目某個目錄下,右鍵–build path add jdbc
      注冊驅動
      獲取數據庫的連接對象 connection
      定義sql 語句
      - 注意: sql的參數使用?作為占位符
      獲取執行sql 語句的對象 PreparedStatement,需要傳遞進去Connection。prepareStatement(String sql);
      給?賦值:
      - 方法 setXxx(參數1 ,參數2);
      參數1
      參數2:?的值
      執行sql,接收返回的結果
      處理結果
      釋放資源
  • JDBC控制事務

    • 事務:
    • 操作
    • 使用connection 對象管理事務
  • //優化 package util;import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.net.URL; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties;import com.mysql.jdbc.Connection; import com.mysql.jdbc.Statement;public class JDBCutil {/** 文件的讀取只需要一次* 可以使用靜態代碼塊,隨著類的執行而執行,且只執行一次*/ //private static String url;private static String user;private static String password;private static String driver;static {try {//創建propertie集合類Properties pro= new Properties();//獲取src路徑下的文件方式--》classloader 類加載器ClassLoader classloader = JDBCutil.class.getClassLoader();URL res = classloader.getResource("jdbc.properties");String path= res.getPath();System.out.println(path); //加載wenjian // pro.load(new FileReader("src/jdbc.properties"));pro.load(new FileReader(path));//獲取數據,賦值url=pro.getProperty("url");user=pro.getProperty("user");password=pro.getProperty("password");driver=pro.getProperty("driver");//注冊驅動Class.forName(driver);}catch(IOException | ClassNotFoundException e) {e.printStackTrace();}}public static java.sql.Connection getConnection() throws SQLException {/** * 獲取連接* 返回連接對象*/return DriverManager.getConnection(url,user,password);}//釋放資源public static void close(java.sql.Statement stmt, java.sql.Connection conn) {if(stmt!=null) {try {stmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//釋放資源public static void close(ResultSet rs, java.sql.Statement stmt, java.sql.Connection conn) {// TODO Auto-generated method stubif(stmt!=null) {try {stmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(conn!=null) {try {conn.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(rs!=null) {try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}package database1;import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;import util.JDBCutil;public class JdbcTest1 {public static void main(String[] args) {// TODO Auto-generated method stub//Statement stmt= null;Connection conn=null;ResultSet rs=null;try {String sql="select *from account;";//insert語句 // //獲取connection對象conn=JDBCutil.getConnection();stmt=conn.createStatement();//執行結果rs=stmt.executeQuery(sql);//讓光標在表中移動一行while(rs.next()) {//獲取數據int id = rs.getInt(1);String name= rs.getNString(2);double balance= rs.getDouble(3);System.out.println("id:"+id+" name:"+name+" balance"+balance);}}catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally { // JDBCutil.close(rs,stmt,conn);}}}

    數據庫連接池

  • 數據庫連接池

    • 概念:其實就是一個容器,存放數據庫連接的容器。當系統初始化好后,會在容器中申請一些連接對象,當用戶來訪問數據庫時,從容器里獲取連接對象,用戶訪問完后,會將連接歸還給容器
    • 優點:訪問高效,節約資源
    • 實現
      • 標準接口:DataSource Java.sql包下
        • 方法:getConnection(),如果連接對象Connection是從連接池中獲取的,那么調用Connection.close()方法,則不會再關閉連接了而是歸還連接
      • 一般我們不去實現它,由數據庫廠商去實現
      • C3P0:數據庫連接池技術
      • Druid:數據庫連接池實現技術,由阿里巴巴提供的
    • C3P0:數據庫連接池技術
    • 導入jar包 (兩個) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,

      • 不要忘記導入數據庫驅動jar包
    • 定義配置文件:

      • 名稱: c3p0.properties 或者 c3p0-config.xml
      • 路徑:直接將文件放在src目錄下即可。
    • 創建核心對象 數據庫連接池對象 ComboPooledDataSource

    • 獲取連接: getConnection

  • spring JDBC
    * Spring框架對JDBC的簡單封裝。提供了一個JDBCTemplate對象簡化JDBC的開發

    • 步驟:
    • 導入jar包

    • 創建JdbcTemplate對象。依賴于數據源DataSource

      • JdbcTemplate template = new JdbcTemplate(ds);
    • 調用JdbcTemplate的方法來完成CRUD的操作

      • update():執行DML語句。增、刪、改語句
      • queryForMap():查詢結果將結果集封裝為map集合,將列名作為key,將值作為value 將這條記錄封裝為一個map集合
        • 注意:這個方法查詢的結果集長度只能是1
      • queryForList():查詢結果將結果集封裝為list集合
        • 注意:將每一條記錄封裝為一個Map集合,再將Map集合裝載到List集合中
      • query():查詢結果,將結果封裝為JavaBean對象
        • query的參數:RowMapper
          • 一般我們使用BeanPropertyRowMapper實現類。可以完成數據到JavaBean的自動封裝
          • new BeanPropertyRowMapper<類型>(類型.class)
      • queryForObject:查詢結果,將結果封裝為對象
        • 一般用于聚合函數的查詢

    總結

    以上是生活随笔為你收集整理的java篇-数据库MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。

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