JDBC使用類路徑讀取jdbc配置文件
時(shí)間:20180314
優(yōu)化jdbc的JdbcUtil類
代碼實(shí)現(xiàn)在JdbcUtil類中使用類路徑讀取jdbc配置文件
//jdbc配置文件--jdbc.properties
url=jdbc:mysql://localhost:3306/day16
user=root
password=root
driverClass=com.mysql.jdbc.Driver
jdbc.properties文件結(jié)構(gòu)目錄
//JdbcUtil.java
/**
* jdbc通用方法
* @author mengjie
*
*/
public class JdbcUtil {
//url
//private static String url = "null";錯(cuò)誤寫法,讀取jdbc.properties文件中數(shù)據(jù)無法覆蓋
private static String url = null;
//user
//private static String user = "null"; static靜態(tài)寫法,只初始化一次
private static String user = null;
//password
//private static String password = "null";static靜態(tài)寫法梦裂,只初始化一次
private static String password = null;
//driveClass驅(qū)動(dòng)程序類
//private static String driverClass = "null";static靜態(tài)寫法痒蓬,只初始化一次
private static String driverClass = null;
/**
*z只注冊(cè)一次驅(qū)動(dòng)撮奏,靜態(tài)代碼塊
*/
static {
//注冊(cè)驅(qū)動(dòng)程序
try {
/**
* 讀取jdbc.properties文件
*/
//1) 創(chuàng)建Properties
Properties prop = new Properties();
//構(gòu)造輸入流
/**
* 相對(duì)路徑: . 這個(gè)代表當(dāng)前目錄升敲。當(dāng)前目錄本質(zhì)上是java命令運(yùn)行的目錄
* java項(xiàng)目中:eclipse中,當(dāng)前目錄指向項(xiàng)目的跟目錄
* web項(xiàng)目中:當(dāng)前目錄只想%tomcat%/bin目錄
* 結(jié)論:
* 1).在web項(xiàng)目中不能使用相對(duì)路徑
* 2).不能使用ServletContext讀取文件(Java項(xiàng)目中無法使用昧识,web項(xiàng)目可行)
* 3).使用類路徑的方式讀取配置文件
* 3.1獲取類的對(duì)象
* Class clazz = 當(dāng)前項(xiàng)目的類.class
*
* 3.2調(diào)用類的路徑方法
* clazz.getResourceAsStream("/配置文件")
* 這個(gè)斜杠代表類路徑的根目錄
*/
//1)獲取類的對(duì)象(使用當(dāng)前類)
Class clazz = JdbcUtil.class;
//2)使用類路徑的讀取方法去讀取文件
/**
* 這個(gè)斜杠:代表項(xiàng)目類路徑的根目錄攻臀。
* 什么是類路徑:查找類的目錄/路徑
* java項(xiàng)目下:類路徑的根目錄焕数,指向項(xiàng)目的bin目錄
* Web項(xiàng)目下:類路徑的跟目錄,指向WEB-INF/classes目錄下
* 只要把配置文件放在src目錄的根目錄下刨啸,那么這些文件就自動(dòng)拷貝到項(xiàng)目的類路徑跟目錄下
*/
InputStream in = clazz.getResourceAsStream("/jdbc.properties");
//InputStream in = new FileInputStream("./src/jdbc.properties");
//2) 加載文件
prop.load(in);
//3) 讀取文件內(nèi)容
url = prop.getProperty("url");
user = prop.getProperty("user");
password = prop.getProperty("password");
driverClass = prop.getProperty("driverClass");
System.out.println("url: "+url+" user: "+user+" password: "+password+" driverClass: "+driverClass);
Class.forName(driverClass);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 獲取連接的方法
* @throws SQLException
*/
public static Connection getConnection() {
try {
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
/**
* 釋放資源的方法
*/
public static void close(Statement stmt, Connection conn) {
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
/**
* 釋放資源的方法
*/
public static void close(ResultSet rs, Statement stmt, Connection conn) {
if(rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
//測(cè)試demo
public class Demo2 {
private static Connection conn = null;
private static Statement stmt = null;
private static ResultSet res = null;
public static void main(String[] args) throws Exception {
String username = "rose";
String password = "123456";
conn = JdbcUtil.getConnection();
stmt = conn.createStatement();
String sql = "SELECT * FROM user_list WHERE NAME =' "+username+" ' AND PASSWORD=' "+password+" '";
res = stmt.executeQuery(sql);
if(res.next()) {
System.out.println("登陸成功");
}else {
System.out.println("登陸失敗");
}
}
}
總結(jié)
- jdbc是什么堡赔?
??使用java程序操作數(shù)據(jù)庫的技術(shù)。(就是一套接口) - jdbc操作數(shù)據(jù)庫步驟:
??2.1注冊(cè)驅(qū)動(dòng)
???Class.forName(驅(qū)動(dòng)名稱)
??2.2獲取連接
???Connection conn = DriverManager.getConnection(url,user,password);
??2.3創(chuàng)建Statement/PreparedeStatement/CallableStatement
???Statement stmt = conn.getStatement();
???PreparedStatement stmt = conn.PreparedStatement(sql);
2.4如果使用PreparedeStatement/CallableStatement设联,設(shè)置參數(shù)
??stmt.setXXX(參數(shù)位置, 參數(shù)值)善已;
2.5執(zhí)行sql/發(fā)送參數(shù)
??stmt.executeUpdate() DDL+DML
??ResultSet res = stmt.executeQuery() ; DQL
2.6處理結(jié)果集
??res.next()
??res.get()
2.7關(guān)閉資源
??res.close();
??stmt.close();
??conn.close();