Работа със SQL в Java
Материал от BiTel WiKi
Работата с бази данни в Java се осъществява чрез JDBC (Java Database Connectivity) - API за достъп до база данни. JDBC е набор от интерфейси, които се изпълняват от драйвера на базата данни. Най-важните JDBC интерфейси саjava.sql.Connection,java.sql.Statement,java.sql.PreparedStatement,java.sql.ResultSet.
Драйверът за база данни е специална библиотека, която внедрява JDBC интерфейси за работа с конкретна СУБД. За MySQL драйверът може да бъде изтеглен тук: [1].
- Връзка - интерфейс - връзка с база данни.
- Statement е специален интерфейс за изпълнение на SQL заявки.
Интерфейсът Statement обикновено използва 3 функции за изпълнение на заявки:executeUpdateизпълнява заявки за вмъкване и актуализиране (INSERT и UPDATE) и връща броя на променените/добавени редове,executeQuery- извършва селекция (SELECT) и връща ResultSet обект, съдържащ резултата от селекция, иexecuteизпълнява sql заявка и връща strue, ако заявката е била за избор иfal se, ако заявката е била за промяна (резултатът от изпълнението може да бъде получен чрез st.getResultSet() за извличане и st.getUpdateCount() за актуализиране).
Интерфейсът PreparedStatement разширява Statement и се използва за предварително компилирани sql заявки. Използва се, когато една и съща заявка се изпълнява многократно (с еднакви или различни параметри).
След като PreparedStatement бъде създаден, това може да се направи много пъти:
Пул за свързване
Когато приложението работи, обикновено има често създаване на връзка, изпълнение на заявки и след това тяхното затваряне. Физически това би означавало, че всеки път се създава нова TCP връзка с базата данни и след това се унищожава. За да не губите времеустановяването на нова връзка (както и създаването на нов обект Connection) използва така наречения пул за връзки - пул от връзки. Работи много просто - когато връзката е затворена, не я затваря, а само я изчиства от информацията, получена при работа с тази връзка. При следващото обаждане за получаване на връзката пула издава тази и работим с нея като с нова. Ако в текущия момент няма съхранени връзки в пула, той създава нов. Обикновено има ограничение за максималния брой връзки, съхранявани в пула.
Има готови инструменти за реализиране на пулинг на връзки. Следното е пример за клас, който имплементира пул и е базиран на GenericObjectPool от apache.org. Този пример изисква библиотеки [2], commons-dbcp. Първият предоставя набор от интерфейси за работа с пулове + техните абстрактни реализации. Второто е внедряването на пулове за работа с връзки към бази данни.
Връзката, получена от пула, трябва даизисква, за да бъде върната в пула!
Докато ResultSet не бъде затворен ( close() ), информацията, свързана с него, ще се съхранява в паметта, същото важи и за Statement, PreparedStatement, Connection. но трябва да запомните, че когато Statement / PreparedStatement е затворен, всички ResultSets, създадени от тях, се затварят, а когато връзката е затворена, Statement и PreparedStatement, създадени от него, се затварят автоматично. При връщане към басейна връзката се затваря.
Когато работите с бази данни, е удобно да използвате моделаDAO(Data Access Object). С този подход се създава клас - модел, който отразява някакъв вид обект (нарича се още бизнес модел / обект) и клас - DAO, който може да работи с този обект с база данни: