Java Datebase Connectivity의 줄임말이다.
JDBC를 이용한 프로그래밍 방법은 아래와 같다.
- import java.sql.*;
- 드라이버 로드하기
- Connection 객체 생성하기
- Statement 객체를 생성 및 질의 수행하기
- SQL문에 결과물이 있다면 ResultSet 객체를 생성하기
- 모든 객체 닫기
Class.forName("com.mysql.jdbc.Driver")
String dburl = @url
Connection con = DriverManager.getConnection(dburl, ID, PWD)
실제 쿼리를 작성할 때 사용한다.
Statement stmt = con.createStatement()
ResultSet rs = stmt.executeQuery("select no from user")
stmt.execute("query") : any SQL
stmt.executeQuery("query") : SELECT
stmt.executeUpdate("quere") : INSERT, UPDATE, DELETE
DB에서 결과값을 받아오면 된다.
ResultSet rs = stmt.executeQuery("select no from user")
while(rs.next())
System.out.println(rs.getInt("no"))
이번에는 JDBC를 이용해 DB에서 CRUD를 하는 프로그램을 만들어보자.
이번 프로젝트는 순수 java를 이용하는 프로젝트로, maven을 사용한다.
cd /usr/local/mysql/bin
./mysql -u root -p 해당 명령어로 mysql 서버를 켰다.
CREATE USER 'connectuser'@'%' IDENTIFIED BY 'connect123!@#';
grant all privileges on connectdb.* to connectuser@'%';
flush privileges;
위의 코드로 connectuser 계정을 생성하고 connect123!@#'로 비밀번호를 부여하였다.
이제 connectuser 계정으로 CRUD 작업을 수행할 수 있다.
1.mysql 로그인 -> 데이터베이스 선택하기
2.source <파일경로>
해당 방법으로 이미 만들어놓은 sql파일을 서버에 업로드하였다.
public class Role {
private Integer roleId;
private String description;
public Role() {
}
public Role(Integer roleId, String description) {
super();
this.roleId = roleId;
this.description = description;
}
public Integer getRoleId() {
return roleId;
}
public void setRoleId(Integer roleId) {
this.roleId = roleId;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Role [roleId=" + roleId + ", description=" + description + "]";
}
}
Dto패키지 안에 Role폴더를 만들어 class에 생성자, getter, setter, toString를 만든다.
이렇게해서 Role 객체를 DB에 저장하고 불러올 수 있다.
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
private static String dbUser = "connectuser";
private static String dbpasswd = "connect123!@#";
public Role getRole(Integer roleId) {
Role role = null;
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, roleId);
rs = ps.executeQuery();
if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return role;
}
}
RoleDao를 만들었다.
여기서는 JDBC 객체를 연결해서 DB에 Role객체를 저장한다.
String sql = "SELECT description,role_id FROM role WHERE role_id = ?"; 여기서 ?는 ps.setInt(1, roleId); 를 통해 roleId 값이 들어가게 된다. 참고로, 1은 첫번재 물음표라는 의미이다.
DB에 값이 있다면, 값을 가져온다.
if (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
role = new Role(id, description);
}
실행한 쿼리에서 값을 가져오는데 순서가 포인트이다.
String sql = "SELECT description,role_id FROM role WHERE role_id = ?";
해당 코드에서 description 다음 role_id를 작성하였다.
때문에, 가져올때도 description, role_id 순서대로 가져올 수 있다.
description을 가져올 때처럼 1,2로 작성할 수도 있고 id를 가져올 때 처럼 쿼리문에 있는 column명을 써서 가져올 수도 있다.
이번에는 DB에 데이터를 넣어보겠다.
package kr.or.connect.jdbcexam.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
private static String dbUser = "connectuser";
private static String dbpasswd = "connect123!@#";
public int addRole(Role role) {
int insertCount = 0;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "INSERT INTO role (role_id, description) VALUES ( ?, ? )";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setInt(1, role.getRoleId());
ps.setString(2, role.getDescription());
insertCount = ps.executeUpdate();
} catch (Exception ex) {
ex.printStackTrace();
}
return insertCount;
}
}
dao 패키지 안에 RoleDao class를 생성하였다.
그리고 JDBC를 연결하는데 이번에는 dto 할 때와 달리 코드가 굉장히 줄어들었다.
왜냐하면, finally 부분에서 객체를 close하는 부분이 빠졌기 때문인데 try문 안에 conn과 ps를 적게되면 자동으로 해주기 때문에 코드를 간소화할 수 있다.
이 방법을 훨씬 추천한다.
해당 코드에서도 role_id와 description의 순서에 주의하여서 Role객체 값을 DB에 저장하였다.
이번에는 Role 테이블에 있는 모든 데이터를 가져오는 실습을 해보았다.
public class RoleDao {
private static String dburl = "jdbc:mysql://localhost:3306/connectdb";
private static String dbUser = "connectuser";
private static String dbpasswd = "connect123!@#";
public List<Role> getRoles() {
List<Role> list = new ArrayList<>();
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
String sql = "SELECT description, role_id FROM role order by role_id desc";
try (Connection conn = DriverManager.getConnection(dburl, dbUser, dbpasswd);
PreparedStatement ps = conn.prepareStatement(sql)) {
try (ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
String description = rs.getString(1);
int id = rs.getInt("role_id");
Role role = new Role(id, description);
list.add(role); // list에 반복할때마다 Role인스턴스를 생성하여 list에 추가한다.
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
}
모든 Role 객체들을 가져올 것이기 때문에 List<Role> 를 리턴하도록 한다.
그리고 while(rs.next())를 통해 description과 id를 가져오고 Role 인스턴스를 list에 추가한다.
while(rs.next()) 는 모든 데이터를 다 돌 수 있도록 한다.
이제 다음에는 JDBC를 활용해서 명함 관리 프로그램을 만들어보자.