Skip to content

Latest commit

Β 

History

History
41 lines (22 loc) Β· 2.92 KB

statement_preparedStatement.md

File metadata and controls

41 lines (22 loc) Β· 2.92 KB

Statement vs PreparedStatement

μš°μ„  속도 λ©΄μ—μ„œ PreparedStatementκ°€ λΉ λ₯΄λ‹€κ³  μ•Œλ €μ Έ μžˆλ‹€. μ΄μœ λŠ” 쿼리λ₯Ό μˆ˜ν–‰ν•˜κΈ° 전에 이미 쿼리가 컴파일 λ˜μ–΄ 있으며, 반볡 μˆ˜ν–‰μ˜ 경우 프리 컴파일된 쿼리λ₯Ό 톡해 μˆ˜ν–‰μ΄ 이루어지기 λ•Œλ¬Έμ΄λ‹€.

PreparedStatementμ—λŠ” 보톡 λ³€μˆ˜λ₯Ό μ„€μ •ν•˜κ³  λ°”μΈλ”©ν•˜λŠ” static sql이 μ‚¬μš©λ˜κ³  Statementμ—μ„œλŠ” 쿼리 μžμ²΄μ— 쑰건이 λ“€μ–΄κ°€λŠ” dynamic sql이 μ‚¬μš©λœλ‹€. PreparedStatementκ°€ νŒŒμ‹± νƒ€μž„μ„ μ€„μ—¬μ£ΌλŠ” 것은 λΆ„λͺ…ν•˜μ§€λ§Œ static sql을 μ‚¬μš©ν•˜λŠ”λ° λ”°λ₯΄λŠ” 퍼포먼슀 μ €ν•˜λ₯Ό κ³ λ €ν•˜μ§€ μ•Šμ„ 수 μ—†λ‹€.

ν•˜μ§€λ§Œ μ„±λŠ₯을 κ³ λ €ν•  λ•Œ μ‹œκ°„ λΆ€λΆ„μ—μ„œ κ°€μž₯ 큰 비쀑을 μ°¨μ§€ν•˜λŠ” 것은 ν…Œμ΄λΈ”μ—μ„œ λ ˆμ½”λ“œ(row)λ₯Ό κ°€μ Έμ˜€λŠ” 과정이고 SQL 문을 νŒŒμ‹±ν•˜λŠ” μ‹œκ°„μ€ 이 μ‹œκ°„μ˜ 10 λΆ„μ˜ 1 에 λΆˆκ³Όν•˜λ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— SQL Injection λ“±μ˜ 문제λ₯Ό λ³΄μ™„ν•΄μ£ΌλŠ” PreparedStatementλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ˜³λ‹€.

  • public interface **Statement**extends Wrapper

정적 SQL 문을 μ‹€ν–‰ν•΄, μž‘μ„±λœ κ²°κ³Όλ₯Ό 돌렀주기 μœ„ν•΄μ„œ(λ•Œλ¬Έμ—) μ‚¬μš©λ˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

λ””ν΄νŠΈμ—μ„œλŠ”,**Statement** 객체 λ§ˆλ‹€ 1 개의 **ResultSet** 객체만이 λ™μ‹œμ— μ˜€ν”ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 1 개의 ResultSet 객체의 readκ°€, λ‹€λ₯Έ read에 μ˜ν•΄ 끼어듀어지면(자), 각각은 λ‹€λ₯Έ Statement 객체에 μ˜ν•΄ μƒμ„±λœ 것이 λ©λ‹ˆλ‹€. Statement μΈν„°νŽ˜μ΄μŠ€μ˜ λͺ¨λ“  execution λ©”μ†Œλ“œλŠ”, λ¬Έμž₯의 ν˜„μž¬μ˜ ResultSet 객체둜 μ˜€ν”ˆλ˜κ³  μžˆλŠ” 것이 μ‘΄μž¬ν•˜λ©΄, 그것을 암묡에 클둜즈 ν•©λ‹ˆλ‹€.

ν”„λ¦¬μ»΄νŒŒμΌ 된 SQL 문을 λ‚˜νƒ€λ‚΄λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

SQL 문은, ν”„λ¦¬μ»΄νŒŒμΌ λ˜μ–΄PreparedStatement 객체에 ν¬ν•¨λ©λ‹ˆλ‹€. κ±°κΈ°μ„œ, 이 κ°μ²΄λŠ”, 이 λ¬Έμž₯을 μ—¬λŸ¬ μ°¨λ‘€ 효율적으둜 μ‹€ν–‰ν•˜λŠ” λͺ©μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ£Ό: IN νŒŒλΌλ―Έν„°μΉ˜λ₯Ό μ„€μ •ν•˜λŠ” μ„€μ • κΈ°λŠ₯ λ©”μ†Œλ“œ (setShort,setString λ“±)λŠ”, μž…λ ₯ νŒŒλΌλ―Έν„°μ˜ μ •μ˜λœ SQL ν˜•κ³Ό ν˜Έν™˜μ΄ μžˆλŠ” ν˜•νƒœλ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ μ•ˆλ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, IN νŒŒλΌλ―Έν„°μ— INTEGER 라고 ν•˜λŠ” SQL ν˜•μ΄ μžˆλŠ” 경우,setInt λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ μ•ˆλ©λ‹ˆλ‹€.

μž„μ˜μ˜ νŒŒλΌλ―Έν„°ν˜• λ³€ν™˜μ΄ ν•„μš”ν•œ κ²½μš°λŠ”,setObject λ©”μ†Œλ“œλŠ”, λͺ©μ μ˜ SQL ν˜•μœΌλ‘œ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ μ•ˆλ©λ‹ˆλ‹€.

νŒŒλΌλ―Έν„° μ„€μ •μ˜ 예λ₯Ό λ‹€μŒμ— λ‚˜νƒ€λƒ…λ‹ˆλ‹€. con λŠ” μ•‘ν‹°λΈŒν•œ 접속을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
SET SALARY = ? WHERE ID = ? ");
pstmt.setBigDecimal(1, 153833.00)
pstmt.setInt(2, 110592)

좜처: https://java.ihoney.pe.kr/76 [ν—ˆλ‹ˆλͺ¬(Honeymon)의 μžλ°”guru]