一、cmd操作數(shù)據(jù)庫
1.創(chuàng)建一個庫
create database 庫名
create database 庫名 character set 編碼(create database web character set gbk)
查看編碼 show create database web橄妆;
2.刪除一個庫
drop database 庫名
3.使用庫 use 庫名
4.查看當前正在操作的庫 select database()涂滴;
二悦屏、對數(shù)據(jù)庫表的操作
1.創(chuàng)建一張表
create table 表名(
字段名 類型(長度) [約束],
字段名 類型(長度) [約束],
字段名 類型(長度) [約束]
);
2.查看數(shù)據(jù)庫表show tables;
查看表的結構desc 表名
3.刪除一張表drop table 表名
4.修改表
4.1 添加一列
alter table 表名 add 字段名 類型(長度) [約束]
4.2 修改列的類型(長度敦冬、約束)
alter table 表名 modify 要修改的字段名 類型(長度) [約束
4.3 修改列的列名
alter table 表名 change 舊列名 新列名 類型(長度) [約束]
4.4 刪除表的列
alter table 表名 drop 列名
4.5 修改表名
rename table 表名 to 新表名
4.6 修改表的字符集
alter table 表名 character set 編碼
三没陡、對數(shù)據(jù)庫表記錄進行操作(修改)
1.插入記錄
insert into 表名(列名1,列名2,列名3……) values(值1,值2,值3……)
insert into 表名 values(值1,值2,值3……)
1.1 插入數(shù)據(jù)中文亂碼問題解決辦法
方式一:【不建議泡仗!】
直接修改數(shù)據(jù)庫安裝目錄里面的my.ini文件的第57行
dafault-character-set=utf8
方式二:
set names gbk;
2.1 不帶條件的
update 表名 set 字段名=值, 字段名=值, 字段名=值……(它會將該列的所有記錄都更改)
2.2 帶條件的
update 表名 set字段名=值, 字段名=值, 字段名=值…… where 條件
3.刪除表記錄
3.1 帶條件的
delete from 表名 where 條件
注意梦染,刪除后赡麦,uid不會重置!
3.2.不帶條件的
刪除操作
delete from 表名;
3.3 面試題
說說delete與truncate的區(qū)別帕识?
delete刪除的時候是一條一條的刪除記錄隧甚,它配合事務,可以將刪除的數(shù)據(jù)找回渡冻。
truncate刪除戚扳,它是將整個表摧毀,然后再創(chuàng)建一張一模一樣的表族吻。它刪除的數(shù)據(jù)無法找回帽借。
注意:delete刪除,uid不會重置超歌!而使用truncate操作砍艾,uid會重置[因為它刪除了表結構,然后再創(chuàng)建一張一模一樣的表巍举,所以再次插入數(shù)據(jù)的數(shù)據(jù)的時候從1開始脆荷。]
4.查詢操作
語法:
select [distinct] *| 列名,列名 from 表名 [where條件]
4.1 簡單查詢
1.查詢所有商品
select * from product懊悯;
- 查詢商品名和商品價格
select pname,price from product;
3.查詢所有商品信息使用表別名
select * from product as[可以省略] p;
4.查詢商品名蜓谋,使用列別名
select pname as[可以省略] p from product
5.去掉重復值(按照價格)
select distinct(price) from product;
6.將所有的商品的價格+10進行顯示
select pname,price+10 from product;
4.2 條件查詢
1.查詢商品名稱為"左慈"的商品信息
select * from product where pname=“左慈”;
2.查詢價格>60元的所有商品信息
select * from product where price>60;
3.查詢商品名稱含有"士"字的商品信息
select * from product where pname like '%士%';
4.查詢商品id在(3,6,9)范圍內的所有商品信息
select * from product where pid in(3,6,9);
5.查詢商品名稱含有"士"字并且id為6的商品信息
select * from product where pname like '%士%' pid=6;
6.查詢id為2或者6的商品信息
select * from product where pid=2 or pid=6;
4.3 排序
1.查詢所有的商品炭分,按價格進行排序(升序桃焕、降序)
select * from product order by price asc;(升序)
select * from product order by price desc捧毛;(降序)
2.查詢名稱有"士"的商品信息并且按照價格降序排序
select * from product where pname like '%士%' order by price desc观堂;
4.4 聚合函數(shù)
1.獲得所有商品的價格的總和
select sum(price) from product ;
2.獲得所有商品的平均價格
select avg(price) from product ;
3.獲得所有商品的個數(shù)
select count(*)from product ;
4.5 分組操作
1.添加分類id (alter table product add cid varchar(32);)
2.初始化數(shù)據(jù)
update product set cid='1';
update product set cid='2' where pid in (5,6,7);
1.根據(jù)cid字段分組,分組后統(tǒng)計商品的個數(shù)呀忧。
select cid ,count(*) from product group by cid;
2.根據(jù)cid分組师痕,分組統(tǒng)計每組商品的平均價格,并且平均價格大于20000元而账。
select cid,avg(price) from product group by cid having avg(price)>20000;
4.6 查詢總結
select 一般在的后面的內容都是要查詢的字段
from 要查詢到表
where
group by
having 分組后帶有條件只能使用having
order by 它必須放到最后面
三胰坟、JDBC
- JDBC(Java DataBase Connectivity)就是Java數(shù)據(jù)庫連接,是用Java語言來操作數(shù)據(jù)庫福扬。原來操作數(shù)據(jù)庫是在控制臺使用SQL語句來操作數(shù)據(jù)庫腕铸,JDBC是用Java語言向數(shù)據(jù)庫發(fā)送SQL語句。
2.由SUN提供一套訪問數(shù)據(jù)庫的規(guī)范(就是一組接口)铛碑,并提供連接數(shù)據(jù)庫的協(xié)議標準狠裹,然后各個數(shù)據(jù)庫廠商會遵循SUN的規(guī)范提供一套訪問自己公司的數(shù)據(jù)庫服務器的API出現(xiàn)。SUN提供的規(guī)范命名為JDBC汽烦,而各個廠商提供的涛菠,遵循了JDBC規(guī)范的,可以訪問自己數(shù)據(jù)庫的API被稱之為驅動撇吞!
JDBC是接口俗冻,而JDBC驅動才是接口的實現(xiàn),沒有驅動無法完成數(shù)據(jù)庫連接牍颈!每個數(shù)據(jù)庫廠商都有自己的驅動迄薄,用來連接自己公司的數(shù)據(jù)庫。
當然還有第三方公司專門為某一數(shù)據(jù)庫提供驅動煮岁,這樣的驅動往往不是開源免費的讥蔽!
3.JDBC中的核心類有:DriverManager、Connection画机、Statement冶伞,和ResultSet!
DriverManger(驅動管理器)的作用有兩個:
注冊驅動:這可以讓JDBC知道要使用的是哪個驅動步氏;
獲取Connection:如果可以獲取到Connection响禽,那么說明已經(jīng)與數(shù)據(jù)庫連接上了。
?Connection最為重要的一個方法就是用來獲取Statement對象荚醒;
?Statement是用來向數(shù)據(jù)庫發(fā)送SQL語句的芋类,這樣數(shù)據(jù)庫就會執(zhí)行發(fā)送過來的SQL語句
?void executeUpdate(String sql):執(zhí)行更新操作(insert、update界阁、delete等)梗肝;
?ResultSet executeQuery(String sql):執(zhí)行查詢操作,數(shù)據(jù)庫在執(zhí)行查詢后會把查詢結果铺董,查詢結果就是ResultSet巫击;
ResultSet對象表示查詢結果集,只有在執(zhí)行查詢操作后才會有結果集的產生精续。結果集是一個二維的表格坝锰,有行有列。操作結果集要學習移動ResultSet內部的“行光標”重付,以及獲取當前行上的每一列上的數(shù)據(jù):
?boolean next():使“行光標”移動到下一行顷级,并返回移動后的行是否存在;
?XXX getXXX(int col):獲取當前行指定列上的值确垫,參數(shù)就是列數(shù)弓颈,列數(shù)從1開始帽芽,而不是0。
4.2 注冊驅動
看清楚了翔冀,注冊驅動就只有一句話:Class.forName(“com.mysql.jdbc.Driver”)导街,下面的內容都是對這句代碼的解釋。今后我們的代碼中纤子,與注冊驅動相關的代碼只有這一句搬瑰。
DriverManager類的registerDriver()方法的參數(shù)是java.sql.Driver,但java.sql.Driver是一個接口控硼,實現(xiàn)類由mysql驅動來提供泽论,mysql驅動中的java.sql.Driver接口的實現(xiàn)類為com.mysql.jdbc.Driver!那么注冊驅動的代碼如下:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
上面代碼雖然可以注冊驅動卡乾,但是出現(xiàn)硬編碼(代碼依賴mysql驅動jar包)翼悴,如果將來想連接Oracle數(shù)據(jù)庫,那么必須要修改代碼的幔妨。并且其實這種注冊驅動的方式是注冊了兩次驅動抄瓦!
JDBC中規(guī)定,驅動類在被加載時陶冷,需要自己“主動”把自己注冊到DriverManger中
com.mysql.jdbc.
Driver類中的static塊會創(chuàng)建本類對象钙姊,并注冊到DriverManager中。這說明只要去加載com.mysql.jdbc.Driver類埂伦,那么就會執(zhí)行這個static塊煞额,從而也就會把com.mysql.jdbc.Driver注冊到DriverManager中,所以可以把注冊驅動類的代碼修改為加載驅動類沾谜。
Class.forName(“com.mysql.jdbc.Driver”);
4.3 獲取連接
DriverManager.getConnection(url,username,password)膊毁,
mysql的url:
jdbc:mysql://localhost:3306/mydb1
一.jdbc,這是固定的基跑;
二.數(shù)據(jù)庫名稱婚温,mysql數(shù)據(jù)庫;
三數(shù)據(jù)庫廠商規(guī)定的媳否,我們需要了解每個數(shù)據(jù)庫廠商的要求栅螟,mysql的第三部分分別由數(shù)據(jù)庫服務器的IP地址(localhost)、端口號(3306)篱竭,以及DATABASE名稱(mydb1)組成力图。
還可以在url中提供參數(shù):
jdbc:mysql://localhost:3306/web08?useUnicode=true&characterEncoding=UTF8
useUnicode參數(shù)指定這個連接數(shù)據(jù)庫的過程中,使用的字節(jié)集是Unicode字節(jié)集掺逼;
characherEncoding參數(shù)指定穿上連接數(shù)據(jù)庫的過程中吃媒,使用的字節(jié)集編碼為UTF-8編碼。請注意,mysql中指定UTF-8編碼是給出的是UTF8赘那,而不是UTF-8刑桑。
4.5 發(fā)送SQL查詢語句
String sql = “select * from user”;
ResultSet rs = stmt.executeQuery(sql);
請注意,執(zhí)行查詢使用的不是executeUpdate()方法募舟,而是executeQuery()方法祠斧。executeQuery()方法返回的是ResultSet,ResultSet封裝了查詢結果胃珍,我們稱之為結果集梁肿。
4.6 讀取結果集中的數(shù)據(jù)
ResultSet就是一張二維的表格蜓陌,它內部有一個“行光標”觅彰,光標默認的位置在“第一行上方”,可以調用rs對象的next()方法把“行光標”向下移動一行钮热,當?shù)谝淮握{用next()方法時填抬,“行光標”就到了第一行記錄的位置,這時就可以使用ResultSet提供的getXXX(int col)方法來獲取指定列的數(shù)據(jù)了:
rs.next();//光標移動到第一行
rs.getInt(1);//獲取第一行第一列的數(shù)據(jù)
當使用rs.getInt(1)方法時隧期,必須可以肯定第1列的數(shù)據(jù)類型就是int類型飒责,如果你不能肯定,那么最好使用rs.getObject(1)仆潮。在ResultSet類中提供了一系列的getXXX()方法宏蛉,比較常用的方法有:
Object getObject(int col)
String getString(int col)
int getInt(int col)
double getDouble(int col)
4.7 關閉
與IO流一樣,使用后的東西都需要關閉性置!關閉的順序是先得到的后關閉拾并,后得到的先關閉。
rs.close();
stmt.close();
con.close();
4.8 完成查詢操作代碼
public static Connection getConnection() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/web08";
return DriverManager.getConnection(url, "root", "root");
}
@Test
public void query() throws Exception {
Connection con = getConnection();
Statement stmt = con.createStatement();
String sql = "select * from user";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
String username = rs.getString(1);
String password = rs.getString(2);
System.out.println(username + ", " + password);
}
}
4.9 規(guī)范化代碼
所謂規(guī)范化代碼就是無論是否出現(xiàn)異常鹏浅,都要關閉ResultSet嗅义、Statement,以及Connection
@Test
public void query() {
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
try {
con = getConnection();
stmt = con.createStatement();
String sql = "select * from user";
rs = stmt.executeQuery(sql);
while(rs.next()) {
String username = rs.getString(1);
String password = rs.getString(2);
System.out.println(username + ", " + password);
}
} catch(Exception e) {
throw new RuntimeException(e);
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch(SQLException e) {}
}
可能出現(xiàn)的兩種異常
ClassNotFoundException
沒有給出mysql的jar包隐砸;
把類名稱打錯了之碗,查看類名是不是com.mysql.jdbc.Driver。
4 Statement
Statement最為重要的方法是:
int executeUpdate(String sql):執(zhí)行更新操作季希,即執(zhí)行insert褪那、update、delete語句式塌,其實這個方法也可以執(zhí)行create table武通、alter table,以及drop table等語句珊搀,但我們很少會使用JDBC來執(zhí)行這些語句冶忱;
ResultSet executeQuery(String sql):執(zhí)行查詢操作,執(zhí)行查詢操作會返回ResultSet,即結果集囚枪。
boolean execute()
Statement還有一個boolean execute()方法派诬,這個方法可以用來執(zhí)行增、刪链沼、改默赂、查所有SQL語句。該方法返回的是boolean類型括勺,表示SQL語句是否執(zhí)行成功缆八。
如果使用execute()方法執(zhí)行的是更新語句,那么還要調用int getUpdateCount()來獲取insert疾捍、update奈辰、delete語句所影響的行數(shù)。
- PreparedStatement防止注入攻擊
過濾用戶輸入的數(shù)據(jù)中是否包含非法字符乱豆;
分步校驗奖恰!先使用用戶名來查詢用戶,如果查找到了宛裕,再比較密碼瑟啃;
PreparedStatement叫預編譯聲明
String sql = “select * from tab_student where s_number=?”;
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, “S_1001”);
ResultSet rs = pstmt.executeQuery();
rs.close();
pstmt.clearParameters();
pstmt.setString(1, “S_1002”);
rs = pstmt.executeQuery();
PreparedStatement對象獨有的executeQuery()方法是沒有參數(shù)的