JDBC 란? Java 데이터베이스 연결 소개

JDBC (Java Database Connectivity)는 데이터베이스 연결, 쿼리 및 명령 실행, 데이터베이스에서 얻은 결과 집합 처리를 관리하는 Java API입니다. 1997 년 JDK 1.1의 일부로 출시 된 JDBC는 Java 지속성 계층을 위해 개발 된 최초의 구성 요소 중 하나입니다.

JDBC는 처음에 클라이언트 측 API로 인식되어 Java 클라이언트가 데이터 소스와 상호 작용할 수 있도록했습니다. 이는 서버 측 JDBC 연결을 지원하는 선택적 패키지를 포함하는 JDCB 2.0으로 변경되었습니다. 이후 모든 새로운 JDBC 릴리스에는 클라이언트 측 패키지 ( java.sql)와 서버 측 패키지 ( ) 모두에 대한 업데이트가 포함되어 있습니다 javax.sql. 이 글을 쓰는 현재 가장 최신 버전 인 JDBC 4.3은 2017 년 9 월 Java SE 9의 일부로 출시되었습니다.

이 기사에서는 JDBC에 대한 개요를 제공하고 JDBC API를 사용하여 Java 클라이언트를 경량 관계형 데이터베이스 인 SQLite와 연결하는 방법을 직접 소개합니다.

JDBC 작동 방식

C 기반 ODBC (Open Database Connectivity) API의 대안으로 개발 된 JDBC는 데이터베이스 또는 RDBMS와 통신하는 Java 응용 프로그램의 메커니즘을 처리하는 프로그래밍 수준 인터페이스를 제공합니다. JDBC 인터페이스는 다음 두 계층으로 구성됩니다.

  1. JDBC API는 Java 애플리케이션과 JDBC 관리자 간의 통신을 지원합니다.
  2. JDBC 드라이버는 JDBC 관리자와 데이터베이스 드라이버 간의 통신을 지원합니다.

JDBC는 애플리케이션 코드가 상호 작용하는 공통 API입니다. 그 아래에는 사용중인 데이터베이스에 대한 JDBC 호환 드라이버가 있습니다.

그림 1은 Java 지속성 계층에서 JDBC의 아키텍처 개요입니다.

자바 월드 /

JDBC를 사용하여 데이터베이스에 연결

Java 에코 시스템에서 프로그래밍의 운 좋은 사실 중 하나는 선택한 데이터베이스에 대해 안정적인 JDBC 데이터베이스 커넥터를 찾을 수 있다는 것입니다. 이 튜토리얼에서는 주로 사용하기 쉽기 때문에 SQLite를 사용하여 JDBC에 대해 알아볼 것입니다.

JDBC를 사용하여 데이터베이스에 연결하는 단계는 다음과 같습니다.

  1. 액세스하려는 데이터베이스를 설치하거나 찾습니다.
  2. JDBC 라이브러리를 포함합니다.
  3. 필요한 JDBC 드라이버가 클래스 경로에 있는지 확인하십시오.
  4. JDBC 라이브러리를 사용하여 데이터베이스에 연결합니다.
  5. 연결을 사용하여 SQL 명령을 실행하십시오.
  6. 완료되면 연결을 닫습니다.

이 단계를 함께 진행합니다.

JDBC 드라이버 찾기

사용하려는 데이터베이스의 드라이버를 찾으려면 데이터베이스 및 JDBC에 대한 웹 검색을 수행하면됩니다. 예를 들어 " mysql jdbc driver"를 입력 하면 MySQL 용 드라이버가 나타납니다. JDBC 드라이버가없는 Java 호환 데이터베이스를 찾으십시오!

1 단계. SQLite 다운로드 및 설치

SQLite는 매우 컴팩트 한 데이터베이스입니다. 프로덕션 용은 아니지만 빠르게 시도해 볼 수있는 좋은 선택입니다. SQLite는 서비스 또는 데몬 설치없이 파일을 기능 데이터베이스로 사용합니다.

이 데모를 시작하려면 SQLite 샘플 데이터베이스를 다운로드하십시오. .db파일의 압축을 풀고 잊지 못할 곳에 저장하십시오.

이 파일에는 기능 파일 기반 데이터베이스와 샘플 스키마 및 우리가 사용할 수있는 데이터가 모두 포함되어 있습니다.

SQL 및 JDBC

NoSQL은 지난 10 년 동안 인기를 얻었지만 관계형 데이터베이스는 여전히 가장 많이 사용되는 데이터 저장소 유형입니다. 관계형 데이터베이스는 열과 행이있는 테이블로 구성된 구조화 된 저장소입니다. SQL (Structured Query Language)은 데이터 아키텍트가 관계형 데이터베이스에서 새 레코드 생성, 읽기, 업데이트 및 삭제와 같은 작업을 수행하는 데 사용하는 언어입니다. JDBC는 Java에서 SQL 로의 어댑터 계층 입니다. 이는 Java 개발자에게 데이터베이스에 연결하고 쿼리 및 명령을 실행하고 응답을 관리하기위한 공통 인터페이스를 제공합니다.

2 단계. Java 애플리케이션으로 JDBC 가져 오기

IDE에서 코딩을 할 수 있지만 텍스트 편집기에서 직접 코딩하면 JDBC의 단순성을 더 잘 보여줄 수 있습니다. 시작하려면 운영 체제에 호환되는 JDK 설치가 필요합니다.

Java 플랫폼 개발자 도구가 설치되어 있다고 가정하면 간단한 Java 프로그램을 작성하여 시작할 수 있습니다. 텍스트 편집기에서 목록 1에 표시된 코드를 붙여 넣으십시오 WhatIsJdbc.java. 이 파일을 호출하십시오 .

Listing 1. 간단한 자바 프로그램

 class WhatIsJdbc{ public static void main(String args[]){ System.out.println("Hello JavaWorld"); } } 

이제 다음 명령을 입력하여 코드를 컴파일하십시오 javac WhatIsJdbc.java.. 컴파일하면 WhatIsJdbc.class파일 이 출력 됩니다. 다음을 호출하여 명령 줄에서이 파일을 실행합니다 java WhatIsJdbc..

[명령 줄에서 JDK와 상호 작용하는 방법에 대한 자세한 내용은 "JDK 란? Java 개발자 키트 소개"를 참조하십시오.]

기본 Java 프로그램이 있으면 JDBC 라이브러리를 포함 할 수 있습니다. 간단한 Java 프로그램의 헤드에 Listing 2의 코드를 붙여 넣으십시오.

Listing 2. JDBC 가져 오기

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; 

이러한 각 가져 오기는 표준 Java 데이터베이스 연결을 용이하게하는 클래스에 대한 액세스를 제공합니다.

  • Connection represents the connection to the database.
  • DriverManager obtains the connection to the database. (Another option is DataSource, used for connection pooling. )
  • SQLException handles SQL errors between the Java application and the database.
  • ResultSet and Statement model the data result sets and SQL statements.

We'll see each of these in action shortly.

Step 3. Add the JDBC driver to your classpath

Next, you'll add the SQLite driver to your classpath. A JDBC driver is a class that implements the JDBC API for a specific database.

Download the SQLite driver from GitHub. Be sure to get the most recent .jar file and store it somewhere you'll remember.

The next time you execute your Java program, you will pull that .jar file in via the classpath. There are several ways to set the classpath. Listing 3 shows how to do it using a command-line switch.

Listing 3. Executing SQLite driver on the Java classpath

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar:. WhatIsJdbc 

Notice that we've set the classpath to point at the driver and the local directory; this way Java will still find our class file.

Step 4. Obtain a database connection

The classpath now has access to the driver. Now, change your simple Java application file to look like the program in Listing 4.

Listing 4. Using the JDBC Connection class to connect to SQLite

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db/chinook/chinook.db"; conn = DriverManager.getConnection(url); System.out.println("Got it!"); } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

Compile and execute this code. Assuming all goes well, you will get an affirming message.

No suitable driver found?

If you've received an error that looks like "No suitable driver found for jdbc:sqlite," then you need to revisit the classpath and make sure it points to the driver you downloaded. Failed driver connection is the most common stumbling block for beginners using JDBC. Don't sweat it; just fix it.

Now we're ready for some SQL commands.

Step 5. Query the database

With the live connection object in hand, we can do something useful, like querying the database. Listing 5 shows how to query SQLite using the JDBC Connection and Statement objects.

Listing 5. Querying the database with JDBC

 import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; class WhatIsJdbc{ public static void main(String[] args) { Connection conn = null; try { String url = "jdbc:sqlite:path-to-db-file/chinook/chinook.db"; conn = DriverManager.getConnection(url); Statement stmt = null; String query = "select * from albums"; try { stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String name = rs.getString("title"); System.out.println(name); } } catch (SQLException e ) { throw new Error("Problem", e); } finally { if (stmt != null) { stmt.close(); } } } catch (SQLException e) { throw new Error("Problem", e); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException ex) { System.out.println(ex.getMessage()); } } } } 

In Listing 5 we use our Connection object to obtain a Statement object: conn.createStatement(). We then use this object to execute an SQL query: stmt.executeQuery(query).

The executeQuery command returns a ResultSet object, which we then use to iterate over the data with while (rs.next()). In this example, you should see the album titles we've queried on as output.

Notice that we also closed the connection, via a call to conn.close().

Network connections with JDBC

The database connection string in Listing 5 is for a local connection: jdbc:sqlite:path-to-db-file/chinook/chinook.db. To access the database via a network, the connection string would need to include the network URL and (usually) credentials for accessing it.

Doing more with JDBC

So far we've covered the basics of using JDBC to connect to a database and issue SQL commands. While Statementss and ResultSets work well for common scenarios, you'll likely need additional options for larger or more complex applications. Fortunately, the JDBC library continues evolving to meet most database access needs.

PreparedStatements

One easy way to increase the flexibility of your code is to replace the Statement class with PreparedStatement, as shown in Listing 6.

Listing 6. Using JDBC PreparedStatements

 String prepState = "insert into albums values (?, ?);"; PreparedStatement prepState = connection.prepareStatement(sql); prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers "); int rowsAffected = preparedStatement.executeUpdate(); 

PreparedStatement replaces Statement's hard-coded values with question marks (?). Using PreparedStatements optimizes your code for reuse: a PreparedStatement is compiled only once, and can then be reused with a variety of parameters. As your code base grows, you simply insert new values into the statement, instead of hacking the string object itself.

Batch updates

Whenever an application has several updates to issue, doing them in batches can greatly benefit performance. The essence of batching is to take the multiple updates and collect them together, then issue them all at once. Listing 7 uses JDBC's batch methods to perform a batch update of several PreparedStatements.

Listing 7. Batching with PreparedStatement

 prepState.setString(1, "Uprising"); prepState.setString(2, "Bob Marley and the Wailers"); preparedStatement.addBatch(); prepState.setString(1, "Wildflowers"); prepState.setString(2, "Tom Petty and the Heartbreakers"); preparedStatement.addBatch(); int[] rowsAffected = preparedStatement.executeBatch(); 

JDBC transactions

Transactions in relational databases allow for a set of updates to be wrapped in an interaction that either succeeds or fails altogether. The basics of using a transaction via JDBC are to tell the system to turn off auto-commit, and then manually tell the system to commit when you are done. By default, auto-commit is on, which means whenever an executeUpdate or executeInsert is run, the command is committed.

Listing 8 shows a small slice of a JDBC transaction.

Listing 8. JDBC transactions

 connection.setAutoCommit(false); // Use executeUpdate multiple times connection.commit(); 

When connection.commit() is encountered, all the updates wrapped inside will be attempted, and if any fail, they all will be rolled back.

There are many more features in JDBC 4.3 worth exploring, including using CallableStatement for stored procedures, using DataSource objects for improved application performance (especially via connection pooling), and converting a JDBC ResultSet to a Java Stream.

Database-specific features

Although every JDBC-compliant database offers the same core features for connecting and interacting with a database via SQL, some databases do more than others. As an example, Oracle DB offers result caching, which is not required by the JDBC specification. Here's an example:

 conn.prepareStatement ("select /*+ result_cache */ * from employees where employee_id < : 1"); 

This example is taken from the documentation for Oracle's JDBC OCI Driver.

Conclusion

JDBC is one of Java's oldest APIs, providing an easy-to-use solution for one of the perennial needs of Java application development. Knowing just the few JDBC calls demonstrated in this article will get you started using JDBC to connect to virtually any database. Once you've got those commands down, you can begin to explore some of the more sophisticated options that have been built into JDBC.

JDBC는 단순한 애플리케이션에 충분하지만 대부분의 개발자는보다 공식적인 데이터 액세스 계층을 개발하기 위해 결국 JPA (Java Persistence API)를 사용하게됩니다. JPA는 더 많은 선행 작업과 애플리케이션 아키텍처에 대한보다 정교한 이해를 필요로하지만 더 일관되고 격리되고 잘 정의 된 데이터 액세스 계층을 제공합니다. Java 애플리케이션을위한 데이터 지속성 계층 개발에 대한 자세한 내용은이 기사의 동반자 인 "JPA 란? Java Persistence API 소개"를 참조하십시오.

이 이야기, "JDBC 란? Java 데이터베이스 연결에 대한 소개"는 원래 JavaWorld에 의해 출판되었습니다.