JDBC及DBUtils
1、JDBC
2、DBUtils
###01JDBC概念和數(shù)據(jù)庫驅(qū)動程序
* A: JDBC概念和數(shù)據(jù)庫驅(qū)動程序
* a: JDBC概述
* JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,
可以為多種關(guān)系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。是Java訪問數(shù)據(jù)庫的標(biāo)準(zhǔn)規(guī)范
* JDBC提供了一種基準(zhǔn),據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序。
* JDBC需要連接驅(qū)動,驅(qū)動是兩個設(shè)備要進(jìn)行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設(shè)備提供商規(guī)定,
設(shè)備提供商為設(shè)備提供驅(qū)動軟件,通過軟件可以與該設(shè)備進(jìn)行通信。
* 我們使用的是mysql的驅(qū)動mysql-connector-java-5.1.39-bin.jar
* b: 總結(jié)
* JDBC是java提供給開發(fā)人員的一套操作數(shù)據(jù)庫的接口
* 數(shù)據(jù)庫驅(qū)動就是實(shí)現(xiàn)該接口的實(shí)現(xiàn)類
?
###02JDBC原理
* A: JDBC原理
* a: 描述
* Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實(shí)現(xiàn)類稱為驅(qū)動
* DBC是接口,驅(qū)動是接口的實(shí)現(xiàn),沒有驅(qū)動將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!
每個數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動一般都由數(shù)據(jù)庫生成廠商提供。
* 圖解見day29_source/JDBC實(shí)現(xiàn)原理.JPG
###03準(zhǔn)備數(shù)據(jù)
* A: 準(zhǔn)備數(shù)據(jù)
* a: 創(chuàng)建數(shù)據(jù)庫和表結(jié)構(gòu)
#創(chuàng)建數(shù)據(jù)庫
create database mybase;
#使用數(shù)據(jù)庫
use mybase;
###創(chuàng)建分類表
create table sort(
sid int PRIMARY KEY AUTO_INCREMENT,
sname varchar(100),
sprice DOUBLE,
sdesc VARCHAR(500)
);
* b: 向表中插入數(shù)據(jù)
#初始化數(shù)據(jù)
insert into sort(sname,sprice,sdesc) values('家電',2000, '優(yōu)惠的促銷');
insert into sort(sname,sprice,sdesc) values('家具',8900, '家具價格上調(diào),原材料漲價');
insert into sort(sname,sprice,sdesc) values('兒童玩具',290, '賺家長的錢');
insert into sort(sname,sprice,sdesc) values('生鮮',500.99, '生鮮商品');
insert into sort(sname,sprice,sdesc) values('服裝',24000, '換季銷售');
insert into sort(sname,sprice,sdesc) values('洗滌',50, '洗發(fā)水促銷');
###04JDBC的開發(fā)步驟
* A: JDBC的開發(fā)步驟
* a: 步驟介紹
1.注冊驅(qū)動
告知JVM使用的是哪一個數(shù)據(jù)庫的驅(qū)動
2.獲得連接
使用JDBC中的類,完成對MySQL數(shù)據(jù)庫的連接
3.獲得語句執(zhí)行平臺
通過連接對象獲取對SQL語句的執(zhí)行者對象
4.執(zhí)行sql語句
使用執(zhí)行者對象,向數(shù)據(jù)庫執(zhí)行SQL語句
獲取到數(shù)據(jù)庫的執(zhí)行后的結(jié)果
5.處理結(jié)果
6.釋放資源 一堆close()
###05導(dǎo)入mysql數(shù)據(jù)庫驅(qū)動程序jar包
* A: 導(dǎo)入mysql數(shù)據(jù)庫驅(qū)動程序jar包
* a: 步驟
* 創(chuàng)建lib目錄,用于存放當(dāng)前項(xiàng)目需要的所有jar包
* 選擇jar包,右鍵執(zhí)行build path / Add to Build Path
###06注冊數(shù)據(jù)庫驅(qū)動程序
* A: 注冊數(shù)據(jù)庫驅(qū)動程序
* a: 案例代碼
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
// 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
// Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實(shí)現(xiàn)類
//DriverManager.registerDriver(new Driver());
//驅(qū)動類源代碼,注冊2次驅(qū)動程序
Class.forName("com.mysql.jdbc.Driver");
}
}
###07獲取數(shù)據(jù)庫的連接對象
* A:獲取數(shù)據(jù)庫的連接對象
* a: 案例代碼
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
// 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
// Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實(shí)現(xiàn)類
//DriverManager.registerDriver(new Driver());
//驅(qū)動類源代碼,注冊2次驅(qū)動程序
Class.forName("com.mysql.jdbc.Driver");
//2.獲得數(shù)據(jù)庫連接 DriverManager類中靜態(tài)方法
//static Connection getConnection(String url, String user, String password)
//返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動程序
//url: 數(shù)據(jù)庫地址 jdbc:mysql://連接主機(jī)IP:端口號//數(shù)據(jù)庫名字
String url = "jdbc:mysql://localhost:3296/mybase";
//用戶名和密碼用自己的
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
System.out.println(con);
}
}
###08獲取SQL語句的執(zhí)行對象對象
* A: 獲取SQL語句的執(zhí)行對象對象
* a: 案例代碼
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
// 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
// Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實(shí)現(xiàn)類
//DriverManager.registerDriver(new Driver());
//驅(qū)動類源代碼,注冊2次驅(qū)動程序
Class.forName("com.mysql.jdbc.Driver");
//2.獲得數(shù)據(jù)庫連接 DriverManager類中靜態(tài)方法
//static Connection getConnection(String url, String user, String password)
//返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動程序
//url: 數(shù)據(jù)庫地址 jdbc:mysql://連接主機(jī)IP:端口號//數(shù)據(jù)庫名字
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3.獲得語句執(zhí)行平臺, 通過數(shù)據(jù)庫連接對象,獲取到SQL語句的執(zhí)行者對象
// con對象調(diào)用方法 Statement createStatement() 獲取Statement對象,將SQL語句發(fā)送到數(shù)據(jù)庫
// 返回值是 Statement接口的實(shí)現(xiàn)類對象,,在mysql驅(qū)動程序
Statement stat = con.createStatement();
System.out.println(stat);
}
}
###09執(zhí)行insert語句獲取結(jié)果集
* A: 執(zhí)行insert語句獲取結(jié)果集
* a: 案例代碼
public class JDBCDemo {
public static void main(String[] args)throws ClassNotFoundException,SQLException{
//1.注冊驅(qū)動 反射技術(shù),將驅(qū)動類加入到內(nèi)容
// 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver)
// Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實(shí)現(xiàn)類
//DriverManager.registerDriver(new Driver());
//驅(qū)動類源代碼,注冊2次驅(qū)動程序
Class.forName("com.mysql.jdbc.Driver");
//2.獲得數(shù)據(jù)庫連接 DriverManager類中靜態(tài)方法
//static Connection getConnection(String url, String user, String password)
//返回值是Connection接口的實(shí)現(xiàn)類,在mysql驅(qū)動程序
//url: 數(shù)據(jù)庫地址 jdbc:mysql://連接主機(jī)IP:端口號//數(shù)據(jù)庫名字
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3.獲得語句執(zhí)行平臺, 通過數(shù)據(jù)庫連接對象,獲取到SQL語句的執(zhí)行者對象
// con對象調(diào)用方法 Statement createStatement() 獲取Statement對象,將SQL語句發(fā)送到數(shù)據(jù)庫
// 返回值是 Statement接口的實(shí)現(xiàn)類對象,,在mysql驅(qū)動程序
Statement stat = con.createStatement();
// 4.執(zhí)行sql語句
// 通過執(zhí)行者對象調(diào)用方法執(zhí)行SQL語句,獲取結(jié)果
// int executeUpdate(String sql) 執(zhí)行數(shù)據(jù)庫中的SQL語句, insert delete update
// 返回值int,操作成功數(shù)據(jù)表多少行
int row = stat.executeUpdate
("INSERT INTO sort(sname,sprice,sdesc) VALUES('汽車用品',50000,'瘋狂漲價')");
System.out.println(row);
//6.釋放資源 一堆close()
stat.close();
con.close();
}
}
###10執(zhí)行select語句獲取結(jié)果集
* A: 執(zhí)行select語句獲取結(jié)果集
* a: 案例代碼
public class JDBCDemo1 {
public static void main(String[] args) throws Exception{
//1. 注冊驅(qū)動
Class.forName("com.mysql.jdbc.Driver");
//2. 獲取連接對象
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//3 .獲取執(zhí)行SQL 語句對象
Statement stat = con.createStatement();
// 拼寫查詢的SQL
String sql = "SELECT * FROM sort";
//4. 調(diào)用執(zhí)行者對象方法,執(zhí)行SQL語句獲取結(jié)果集
// ResultSet executeQuery(String sql) 執(zhí)行SQL語句中的select查詢
// 返回值ResultSet接口的實(shí)現(xiàn)類對象,實(shí)現(xiàn)類在mysql驅(qū)動中
ResultSet rs = stat.executeQuery(sql);
//5 .處理結(jié)果集
// ResultSet接口方法 boolean next() 返回true,有結(jié)果集,返回false沒有結(jié)果集
while(rs.next()){
//獲取每列數(shù)據(jù),使用是ResultSet接口的方法 getXX方法參數(shù)中,建議寫String列名
System.out.println(rs.getInt("sid")+" "+rs.getString("sname")+
" "+rs.getDouble("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
stat.close();
con.close();
}
}
###11SQL注入攻擊
* A: SQL注入攻擊
* a: 注入問題
* 假設(shè)有登錄案例SQL語句如下:
* SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸?shù)拿艽a;
* 此時,當(dāng)用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。
但是當(dāng)用戶輸入的賬號為XXX 密碼為:XXX’ OR ‘a(chǎn)’=’a時,則真正執(zhí)行的代碼變?yōu)?#xff1a;
* SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
* 此時,上述查詢語句時永遠(yuǎn)可以查詢出結(jié)果的。那么用戶就直接登錄成功了,顯然我們不希望看到這樣的結(jié)果,這便是SQL注入問題。
* b: 案例演示
CREATE TABLE users(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(100),
PASSWORD VARCHAR(100)
);
INSERT INTO users (username,PASSWORD) VALUES ('a','1'),('b','2');
SELECT * FROM users;
-- 登錄查詢
SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu'1
OR 1=1
SELECT * FROM users WHERE username='a' AND PASSWORD='1'OR'1=1'
鍵盤錄入:
1
1'OR' 1=1
###12SQL注入攻擊用戶登錄案例
* A: SQL注入攻擊用戶登錄案例
* a: 案例代碼
public class JDBCDemo2 {
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username = "root";
String password = "123";
Connection con = DriverManager.getConnection(url, username, password);
Statement stat = con.createStatement();
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
//執(zhí)行SQL語句,數(shù)據(jù)表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗
// String sql = "SELECT * FROM users WHERE username='dsfsdfd' AND PASSWORD='wrethiyu' OR 1=1";
String sql = "SELECT * FROM users WHERE username='"+user+"' AND PASSWORD='"+pass+"'";
System.out.println(sql);
ResultSet rs = stat.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("password"));
}
rs.close();
stat.close();
con.close();
}
}
###13PrepareStatement接口預(yù)編譯SQL語句
* A: PrepareStatement接口預(yù)編譯SQL語句
* a: 預(yù)處理對象
* 使用PreparedStatement預(yù)處理對象時,建議每條sql語句所有的實(shí)際參數(shù),都使用逗號分隔。
* String sql = "insert into sort(sid,sname) values(?,?)";;
* PreparedStatement預(yù)處理對象代碼:
* PreparedStatement psmt = conn.prepareStatement(sql)
* b: 執(zhí)行SQL語句的方法介紹
* int executeUpdate(); --執(zhí)行insert update delete語句.
* ResultSet executeQuery(); --執(zhí)行select語句.
* boolean execute(); --執(zhí)行select返回true 執(zhí)行其他的語句返回false.
* c: 設(shè)置實(shí)際參數(shù)
* void setXxx(int index, Xxx xx) 將指定參數(shù)設(shè)置為給定Java的xx值。在將此值發(fā)送到數(shù)據(jù)庫時,驅(qū)動程序?qū)⑺D(zhuǎn)換成一個 SQL Xxx類型值。
* 例如:
* setString(2, "家用電器") 把SQL語句中第2個位置的占位符? 替換成實(shí)際參數(shù) "家用電器"
* d: 案例代碼
/*
* Java程序?qū)崿F(xiàn)用戶登錄,用戶名和密碼,數(shù)據(jù)庫檢查
* 防止注入攻擊
* Statement接口實(shí)現(xiàn)類,作用執(zhí)行SQL語句,返回結(jié)果集
* 有一個子接口PreparedStatement (SQL預(yù)編譯存儲,多次高效的執(zhí)行SQL)
* PreparedStatement的實(shí)現(xiàn)類數(shù)據(jù)庫的驅(qū)動中,如何獲取接口的實(shí)現(xiàn)類
*
* 是Connection數(shù)據(jù)庫連接對象的方法
* PreparedStatement prepareStatement(String sql)
*/
public class JDBCDemo3 {
public static void main(String[] args)throws Exception {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username = "root";
String password = "123";
Connection con = DriverManager.getConnection(url, username, password);
Scanner sc = new Scanner(System.in);
String user = sc.nextLine();
String pass = sc.nextLine();
//執(zhí)行SQL語句,數(shù)據(jù)表,查詢用戶名和密碼,如果存在,登錄成功,不存在登錄失敗
String sql = "SELECT * FROM users WHERE username=? AND PASSWORD=?";
//調(diào)用Connection接口的方法prepareStatement,獲取PrepareStatement接口的實(shí)現(xiàn)類
//方法中參數(shù),SQL語句中的參數(shù)全部采用問號占位符
PreparedStatement pst = con.prepareStatement(sql);
System.out.println(pst);
//調(diào)用pst對象set方法,設(shè)置問號占位符上的參數(shù)
pst.setObject(1, user);
pst.setObject(2, pass);
//調(diào)用方法,執(zhí)行SQL,獲取結(jié)果集
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("username")+" "+rs.getString("password"));
}
rs.close();
pst.close();
con.close();
}
}
?
###14PrepareStatement接口預(yù)編譯SQL語句執(zhí)行修改
* A: PrepareStatement接口預(yù)編譯SQL語句執(zhí)行修改
* 案例代碼
/*
* 使用PrepareStatement接口,實(shí)現(xiàn)數(shù)據(jù)表的更新操作
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
//拼寫修改的SQL語句,參數(shù)采用?占位
String sql = "UPDATE sort SET sname=?,sprice=? WHERE sid=?";
//調(diào)用數(shù)據(jù)庫連接對象con的方法prepareStatement獲取SQL語句的預(yù)編譯對象
PreparedStatement pst = con.prepareStatement(sql);
//調(diào)用pst的方法setXXX設(shè)置?占位
pst.setObject(1, "汽車美容");
pst.setObject(2, 49988);
pst.setObject(3, 7);
//調(diào)用pst方法執(zhí)行SQL語句
pst.executeUpdate();
pst.close();
con.close();
}
}
###15PrepareStatement接口預(yù)編譯SQL語句執(zhí)行查詢
* A: PrepareStatement接口預(yù)編譯SQL語句執(zhí)行查詢
* a: 案例代碼
/*
* PrepareStatement接口實(shí)現(xiàn)數(shù)據(jù)表的查詢操作
*/
public class JDBCDemo1 {
public static void main(String[] args) throws Exception{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
Connection con = DriverManager.getConnection(url, username, password);
String sql = "SELECT * FROM sort";
PreparedStatement pst = con.prepareStatement(sql);
//調(diào)用pst對象的方法,執(zhí)行查詢語句,Select
ResultSet rs=pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("sid")+" "+rs.getString("sname")+" "+rs.getString("sprice")+" "+rs.getString("sdesc"));
}
rs.close();
pst.close();
con.close();
}
}
###16JDBC的工具類和測試
* A: JDBC的工具類和測試
* a: 案例代碼
//JDBCUtils工具類代碼
public class JDBCUtils {
private JDBCUtils(){}
private static Connection con ;
static{
try{
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3296/mybase";
String username="root";
String password="123";
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException(ex+"數(shù)據(jù)庫連接失敗");
}
}
/*
* 定義靜態(tài)方法,返回?cái)?shù)據(jù)庫的連接對象
*/
public static Connection getConnection(){
return con;
}
public static void close(Connection con,Statement stat){
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
public static void close(Connection con,Statement stat , ResultSet rs){
if(rs!=null){
try{
rs.close();
}catch(SQLException ex){}
}
if(stat!=null){
try{
stat.close();
}catch(SQLException ex){}
}
if(con!=null){
try{
con.close();
}catch(SQLException ex){}
}
}
}
//測試JDBCUtils工具類的代碼
public class TestJDBCUtils {
public static void main(String[] args)throws Exception {
Connection con = JDBCUtils.getConnection();
PreparedStatement pst = con.prepareStatement("SELECT sname FROM sort");
ResultSet rs = pst.executeQuery();
while(rs.next()){
System.out.println(rs.getString("sname"));
}
JDBCUtils.close(con, pst, rs);
}
}
###17數(shù)據(jù)表數(shù)據(jù)存儲對象
* A: 數(shù)據(jù)表數(shù)據(jù)存儲對象
* a: 準(zhǔn)備工作
* 導(dǎo)入jar包
* 拷貝day32定義的工具類JDBCUtils
* b: 案例代碼
//定義實(shí)體類Sort
public class Sort {
private int sid;
private String sname;
private double sprice;
private String sdesc;
public Sort(int sid, String sname, double sprice, String sdesc) {
this.sid = sid;
this.sname = sname;
this.sprice = sprice;
this.sdesc = sdesc;
}
public Sort(){}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public double getSprice() {
return sprice;
}
public void setSprice(double sprice) {
this.sprice = sprice;
}
public String getSdesc() {
return sdesc;
}
public void setSdesc(String sdesc) {
this.sdesc = sdesc;
}
@Override
public String toString() {
return "Sort [sid=" + sid + ", sname=" + sname + ", sprice=" + sprice + ", sdesc=" + sdesc + "]";
}
}
/*
* JDBC讀取數(shù)據(jù)表sort,每行數(shù)據(jù)封裝到Sort類的對象中
* 很多個Sort類對象,存儲到List集合中
*/
public class JDBCDemo {
public static void main(String[] args) throws Exception{
//使用JDBC工具類,直接獲取數(shù)據(jù)庫連接對象
Connection con = JDBCUtils.getConnection();
//連接獲取數(shù)據(jù)庫SQL語句執(zhí)行者對象
PreparedStatement pst = con.prepareStatement("SELECT * FROM sort");
//調(diào)用查詢方法,獲取結(jié)果集
ResultSet rs = pst.executeQuery();
//創(chuàng)建集合對象
List<Sort> list = new ArrayList<Sort>();
while(rs.next()){
//獲取到每個列數(shù)據(jù),封裝到Sort對象中
Sort s = new Sort(rs.getInt("sid"),rs.getString("sname"),rs.getDouble("sprice"),rs.getString("sdesc"));
//封裝的Sort對象,存儲到集合中
list.add(s);
}
JDBCUtils.close(con, pst, rs);
//遍歷List集合
for(Sort s : list){
System.out.println(s);
}
}
}
?
###18properties配置文件
* A: properties配置文件
* a: 相關(guān)介紹
* 開發(fā)中獲得連接的4個參數(shù)(驅(qū)動、URL、用戶名、密碼)通常都存在配置文件中,方便后期維護(hù),程序如果需要更換數(shù)據(jù)庫,
只需要修改配置文件即可。
* 通常情況下,我們習(xí)慣使用properties文件,此文件我們將做如下要求:
1. 文件位置:任意,建議src下
2. 文件名稱:任意,擴(kuò)展名為properties
3. 文件內(nèi)容:一行一組數(shù)據(jù),格式是“key=value”.
a) key命名自定義,如果是多個單詞,習(xí)慣使用點(diǎn)分隔。例如:jdbc.driver
b) value值不支持中文,如果需要使用非英文字符,將進(jìn)行unicode轉(zhuǎn)換。
###19properties文件的創(chuàng)建和編寫
* A: properties文件的創(chuàng)建和編寫
* a: properties文件的創(chuàng)建
* src路徑下建立database.properties(其實(shí)就是一個文本文件)
* b: properties文件的編寫(內(nèi)容如下)
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3296/mybase
username=root
password=123
###20加載配置文件
* A: 加載配置文件
* a: 案例代碼
/*
* 加載properties配置文件
* IO讀取文件,鍵值對存儲到集合
* 從集合中以鍵值對方式獲取數(shù)據(jù)庫的連接信息,完成數(shù)據(jù)庫的連接
*/
public class PropertiesDemo {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("database.properties");
System.out.println(fis);
//使用類的加載器
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
System.out.println(in);
}
}
?
###21通過配置文件連接數(shù)據(jù)庫
* A: 通過配置文件連接數(shù)據(jù)庫
* a: 案例代碼
/*
* 加載properties配置文件
* IO讀取文件,鍵值對存儲到集合
* 從集合中以鍵值對方式獲取數(shù)據(jù)庫的連接信息,完成數(shù)據(jù)庫的連接
*/
public class PropertiesDemo {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("database.properties");
System.out.println(fis);
//使用類的加載器
InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("database.properties");
System.out.println(in);
Properties pro = new Properties();
pro.load(in);
//獲取集合中的鍵值對
String driverClass=pro.getProperty("driverClass");
String url = pro.getProperty("url");
String username = pro.getProperty("username");
String password = pro.getProperty("password");
Class.forName(driverClass);
Connection con = DriverManager.getConnection(url, username, password);
System.out.println(con);
}
}
###22讀取配置文件的工具類
* A: 讀取配置文件的工具類
* a: 案例代碼
/*
* 編寫數(shù)據(jù)庫連接的工具類,JDBC工具類
* 獲取連接對象采用讀取配置文件方式
* 讀取文件獲取連接,執(zhí)行一次,static{}
*/
public class JDBCUtilsConfig {
private static Connection con ;
private static String driverClass;
private static String url;
private static String username;
private static String password;
static{
try{
readConfig();
Class.forName(driverClass);
con = DriverManager.getConnection(url, username, password);
}catch(Exception ex){
throw new RuntimeException("數(shù)據(jù)庫連接失敗");
}
}
private static void readConfig()throws Exception{
InputStream in = JDBCUtilsConfig.class.getClassLoader().getResourceAsStream("database.properties");
Properties pro = new Properties();
pro.load(in);
driverClass=pro.getProperty("driverClass");
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
}
public static Connection getConnection(){
return con;
}
}
###23測試工具類
* A: 測試工具類
* a: 案例代碼
public class TestJDBCUtils {
public static void main(String[] args) {
Connection con = JDBCUtilsConfig.getConnection();
System.out.println(con);
}
}
轉(zhuǎn)載于:https://www.cnblogs.com/writerW/p/8961578.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的JDBC及DBUtils的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: loj #6235. 区间素数个数
- 下一篇: cors解决ajax跨域