지난 글에서 Gson 라이브러리를 사용해 get 호출로 받은 Json 데이터를 파싱하여 객체에 저장하였다. 이번 글에서는 MariaDB를 사용하여 java에서 객체를 데이터베이스를 저장한다.
1. DB 시스템 구성(MariaDB)
MariaDB를 로컬에 기본 port, localhost:3306으로 구성하였으며, test 계정을 생성하고, 권한을 부여하였다.
use mysql;
SELECT HOST, USER, PASSWORD FROM USER;
CREATE USER '아이디'@'%' IDENTIFIED BY '비밀번호';
create user 'test'@'localhost' identified by 'password';
-- 사용자 권한 주기
GRANT ALL PRIVILEGES ON 데이터베이스.* TO '아이디'@'%';
FLUSH PRIVILEGES; -> 꼭 반영을 해줘야 한다
2. DB 테이블 구성
create table swifi
(
SWIFI_MGR_NO varchar(10) not null
primary key,
SWIFI_WRDOFC varchar(50) null,
SWIFI_MAIN_NM varchar(50) null,
SWIFI_ADRES1 varchar(50) null,
SWIFI_ADRES2 varchar(50) null,
SWIFI_INSTL_FLOOR varchar(50) null,
SWIFI_INSTL_TY varchar(50) null,
SWIFI_INSTL_MBY varchar(50) null,
SWIFI_SVC_SE varchar(50) null,
SWIFI_CMCWR varchar(50) null,
SWIFI_CNSTC_YEAR year null,
SWIFI_INOUT_DOOR varchar(50) null,
SWIFI_REMARS3 varchar(50) null,
LAT double null,
LNT double null,
WORK_DTTM datetime null
);
3. Connection, PreparedStatement, ResultSet
java 내에서 DB로 sql문을 날리기 위해서는 Class.forName("org.mariadb.jdbc.Driver") mariadb 드라이버로 connection을 열어야한다. 먼저 pom.xml 파일 mariadb-java-client 최신 버전을 로드해야 한다.
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.1.3</version>
</dependency>
아래 코드는 table에 insert, select 문을 보내어 table에 값을 채우거나 값을 가져와 읽는 함수를 구현하였다.
public void getWifiList() {
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
String whereId = "ttttt";
// 좌표값 가까운 리스트들 조회해야됨
try {
// SQLite JDBC 드라이버를 로드합니다.
Class.forName("org.mariadb.jdbc.Driver");
// 데이터베이스에 연결합니다.
conn = DriverManager.getConnection(url,dbId,dbPwd);
// 쿼리를 실행합니다.
String sql = " select id, name, password, age from member " +
" where id = ? ";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, whereId);
rs = preparedStatement.executeQuery();
// 결과를 처리합니다.
while (rs.next()) {
// 결과 처리 코드
String memberId = rs.getString("id");
String userName = rs.getString("name");
String password = rs.getString("password");
String age = rs.getString("age");
System.out.println(memberId +", " + userName + ", " + password + ", " + age);
}
} catch (SQLException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}finally {
// 연결을 닫습니다.
try {
if (rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
public void insertWifiList(ArrayList<Wifi> wifi) {
Connection conn = null;
PreparedStatement preparedStatement = null;
ResultSet rs = null;
if(wifi.size() == 0){
return;
}
try {
// SQLite JDBC 드라이버를 로드합니다.
Class.forName("org.mariadb.jdbc.Driver");
// 데이터베이스에 연결합니다.
conn = DriverManager.getConnection(url,dbId,dbPwd);
int affected = 0;
for (int i = 0; i < wifi.size(); i++) {
// 쿼리를 실행합니다.
String sql = " REPLACE swifi (SWIFI_MGR_NO, SWIFI_WRDOFC, SWIFI_MAIN_NM, SWIFI_ADRES1, SWIFI_ADRES2, SWIFI_INSTL_FLOOR, SWIFI_INSTL_TY, SWIFI_INSTL_MBY, SWIFI_SVC_SE, SWIFI_CMCWR, SWIFI_CNSTC_YEAR, SWIFI_INOUT_DOOR, SWIFI_REMARS3, LAT, LNT, WORK_DTTM) VALUES " +
"( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ";
preparedStatement = conn.prepareStatement(sql);
preparedStatement.setString(1, wifi.get(i).getX_SWIFI_MGR_NO());
preparedStatement.setString(2, wifi.get(i).getX_SWIFI_WRDOFC());
preparedStatement.setString(3, wifi.get(i).getX_SWIFI_MAIN_NM());
preparedStatement.setString(4, wifi.get(i).getX_SWIFI_ADRES1());
preparedStatement.setString(5, wifi.get(i).getX_SWIFI_ADRES2());
preparedStatement.setString(6, wifi.get(i).getX_SWIFI_INSTL_FLOOR());
preparedStatement.setString(7, wifi.get(i).getX_SWIFI_INSTL_TY());
preparedStatement.setString(8, wifi.get(i).getX_SWIFI_INSTL_MBY());
preparedStatement.setString(9, wifi.get(i).getX_SWIFI_SVC_SE());
preparedStatement.setString(10, wifi.get(i).getX_SWIFI_CMCWR());
preparedStatement.setString(11, wifi.get(i).getX_SWIFI_CNSTC_YEAR());
preparedStatement.setString(12, wifi.get(i).getX_SWIFI_INOUT_DOOR());
preparedStatement.setString(13, wifi.get(i).getX_SWIFI_REMARS3());
preparedStatement.setString(14, wifi.get(i).getLAT());
preparedStatement.setString(15, wifi.get(i).getLNT());
preparedStatement.setString(16, wifi.get(i).getWORK_DTTM());
affected += preparedStatement.executeUpdate();
}
// 결과를 처리합니다.
if(affected == wifi.size()){
System.out.println("Wifi insert 성공");
}else{
System.out.println("Wifi insert 실패");
}
} catch (SQLException e) {
throw new RuntimeException(e);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}finally {
// 연결을 닫습니다.
try {
if (rs != null && !rs.isClosed()) {
rs.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
if (preparedStatement != null && !preparedStatement.isClosed()) {
preparedStatement.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
try {
if (conn != null && !conn.isClosed()) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
다음 글에는 DB에 저장된 값을 나의 위치 기반으로 가까운 순으로 값을 가져오는 방법에 대해 생각해봐야겠다.
방안 1. 전체 list에서 위도, 경도 값을 가져와 나의 위치와 비교하여 가까운 순 표현
방안 2. 같은 동네에 있는 객체들만 가져와 가까운 순 표현
'Backend' 카테고리의 다른 글
SOLID : 객체 지향 설계 5원칙 (0) | 2023.05.12 |
---|---|
openApi 활용(4) : servlet redirection, GeoLocation, 버튼 구현 (0) | 2023.04.17 |
openApi 활용(2) : gson (0) | 2023.04.11 |
openApi 활용(1) : okhttp3 사용해보기 (0) | 2023.04.11 |