๐ก Java์์ DataBase์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ํ๋ Programming API ์ด๋ค.
Class.forName() ๋ฉ์๋๋ฅผ ํ์ฉํด ์ฌ์ฉํ Driver๋ฅผ ๋ฑ๋กํ๋ค.
Class.forName(Class.forName("com.mysql.cj.jdbc.Driver"););
Drive/rManager๋ฅผ ์ด์ฉํด Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
Connection con = null;
try {
con = DriverManager.getConnection("jdbc:mysql://localhost/employee", "swcamp", "swcamp");
}
Properties ํ์ผ์ ํ์ฉํ์ฌ ์๊ธฐ๋ก ์์ฑํ์ง ์๊ณ ์์ฑ ๊ฐ์ ๋ถ๋ฌ์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost/employee
user=swcamp
password=swcampproperties ํ์ผ์ key-value ๋ฐฉ์์ผ๋ก ์ ์ฅํ ์ค์ ์ ๋ณด๋ฅผ ์ฝ์ด์จ๋ค.
์ธ์๋ก url, user, password๋ฅผ ์ค๋ ๋๊ณ , url, prop๋ฅผ ์ค๋ ๋๋ค. (user์ password๋ฅผ ๋ถ๋ฆฌํ์ง ์๊ณ ๋ณด๋ผ ์ ์๋ค.)
Properties prop = new Properties();
Connection con = null;
try {
prop.load(new FileReader("jdbc-config.properties"));
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
Class.forName(driver);
con = DriverManager.getConnection(url, user, password);
}
public class JDBCTemplate {
public static Connection getConnection() {
Connection con = null;
//DriverManager๋ฅผ ํ์ฉํ Connnection ๊ฐ์ฒด ์์ฑ ์ฝ๋ ์๋ต
return con;
}
public static void close(Connection con) {
try {
if(con != null & !con.isClosed()) {
con.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}try {
String query = "SELECT ID, LAST_NAME FROM EMP";
stmt = conn.createStatement(); // conn = Connection ๊ฐ์ฒด์ด๋ค.
rset = stmt.executeQuery(query);
} catch (SQLException e) {
e.printStackTrace();
}์ํ ์๋๊ฐ ๋น ๋ฅด๋ค.

โ PreparedStatement๊ฐ Statement๋ณด๋ค ์ํ ์๋๊ฐ ๋น ๋ฅด๋ค.
SQL injection ๊ณต๊ฒฉ์ ๋ํ์ฌ ์์ ํ๋ค.
empName = "ํ๊ธธ๋' OR 1=1 AND EMP_ID = '200";
ํ์ง๋ง PreparedStatement์ ์์นํ๋๋ฅผ ์ฌ์ฉํ๋ฉด, ์กฐ๊ฑด์ผ๋ก ์ธํ ๋๋ ๊ฐ์ ๋ฉ์๋์ ์ง์ ํ์์ ๋ฐ๋ผ ๋ฐ์ดํ๋ก ๊ฐ์ธ๋ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ์์์ ํ๋ค.
๋ฐ๋ผ์ OR 1=1 ์กฐ๊ฑด์ด ์ ์์ ์ธ ์๋๋๋ก ์ฌ์ฉ๋์ง ๋ชปํ๋ฏ๋ก Sql Injection ๊ณต๊ฒฉ์ ์์ ํ๋ค.
(์ฐธ๊ณ ) SQL Injection
โ SQL Injection์ด๋
try {
String query = "INSERT INTO MEMBER VALUES(?, ?)";
pstmt = conn.preparedStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, password);
rset = pstmt.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment/>
<entry key="selectEmpByFamilyName">
SELECT
E.*
FROM EMPLOYEE E
WHERE E.EMP_NAME LIKE CONCAT(?, '%')
</entry>
</properties>try {
prop.loadFromXML(new FileInputStream("employee-query.xml"));
String query = prop.getProperty("selectEmpByFamilyName");
pstmt = con.prepareStatement(query);
pstmt.setString(1, empName);
rset = pstmt.executeQuery();
} 
while(rset.next()) {
System.out.println(rset.getString("EMP_ID") + ", " + rset.getString("EMP_NAME"));
}DriverManager์ ํด๋น DBMS Driver๋ฅผ ๋ฑ๋กํ๋ค.
Class.forName("com.mysql.cj.jdbc.Driver");
Driver๋ก๋ถํฐ Connection instance๋ฅผ ํ๋ํ์ฌ DBMS์ ์ฐ๊ฒฐํ๋ค.
public static Connection getConnection(String url, String user, String password) throws SQLException {
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/employee", "shamyook", "shamyook");
}
Connection ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ Statement ๋๋ PreparedStatement instance๋ฅผ ์์ฑํ๋ค.
Statement stmt = conn.createStatement();
PreparedStatement pstmt = conn.preparedStatement(query);
Statement์์ ์ ๊ณตํ๋ method๋ฅผ ์ฌ์ฉํ์ฌ SQL๋ฌธ์ ์คํํ๋ค.
String query = "SELECT ID, LAST_NAME FROM EMP";
ResultSet rset = stmt.executeQuery(query);
while(rset.next()){
System.out.println(rset.getString("ID") + "\t" + rset.getString(2));
}
String query = "UPDATE EMP SET LAST_NAME = โKIMโ" + " WHERE ID = โ10000โ";
int result = stmt.executeUpdate(query);
๋ฐํ๋ฐ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ ๋ก์ง์ ์ํํ๋ค.
Connection close ๋ฐ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ ๋ฐํํ๋ค.
rset.close(); //ResultSet ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋ฉ ์ฒ๋ฆฌ
stmt.close(); //Statement ๋ฐ๋ฉ ์ฒ๋ฆฌ
conn.close(); //Connection ๋ฐ๋ฉ ์ฒ๋ฆฌ