摘要:是訪問數(shù)據(jù)庫的標準規(guī)范提供了一種基準據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應用程序。在將此值發(fā)送到數(shù)據(jù)庫時,驅(qū)動程序?qū)⑺D(zhuǎn)換成一個類型值。
1.JDBC概念和數(shù)據(jù)庫驅(qū)動程序
A: JDBC概述
JDBC(Java Data Base Connectivity,java數(shù)據(jù)庫連接)是一種用于執(zhí)行SQL語句的Java API,可以為多種關系數(shù)據(jù)庫提供統(tǒng)一訪問,它由一組用Java語言編寫的類和接口組成。是Java訪問數(shù)據(jù)庫的標準規(guī)范
JDBC提供了一種基準,據(jù)此可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應用程序。
JDBC需要連接驅(qū)動,驅(qū)動是兩個設備要進行通信,滿足一定通信數(shù)據(jù)格式,數(shù)據(jù)格式由設備提供商規(guī)定,設備提供商為設備提供驅(qū)動軟件,通過軟件可以與該設備進行通信。
我們使用的是mysql的驅(qū)動mysql-connector-java-5.1.39-bin.jar
B: 總結(jié)
JDBC是java提供給開發(fā)人員的一套操作數(shù)據(jù)庫的接口
數(shù)據(jù)庫驅(qū)動就是實現(xiàn)該接口的實現(xiàn)類
2.JDBC原理Java提供訪問數(shù)據(jù)庫規(guī)范稱為JDBC,而生產(chǎn)廠商提供規(guī)范的實現(xiàn)類稱為驅(qū)動
DBC是接口,驅(qū)動是接口的實現(xiàn),沒有驅(qū)動將無法完成數(shù)據(jù)庫連接,從而不能操作數(shù)據(jù)庫!每個數(shù)據(jù)庫廠商都需要提供自己的驅(qū)動,用來連接自己公司的數(shù)據(jù)庫,也就是說驅(qū)動一般都由數(shù)據(jù)庫生成廠商提供。
3.準備數(shù)據(jù)#創(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) ); #初始化數(shù)據(jù) insert into sort(sname,sprice,sdesc) values ("家電",2000, "優(yōu)惠的促銷"), ("家具",8900, "家具價格上調(diào)"), ("玩具",290, "賺家長的錢"), ("生鮮",500.99, "生鮮商品"), ("服裝",24000, "換季銷售"), ("日用",50, "洗發(fā)水促銷");4.JDBC的開發(fā)步驟
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();
5.導入mysql數(shù)據(jù)庫驅(qū)動程序jar包創(chuàng)建lib目錄,用于存放當前項目需要的所有jar包
選擇jar包,右鍵執(zhí)行build path / Add to Build Path
6.注冊數(shù)據(jù)庫驅(qū)動程序public class JDBCDemo { public static void main(String[] args)throws ClassNotFoundException,SQLException{ //1.注冊驅(qū)動 反射技術,將驅(qū)動類加入到內(nèi)容 // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver) // Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實現(xiàn)類 //DriverManager.registerDriver(new Driver()); //驅(qū)動類源代碼,注冊2次驅(qū)動程序 Class.forName("com.mysql.jdbc.Driver"); } }7.獲取數(shù)據(jù)庫的連接對象
A:案例代碼
public class JDBCDemo { public static void main(String[] args)throws ClassNotFoundException,SQLException{ //1.注冊驅(qū)動 反射技術,將驅(qū)動類加入到內(nèi)容 // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver) // Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實現(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接口的實現(xiàn)類,在mysql驅(qū)動程序 //url: 數(shù)據(jù)庫地址 jdbc:mysql://連接主機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); } }8.獲取SQL語句的執(zhí)行對象對象
A: 案例代碼
public class JDBCDemo { public static void main(String[] args)throws ClassNotFoundException,SQLException{ //1.注冊驅(qū)動 反射技術,將驅(qū)動類加入到內(nèi)容 // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver) // Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實現(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接口的實現(xiàn)類,在mysql驅(qū)動程序 //url: 數(shù)據(jù)庫地址 jdbc:mysql://連接主機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接口的實現(xiàn)類對象,,在mysql驅(qū)動程序 Statement stat = con.createStatement(); System.out.println(stat); } }9.執(zhí)行insert語句獲取結(jié)果集
A: 案例代碼
public class JDBCDemo { public static void main(String[] args)throws ClassNotFoundException,SQLException{ //1.注冊驅(qū)動 反射技術,將驅(qū)動類加入到內(nèi)容 // 使用java.sql.DriverManager類靜態(tài)方法 registerDriver(Driver driver) // Diver是一個接口,參數(shù)傳遞,MySQL驅(qū)動程序中的實現(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接口的實現(xiàn)類,在mysql驅(qū)動程序 //url: 數(shù)據(jù)庫地址 jdbc:mysql://連接主機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接口的實現(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: 案例代碼
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接口的實現(xiàn)類對象,實現(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(); } }11.SQL注入攻擊
A: SQL注入攻擊
a: 注入問題
假設有登錄案例SQL語句如下:
SELECT * FROM 用戶表 WHERE NAME = 用戶輸入的用戶名 AND PASSWORD = 用戶輸?shù)拿艽a;
此時,當用戶輸入正確的賬號與密碼后,查詢到了信息則讓用戶登錄。
但是當用戶輸入的賬號為XXX 密碼為:XXX’ OR ‘a(chǎn)’=’a時,則真正執(zhí)行的代碼變?yōu)椋?/p>
SELECT * FROM 用戶表 WHERE NAME = ‘XXX’ AND PASSWORD =’ XXX’ OR ’a’=’a’;
此時,上述查詢語句時永遠可以查詢出結(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" 鍵盤錄入: sdsdd dfsssdd"or" 1=1
?
12.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(); } }13.PrepareStatement接口預編譯SQL語句
A: PrepareStatement接口預編譯SQL語句
a: 預處理對象
使用PreparedStatement預處理對象時,建議每條sql語句所有的實際參數(shù),都使用逗號分隔。
String sql = "insert into sort(sid,sname) values(?,?)";;
PreparedStatement預處理對象代碼:
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ù)
void setXxx(int index, Xxx xx) 將指定參數(shù)設置為給定Java的xx值。在將此值發(fā)送到數(shù)據(jù)庫時,驅(qū)動程序?qū)⑺D(zhuǎn)換成一個 SQL Xxx類型值。
例如:
setString(2, "家用電器") 把SQL語句中第2個位置的占位符? 替換成實際參數(shù) "家用電器"
d: 案例代碼
/* * Java程序?qū)崿F(xiàn)用戶登錄,用戶名和密碼,數(shù)據(jù)庫檢查 * 防止注入攻擊 * Statement接口實現(xiàn)類,作用執(zhí)行SQL語句,返回結(jié)果集 * 有一個子接口PreparedStatement (SQL預編譯存儲,多次高效的執(zhí)行SQL) * PreparedStatement的實現(xiàn)類數(shù)據(jù)庫的驅(qū)動中,如何獲取接口的實現(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接口的實現(xiàn)類 //方法中參數(shù),SQL語句中的參數(shù)全部采用問號占位符 PreparedStatement pst = con.prepareStatement(sql); System.out.println(pst); //調(diào)用pst對象set方法,設置問號占位符上的參數(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(); } }
?
14.PrepareStatement接口預編譯SQL語句執(zhí)行修改
A: 使用PrepareStatement接口,實現(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語句的預編譯對象 PreparedStatement pst = con.prepareStatement(sql); //調(diào)用pst的方法setXXX設置?占位 pst.setObject(1, "汽車美容"); pst.setObject(2, 49988); pst.setObject(3, 7); //調(diào)用pst方法執(zhí)行SQL語句 pst.executeUpdate(); pst.close(); con.close(); } }15.PrepareStatement接口預編譯SQL語句執(zhí)行查詢
A: PrepareStatement接口實現(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(); } }16.JDBC的工具類和測試
A: 案例代碼
//實現(xiàn)JDBC的工具類 //定義方法,直接返回數(shù)據(jù)庫的連接對象 public class JDBCUtils{ private JDBCUtils(){} private static Connection con; static { try { Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection( "jdbc:mysql://localhost:3307/mybase", "root", "allidea"); } catch (Exception ex){ throw new RuntimeException(ex + "數(shù)據(jù)庫連接失敗"); } } //定義靜態(tài)方法,返回數(shù)據(jù)庫的連接對象 public static Connection getConnection() { return con; } public static void colse(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 colse(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: 準備工作
導入jar包
準備工具類JDBCUtils
b: 案例代碼
//定義實體類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)建集合對象 List18.properties配置文件list = new ArrayList (); 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); } } }
A:開發(fā)中獲得連接的4個參數(shù)(驅(qū)動、URL、用戶名、密碼)通常都存在配置文件中,方便后期維護,程序如果需要更換數(shù)據(jù)庫,只需要修改配置文件即可。
B:通常情況下,我們習慣使用properties文件,此文件我們將做如下要求:
1.文件位置:建議src下
2.文件名稱:任意,擴展名為properties
3.文件內(nèi)容:一行一組數(shù)據(jù),格式是“key=value”.
4:key命名自定義,如果是多個單詞,習慣使用點分隔。例如:jdbc.driver
5:value值不支持中文,如果需要使用非英文字符,將進行unicode轉(zhuǎn)換。
C: properties文件的創(chuàng)建
src路徑下建立database.properties(其實就是一個文本文件)
D: properties文件的編寫(內(nèi)容如下)
driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3296/mybase username=root password=123
E: 加載配置文件
/* * 加載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); } }
F: 通過配置文件連接數(shù)據(jù)庫
/* * 加載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); } }19.讀取配置文件的工具類
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; } }
B: 測試工具類
public class TestJDBCUtils { public static void main(String[] args) { Connection con = JDBCUtilsConfig.getConnection(); System.out.println(con); } }
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71730.html
摘要:自定義對于自定義來說需要在配置文件中注冊然后需要實現(xiàn)接口一個例子首先編寫調(diào)度的處理類對預編譯的語句進行設置的時候使用設置預編譯的對象的獲得結(jié)果的時候獲取到列名的時候調(diào)度此方法使用自定義類型結(jié)果獲取列名字符串獲取結(jié)果集中的在結(jié)果集中獲取獲取結(jié) 自定義typeHandler 對于自定義typeHandler來說,需要在配置文件中注冊typeHandlers 然后需要實現(xiàn)TypeHandle...
摘要:不用自己來創(chuàng)建,而是通過池來獲取對象使用完后,調(diào)用的方法也不會真的關閉,而是把歸還給池連接池技術可以完成對象的再次利用接口為數(shù)據(jù)庫連接池提供了公共的接口各個廠商需要讓自己的連接池實現(xiàn)這個接口。 1.DButils工具類的介紹個三個核心類 A: 概述 DBUtils是java編程中的數(shù)據(jù)庫操作實用工具,小巧簡單實用。 DBUtils封裝了對JDBC的操作,簡化了JDBC操作,可以少...
摘要:學編程真的不是一件容易的事不管你多喜歡或是多會編程,在學習和解決問題上總會碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O計和編程的能力掌握基本的優(yōu)化策略。 學Java編程真的不是一件容易的事,不管你多喜歡或是多會Java編程,在學習和解決問題上總會碰到障礙。工作的時間越久就越能明白這個道理。不過這倒是一個讓人進步的機會,因為你要一直不斷的學習才能很好的解決你面前的難題...
閱讀 555·2021-08-31 09:45
閱讀 1665·2021-08-11 11:19
閱讀 897·2019-08-30 15:55
閱讀 836·2019-08-30 10:52
閱讀 2869·2019-08-29 13:11
閱讀 2938·2019-08-23 17:08
閱讀 2850·2019-08-23 15:11
閱讀 3079·2019-08-23 14:33