回顧:java
sqlmysql
sql分類:spring
DDL:sql
對象:數據庫和表數據庫
關鍵詞:create alter drop truncateapache
建立數據庫:create database day06;api
刪除數據庫: drop database day06;數組
建立表:create table user(安全
id int primark key auto_increment,服務器
username varchar(20)
);
修改表:
alter table user rename to user10;
alter table user add password varchar(20);
alter table user change password pwd varchar(20);
alter table user modify pwd int;
alter table user drop pwd;
刪除表:
drop table user;
經常使用的命令:
use day06;
show tables;
desc user;
show create table user;
DML:
對象:記錄(行)
關鍵詞:insert update delete
插入:
insert into user values(字段值1,字段值2,...);-- 全部的字段
insert into user(字段1,字段2....) values(字段值1,字段值2);-- 插入指定的字段
更新:
update user set 字段=字段值1,字段2=字段值2 where 條件;
刪除:
delete from user where 條件;
擴展:
之後開發中不多使用delete,數據無價,刪除有物理和邏輯(經常使用),
邏輯刪除通常會在表中添加一個字段(isdel:若值爲1,表明刪除了;若爲0表明沒有刪除),
此時的刪除操做變成了更新操做.
DQL:
select ... from 表名 where 條件 group by 分組字段 having 條件 order by 排序字段;
執行順序:
1.肯定數據來自那張表 from
2.是否須要篩選 where
3.是否須要分組 group by
4.分組後是否須要篩選 having
5.是否須要排序 order by
6.肯定顯示那些數據. select
DCL:用戶 權限 事務
////////////////////////
auto_increment 自增
truncate 幹掉表,從新建立 和delete的區別
數據類型:
int 和 varchar(size):可變長度
date time datetime timestamp
////////////////////////////////////
多表的操做:
表與表之間的關係:
一對多:
在多表的一方添加一個外鍵,外鍵的名稱通常是主表名稱_id,外鍵的類型和主表的主鍵的類型保持一致
爲了保證數據的有效性和完整性,
須要在多表上添加外鍵約束
格式:
alter table 多表 add [constraint [外鍵的名稱]] foreign key(外鍵名稱) references 主表名稱(主鍵);
多對多:
添加一張中間表,存放兩張表的主鍵,就能夠將多對多拆分紅兩個一對多了
爲了保證數據的有效性和完整性,
須要在中間表添加兩個外鍵約束
一對一:(瞭解)
1.兩個實體合二爲一(字段比較少)
2.將一張表的主鍵添加外鍵約束便可
/////////////////////////////
多表的查詢:
內鏈接:
顯式:
select a.*,b.* from a join b on 條件;
隱式:
select a.*,b.* from a,b where 條件;
外鏈接:
左外鏈接:
select a.*,b.* from a left join b on 條件;
以a爲主,展現全部數據,根據條件關聯查詢b表,知足條件則展現,不知足的話以null顯示
子查詢::
一個查詢依賴於另外一個查詢.
//////////////////////////////////////
案例1-經過jdbc完成單表的curd操做:
需求:
對分類表完成操做.
技術分析:
jdbc
///////////////////////
jdbc:
java操做數據庫.jdbc是oracle公司指定的一套規範(一套接口)
驅動:jdbc的實現類.由數據庫廠商提供.
咱們就能夠經過一套規範操做不一樣的數據庫了(多態)
jdbc做用:
鏈接數據庫
發送sql語句
處理結果
jdbc操做步驟:★
1.數據庫和表
2.建立一個項目
3.導入驅動jar包
4.編碼:
註冊驅動
獲取鏈接
編寫sql
建立預編譯的語句執行者
設置參數
執行sql
處理結果
釋放資源
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBConnection
{
public static void main(String[] args)
{
String driver = "com.mysql.jdbc.Driver";
//localhost指本機,也能夠用本地ip地址代替,3306爲MySQL數據庫的默認端口號,「user」爲要鏈接的數據庫名
String url = "jdbc:mysql://localhost:3306/user";
//填入數據庫的用戶名跟密碼
String username = "test";
String password = "test";
String sql = "select * from user";//編寫要執行的sql語句,此處爲從user表中查詢全部用戶的信息
try
{
Class.forName(driver);//加載驅動程序,此處運用隱式註冊驅動程序的方法
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
try
{
Connection con = DriverManager.getConnection(url,username,password);//建立鏈接對象
Statement st = con.createStatement();//建立sql執行對象
ResultSet rs = st.executeQuery(sql);//執行sql語句並返回結果集
while(rs.next())//對結果集進行遍歷輸出
{
System.out.println("username: "+rs.getString(1));//經過列的標號來得到數據
System.out.println("useradd: "+rs.getString("useradd"));//經過列名來得到數據
System.out.println("userage: "+rs.getInt("userage"));
}
//關閉相關的對象 從最外層 開始關閉
if(rs != null)
{
try
{
rs.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
if(st != null)
{
try
{
st.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
if(con !=null)
{
try
{
con.close();
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
catch(SQLException e)
{
e.printStackTrace();
}
}
}
初始化數據庫和表:
CREATE DATABASE day07;
USE day07;
create table category(
cid varchar(20) primary key,
cname varchar(20)
);
insert into category values('c001','電器');
insert into category values('c002','服飾');
insert into category values('c003','化妝品');
insert into category values('c004','書籍');
IDE打開以後
1.修改字符集 utf-8
2.新建 java項目
3.使用的jdk爲本身的jdk 不用使用內置
使用junit單元測試
要求:
1.方法是public void xxx(){}
2.在方法上添加 @Test
3.在@Test 按下 ctrl+1(快速鎖定錯誤)
4.在方法上右鍵 run as -->junit 就能夠執行方法了.
jdbc-api詳解:
全部的包 都是 java.sql 或者 javax.sql
DriverManager:管理了一組jdbc的操做 類
經常使用方法:
瞭解:註冊驅動
static void registerDriver(Driver driver) :
經過查看 com.mysql.jdbc.Driver的源碼 有以下代碼
static {
try {
java.sql.DriverManager.registerDriver(new Driver());//這段代碼咱們已經寫過
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
驅動註冊了兩次.咱們只須要將靜態代碼塊執行一次,類被加載到內存中會執行靜態代碼塊,而且只執行一次.
如今只須要將類加載到內存中便可:
方式1:
★Class.forName("全限定名");//包名+類名 com.mysql.jdbc.Driver
方式2:
類名.class;
方式3:
對象.getClass();
掌握:獲取鏈接
static Connection getConnection(String url, String user, String password)
參數1:告訴咱們鏈接什麼類型的數據庫及鏈接那個數據庫
協議:數據庫類型:子協議 參數
mysql: jdbc:mysql://localhost:3306/數據庫名稱
oracle: jdbc:oracle:thin@localhost:1521@實例
參數2:帳戶名 root
參數3:密碼
(瞭解)Driver:java.sql 接口 驅動
Connection:鏈接 接口
經常使用方法:
獲取語句執行者:
(瞭解)Statement createStatement() :獲取普通的語句執行者 會出現sql注入問題
。
攻擊
當應用程序使用輸入內容來構造動態sql語句以訪問數據庫時,會發生sql注入攻擊。若是代碼使用存儲過程,而這些存儲過程做爲包含未篩選的用戶輸入的字符串來傳遞,也會發生sql注入。sql注入可能致使攻擊者使用應用程序登錄在數據庫中執行命令。相關的SQL注入能夠經過測試工具pangolin進行。若是應用程序使用特權太高的賬戶鏈接到數據庫,這種問題會變得很嚴重。在某些表單中,用戶輸入的內容直接用來構造動態sql命令,或者做爲存儲過程的輸入參數,這些表單特別容易受到sql注入的攻擊。而許多網站程序在編寫時,沒有對用戶輸入的合法性進行判斷或者程序中自己的變量處理不當,使應用程序存在安全隱患。這樣,用戶就能夠提交一段數據庫查詢的代碼,根據程序返回的結果,得到一些敏感的信息或者控制整個服務器,因而sql注入就發生了。
★PreparedStatement prepareStatement(String sql) :獲取預編譯語句執行者
(瞭解)CallableStatement prepareCall(String sql):獲取調用存儲過程的語句執行者
瞭解:
setAutoCommit(false) :手動開啓事務
commit():提交事務
rollback():事務回滾
Statement:語句執行者 接口
PreparedStatement:預編譯語句執行者 接口
經常使用方法:
設置參數:
setXxx(int 第幾個問號,Object 實際參數);
常見的方法:
setInt
setString
setObject
執行sql:
ResultSet executeQuery() :執行 r 語句 返回值:結果集
int executeUpdate() :執行cud 語句 返回值:影響的行數
ResultSet:結果集 接口
執行查詢語句以後返回的結果
經常使用方法:
boolean next():判斷是否有下一條記錄,如有返回true且將光標移到下一行,若沒有呢則返回false
光標一開始處於第一條記錄的上面
獲取具體內容
getXxx(int|string)
若參數爲int :第幾列
若參數爲string:列名(字段名)
例如:
獲取cname的內容能夠經過
getString(2)
getString("cname")
經常使用方法:
getInt
getString 也能夠獲取int值
getObject 能夠獲取任意
///////////////////////
常見的配置文件格式:
1.properties
裏面內容的格式 key=value
2.xml
/////////////////
若咱們的配置文件爲properties,而且放在src目錄下.
咱們能夠經過 ResourceBundle工具快速獲取裏面的配置信息
使用步驟:
1.獲取ResourceBundle 對象:
static ResourceBundle getBundle("文件名稱不帶後綴名")
2.經過ResourceBundle 對象獲取配置信息
String getString(String key) :經過執行key獲取指定的value
//////////////////////
案例2-經過鏈接池(數據源)優化咱們的操做.
需求:
使用jdbc的時候,沒操做一次都須要獲取鏈接(建立)用完以後把鏈接釋放掉了(銷燬),經過鏈接池來優化curd操做.
技術分析:
鏈接池
////////////////////
鏈接池概述:
管理數據庫的鏈接,
做用:
提升項目的性能.
就是在鏈接池初始化的時候存入必定數量的鏈接,用的時候經過方法獲取,不用的時候歸還鏈接便可.
全部的鏈接池必須實現一個接口 javax.sql.DataSource接口
獲取鏈接方法:
Connection getConnection()
歸還鏈接的方法就是之前的釋放資源的方法.調用connection.close();
自定義一個鏈接池(理解思想)
經常使用鏈接池:
DBCP
C3P0
///////////////////
增前方法
1.繼承
2.裝飾者模式(靜態代理)
3.動態代理
//////////////
裝飾者模式:★★★
使用步驟:
1.裝飾者和被裝飾者實現同一個接口或者繼承同一個類
2.裝飾者中要有被裝飾者的引用
3.對須要加強的方法進行增強
4.對不須要增強的方法調用原來方法
////////////////////////////////////
經常使用的鏈接池:
DBCP:(理解)
apache組織
使用步驟:
1.導入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬編碼
//建立鏈接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///day07");
ds.setUsername("root");
ds.setPassword("1234");
b.配置文件
實現編寫一個properties文件
//存放配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/dbcp.properties"));
//設置
//prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
//建立鏈接池
DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
C3P0:(★)
hibernate和spring使用
有自動回收空閒鏈接的功能.
使用步驟:
1.導入jar包(c3p0-0.9.1.2.jar)
2.使用api
a.硬編碼(不推薦)
new ComboPooledDataSource()
b.配置文件
配置文件的名稱:c3p0.properties 或者 c3p0-config.xml
配置文件的路徑:src下
編碼只須要一句話
new ComboPooledDataSource()//使用默認的配置
new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默認的配置
////////////////////////////
案例3-使用dbutils完成curd操做
技術分析:
dbutils
dbutils:
是apache組織的一個工具類,jdbc的框架,更方便咱們使用
使用步驟:
1.導入jar包(commons-dbutils-1.4.jar)
2.建立一個queryrunner類
queryrunner做用:操做sql語句
構造方法:
new QueryRunner(Datasource ds);
3.編寫sql
4.執行sql
query(..):執行r操做
update(...):執行cud操做
////////////////////////////
核心類或接口
QueryRunner:類名
做用:操做sql語句
構造器:
new QueryRunner(Datasource ds);
注意:
底層幫咱們建立鏈接,建立語句執行者 ,釋放資源.
經常使用方法:
query(..):
update(..):
DbUtils:釋放資源,控制事務 類
closeQuietly(conn):內部處理了異常
commitAndClose(Connection conn):提交事務並釋放鏈接
....
ResultSetHandler:封裝結果集 接口
ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
(瞭解)ArrayHandler, 將查詢結果的第一條記錄封裝成數組,返回
(瞭解)ArrayListHandler, 將查詢結果的每一條記錄封裝成數組,將每個數組放入list中返回
★★BeanHandler, 將查詢結果的第一條記錄封裝成指定的bean對象,返回
★★BeanListHandler, 將查詢結果的每一條記錄封裝成指定的bean對象,將每個bean對象放入list中 返回.
(瞭解)ColumnListHandler, 將查詢結果的指定一列放入list中返回
(瞭解)MapHandler, 將查詢結果的第一條記錄封裝成map,字段名做爲key,值爲value 返回
★MapListHandler, 將查詢結果的每一條記錄封裝map集合,將每個map集合放入list中返回
★ScalarHandler,針對於聚合函數 例如:count(*) 返回的是一個Long值
//////////////////////////////////
上午回顧:
jdbc:
java語言操做數據庫
jdbc是oracle公司指定的一套規範,
驅動:jdbc的實現類,由數據庫廠商提供.
jdbc操做步驟:
1.導入驅動jar包
2.註冊驅動
3.獲取鏈接
4.編寫sql
5.獲取語句執行者
PreparedStatement st=conn.prepareStatement(sql);
6.設置參數
st.setXxx(int 第幾個問號,Object 實參);
7.執行sql
ResultSet rs=st.executeQuery();
int i=st.executeUpdate();
8.處理結果
如果resultset
while(rs.next()){
rs.getXxx(int|String)
}
9.釋放資源
////////////////////////////////////////
獲取src目錄下的properties格式的配置文件
ResourceBundle bundle=ResourceBundle.getBundle("不帶後綴名的文件名");
String value = bundle.getString("key");
////////////////////////
自定義鏈接池:
加強方法:
1.繼承
2.裝飾者模式(靜態代理)
3.動態代理
///////////////
裝飾者模式(靜態代理)
1.裝飾者和被裝飾者實現同一個接口或者繼承同一個類
2.在裝飾者中要有被裝飾者的引用
3.對須要加強的方法進行增強
4.對不須要增強的方法調用原來方法
///////////////////
常見鏈接池:
dbcp:
c3p0:★
配置文件:
名稱:c3p0.properties或者 c3p0-config.xml
位置:src下
使用:
new ComboPooledDataSource()
////////////////
dbutils:
工具類,封裝了jdbc的操做.
使用步驟:
1.導入jar包
2.建立queryrunner類
3.編寫sql
4.執行sql
queryrunner:操做sql語句
構造器:
new queryrunner()
方法:
query(..)
update(..)
ResultSetHandler:封裝結果集
BeanHandler
BeanListHandler
MapListHandler
ScalarHandler
回顧:
sql
sql分類:
DDL:
對象:數據庫和表
關鍵詞:create alter drop truncate
建立數據庫:create database day06;
刪除數據庫: drop database day06;
建立表:create table user(
id int primark key auto_increment,
username varchar(20)
);
修改表:
alter table user rename to user10;
alter table user add password varchar(20);
alter table user change password pwd varchar(20);
alter table user modify pwd int;
alter table user drop pwd;
刪除表:
drop table user;
經常使用的命令:
use day06;
show tables;
desc user;
show create table user;
DML:
對象:記錄(行)
關鍵詞:insert update delete
插入:
insert into user values(字段值1,字段值2,...);-- 全部的字段
insert into user(字段1,字段2....) values(字段值1,字段值2);-- 插入指定的字段
更新:
update user set 字段=字段值1,字段2=字段值2 where 條件;
刪除:
delete from user where 條件;
擴展:
之後開發中不多使用delete,數據無價,刪除有物理和邏輯(經常使用),
邏輯刪除通常會在表中添加一個字段(isdel:若值爲1,表明刪除了;若爲0表明沒有刪除),
此時的刪除操做變成了更新操做.
DQL:
select ... from 表名 where 條件 group by 分組字段 having 條件 order by 排序字段;
執行順序:
1.肯定數據來自那張表 from
2.是否須要篩選 where
3.是否須要分組 group by
4.分組後是否須要篩選 having
5.是否須要排序 order by
6.肯定顯示那些數據. select
DCL:用戶 權限 事務
////////////////////////
auto_increment 自增
truncate 幹掉表,從新建立 和delete的區別
數據類型:
int 和 varchar(size):可變長度
date time datetime timestamp
////////////////////////////////////
多表的操做:
表與表之間的關係:
一對多:
在多表的一方添加一個外鍵,外鍵的名稱通常是主表名稱_id,外鍵的類型和主表的主鍵的類型保持一致
爲了保證數據的有效性和完整性,
須要在多表上添加外鍵約束
格式:
alter table 多表 add [constraint [外鍵的名稱]] foreign key(外鍵名稱) references 主表名稱(主鍵);
多對多:
添加一張中間表,存放兩張表的主鍵,就能夠將多對多拆分紅兩個一對多了
爲了保證數據的有效性和完整性,
須要在中間表添加兩個外鍵約束
一對一:(瞭解)
1.兩個實體合二爲一(字段比較少)
2.將一張表的主鍵添加外鍵約束便可
/////////////////////////////
多表的查詢:
內鏈接:
顯式:
select a.*,b.* from a join b on 條件;
隱式:
select a.*,b.* from a,b where 條件;
外鏈接:
左外鏈接:
select a.*,b.* from a left join b on 條件;
以a爲主,展現全部數據,根據條件關聯查詢b表,知足條件則展現,不知足的話以null顯示
子查詢::
一個查詢依賴於另外一個查詢.
//////////////////////////////////////
案例1-經過jdbc完成單表的curd操做:
需求:
對分類表完成操做.
技術分析:
jdbc
///////////////////////
jdbc:
java操做數據庫.jdbc是oracle公司指定的一套規範(一套接口)
驅動:jdbc的實現類.由數據庫廠商提供.
咱們就能夠經過一套規範操做不一樣的數據庫了(多態)
jdbc做用:
鏈接數據庫
發送sql語句
處理結果
jdbc操做步驟:★
1.數據庫和表
2.建立一個項目
3.導入驅動jar包
4.編碼:
註冊驅動
獲取鏈接
編寫sql
建立預編譯的語句執行者
設置參數
執行sql
處理結果
釋放資源
初始化數據庫和表:
CREATE DATABASE day07;
USE day07;
create table category(
cid varchar(20) primary key,
cname varchar(20)
);
insert into category values('c001','電器');
insert into category values('c002','服飾');
insert into category values('c003','化妝品');
insert into category values('c004','書籍');
IDE打開以後
1.修改字符集 utf-8
2.新建 java項目
3.使用的jdk爲本身的jdk 不用使用內置
使用junit單元測試
要求:
1.方法是public void xxx(){}
2.在方法上添加 @Test
3.在@Test 按下 ctrl+1(快速鎖定錯誤)
4.在方法上右鍵 run as -->junit 就能夠執行方法了.
jdbc-api詳解:
全部的包 都是 java.sql 或者 javax.sql
DriverManager:管理了一組jdbc的操做 類
經常使用方法:
瞭解:註冊驅動
static void registerDriver(Driver driver) :
經過查看 com.mysql.jdbc.Driver的源碼 有以下代碼
static {
try {
java.sql.DriverManager.registerDriver(new Driver());//這段代碼咱們已經寫過
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}
驅動註冊了兩次.咱們只須要將靜態代碼塊執行一次,類被加載到內存中會執行靜態代碼塊,而且只執行一次.
如今只須要將類加載到內存中便可:
方式1:
★Class.forName("全限定名");//包名+類名 com.mysql.jdbc.Driver
方式2:
類名.class;
方式3:
對象.getClass();
掌握:獲取鏈接
static Connection getConnection(String url, String user, String password)
參數1:告訴咱們鏈接什麼類型的數據庫及鏈接那個數據庫
協議:數據庫類型:子協議 參數
mysql: jdbc:mysql://localhost:3306/數據庫名稱
oracle: jdbc:oracle:thin@localhost:1521@實例
參數2:帳戶名 root
參數3:密碼
(瞭解)Driver:java.sql 接口 驅動
Connection:鏈接 接口
經常使用方法:
獲取語句執行者:
(瞭解)Statement createStatement() :獲取普通的語句執行者 會出現sql注入問題
★PreparedStatement prepareStatement(String sql) :獲取預編譯語句執行者
(瞭解)CallableStatement prepareCall(String sql):獲取調用存儲過程的語句執行者
瞭解:
setAutoCommit(false) :手動開啓事務
commit():提交事務
rollback():事務回滾
Statement:語句執行者 接口
PreparedStatement:預編譯語句執行者 接口
經常使用方法:
設置參數:
setXxx(int 第幾個問號,Object 實際參數);
常見的方法:
setInt
setString
setObject
執行sql:
ResultSet executeQuery() :執行 r 語句 返回值:結果集
int executeUpdate() :執行cud 語句 返回值:影響的行數
ResultSet:結果集 接口
執行查詢語句以後返回的結果
經常使用方法:
boolean next():判斷是否有下一條記錄,如有返回true且將光標移到下一行,若沒有呢則返回false
光標一開始處於第一條記錄的上面
獲取具體內容
getXxx(int|string)
若參數爲int :第幾列
若參數爲string:列名(字段名)
例如:
獲取cname的內容能夠經過
getString(2)
getString("cname")
經常使用方法:
getInt
getString 也能夠獲取int值
getObject 能夠獲取任意
///////////////////////
常見的配置文件格式:
1.properties
裏面內容的格式 key=value
2.xml
/////////////////
若咱們的配置文件爲properties,而且放在src目錄下.
咱們能夠經過 ResourceBundle工具快速獲取裏面的配置信息
使用步驟:
1.獲取ResourceBundle 對象:
static ResourceBundle getBundle("文件名稱不帶後綴名")
2.經過ResourceBundle 對象獲取配置信息
String getString(String key) :經過執行key獲取指定的value
//////////////////////
案例2-經過鏈接池(數據源)優化咱們的操做.
需求:
使用jdbc的時候,沒操做一次都須要獲取鏈接(建立)用完以後把鏈接釋放掉了(銷燬),經過鏈接池來優化curd操做.
技術分析:
鏈接池
////////////////////
鏈接池概述:
管理數據庫的鏈接,
做用:
提升項目的性能.
就是在鏈接池初始化的時候存入必定數量的鏈接,用的時候經過方法獲取,不用的時候歸還鏈接便可.
全部的鏈接池必須實現一個接口 javax.sql.DataSource接口
獲取鏈接方法:
Connection getConnection()
歸還鏈接的方法就是之前的釋放資源的方法.調用connection.close();
自定義一個鏈接池(理解思想)
經常使用鏈接池:
DBCP
C3P0
///////////////////
增前方法
1.繼承
2.裝飾者模式(靜態代理)
3.動態代理
//////////////
裝飾者模式:★★★
使用步驟:
1.裝飾者和被裝飾者實現同一個接口或者繼承同一個類
2.裝飾者中要有被裝飾者的引用
3.對須要加強的方法進行增強
4.對不須要增強的方法調用原來方法
////////////////////////////////////
經常使用的鏈接池:
DBCP:(理解)
apache組織
使用步驟:
1.導入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar)
2.使用api
a.硬編碼
//建立鏈接池
BasicDataSource ds = new BasicDataSource();
//配置信息
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///day07");
ds.setUsername("root");
ds.setPassword("1234");
b.配置文件
實現編寫一個properties文件
//存放配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/dbcp.properties"));
//設置
//prop.setProperty("driverClassName", "com.mysql.jdbc.Driver");
//建立鏈接池
DataSource ds = new BasicDataSourceFactory().createDataSource(prop);
C3P0:(★)
hibernate和spring使用
有自動回收空閒鏈接的功能.
使用步驟:
1.導入jar包(c3p0-0.9.1.2.jar)
2.使用api
a.硬編碼(不推薦)
new ComboPooledDataSource()
b.配置文件
配置文件的名稱:c3p0.properties 或者 c3p0-config.xml
配置文件的路徑:src下
編碼只須要一句話
new ComboPooledDataSource()//使用默認的配置
new ComboPooledDataSource(String configName)//使用命名的配置 若配置的名字找不到,使用默認的配置
////////////////////////////
案例3-使用dbutils完成curd操做
技術分析:
dbutils
dbutils:
是apache組織的一個工具類,jdbc的框架,更方便咱們使用
使用步驟:
1.導入jar包(commons-dbutils-1.4.jar)
2.建立一個queryrunner類
queryrunner做用:操做sql語句
構造方法:
new QueryRunner(Datasource ds);
3.編寫sql
4.執行sql
query(..):執行r操做
update(...):執行cud操做
////////////////////////////
核心類或接口
QueryRunner:類名
做用:操做sql語句
構造器:
new QueryRunner(Datasource ds);
注意:
底層幫咱們建立鏈接,建立語句執行者 ,釋放資源.
經常使用方法:
query(..):
update(..):
DbUtils:釋放資源,控制事務 類
closeQuietly(conn):內部處理了異常
commitAndClose(Connection conn):提交事務並釋放鏈接
....
ResultSetHandler:封裝結果集 接口
ArrayHandler, ArrayListHandler, BeanHandler, BeanListHandler, ColumnListHandler, KeyedHandler, MapHandler, MapListHandler, ScalarHandler
(瞭解)ArrayHandler, 將查詢結果的第一條記錄封裝成數組,返回
(瞭解)ArrayListHandler, 將查詢結果的每一條記錄封裝成數組,將每個數組放入list中返回
★★BeanHandler, 將查詢結果的第一條記錄封裝成指定的bean對象,返回
★★BeanListHandler, 將查詢結果的每一條記錄封裝成指定的bean對象,將每個bean對象放入list中 返回.
(瞭解)ColumnListHandler, 將查詢結果的指定一列放入list中返回
(瞭解)MapHandler, 將查詢結果的第一條記錄封裝成map,字段名做爲key,值爲value 返回
★MapListHandler, 將查詢結果的每一條記錄封裝map集合,將每個map集合放入list中返回
★ScalarHandler,針對於聚合函數 例如:count(*) 返回的是一個Long值
//////////////////////////////////
上午回顧:
jdbc:
java語言操做數據庫
jdbc是oracle公司指定的一套規範,
驅動:jdbc的實現類,由數據庫廠商提供.
jdbc操做步驟:
1.導入驅動jar包
2.註冊驅動
3.獲取鏈接
4.編寫sql
5.獲取語句執行者
PreparedStatement st=conn.prepareStatement(sql);
6.設置參數
st.setXxx(int 第幾個問號,Object 實參);
7.執行sql
ResultSet rs=st.executeQuery();
int i=st.executeUpdate();
8.處理結果
如果resultset
while(rs.next()){
rs.getXxx(int|String)
}
9.釋放資源
////////////////////////////////////////
獲取src目錄下的properties格式的配置文件
ResourceBundle bundle=ResourceBundle.getBundle("不帶後綴名的文件名");
String value = bundle.getString("key");
////////////////////////
自定義鏈接池:
加強方法:
1.繼承
2.裝飾者模式(靜態代理)
3.動態代理
///////////////
裝飾者模式(靜態代理)
1.裝飾者和被裝飾者實現同一個接口或者繼承同一個類
2.在裝飾者中要有被裝飾者的引用
3.對須要加強的方法進行增強
4.對不須要增強的方法調用原來方法
///////////////////
常見鏈接池:
dbcp:
c3p0:★
配置文件:
名稱:c3p0.properties或者 c3p0-config.xml
位置:src下
使用:
new ComboPooledDataSource()
////////////////
dbutils:
工具類,封裝了jdbc的操做.
使用步驟:
1.導入jar包
2.建立queryrunner類
3.編寫sql
4.執行sql
queryrunner:操做sql語句
構造器:
new queryrunner()
方法:
query(..)
update(..)
ResultSetHandler:封裝結果集
BeanHandler
BeanListHandler
MapListHandler
ScalarHandler