홈 사용은 안 할건데 기본으로 되어있을 때 한글이 깨지니 그냥 보기 싫으면 이거 추가하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
message.jsp 파일 만들기
그냥 결과만 출력할거다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Message</title>
</head>
<body>
<P>${message}</P>
</body>
</html>
DB 클래스 파일 만들기
외부에 있는 DB 서버의 데이터를 사용하기 위함
기존
import java.sql.Connection;
public class DB {
private String dbFileName;
private String tableName;
private Connection connection;
static {
try { // 이 이름을 가진 DB가 없을 수도 있기 때문에 try~catch
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public DB (String dbFileName, String tableName) {
this.dbFileName = dbFileName;
this.tableName = tableName;
}
public boolean open() {
SQLiteConfig config = new SQLiteConfig();
try {
this.connection = DriverManager.getConnection("jdbc:sqlite:/" + this.dbFileName, config.toProperties());
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
public void close() {
if (this.connection != null) {
try {
this.connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
신규 (generic 사용)
import java.sql.Connection;
public class DB<T> {
private String dbFileName;
private String tableName;
private Connection connection;
static {
try { // 이 이름을 가진 DB가 없을 수도 있기 때문에 try~catch
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public DB (String dbFileName, String tableName) {
this.dbFileName = dbFileName;
this.tableName = tableName;
}
public boolean open() {
SQLiteConfig config = new SQLiteConfig();
try {
this.connection = DriverManager.getConnection("jdbc:sqlite:/" + this.dbFileName, config.toProperties());
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
public void close() {
if (this.connection != null) {
try {
this.connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Create table 만들기
Student.java 객체 클래스를 만들어준다.
package com.kopo.student;
public class Student {
int idx;
String name;
int middleScore;
int finalScore;
Student() {
}
public Student(String name, int middleScore, int finalScore) {
this.name = name;
this.middleScore = middleScore;
this.finalScore = finalScore;
}
public Student(int idx, String name, int middleScore, int finalScore) {
this.idx = idx;
this.name = name;
this.middleScore = middleScore;
this.finalScore = finalScore;
}
}
기존
HomeController
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {
DB db = new DB("경로 및 DB 파일 이름", "student");
if (db.open()) {
db.createTable();
model.addAttribute("message", "create success");
db.close();
} else {
model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
}
return "message";
}
DB
public void createTable() {
String query = "CREATE TABLE " + this.tableName + " (idx INT PRIMARY KEY, name TEXT, middleScore INT, finalScore INT)";
try {
Statement statement = this.connection.createStatement();
statement.executeUpdate(query);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
신규 (객체데이터 사용 & fieldString 사용)
HomeController
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {
DB db = new DB<Student>("경로 및 DB 파일 이름", "student");
if (db.open()) {
db.createTable(new Student());
model.addAttribute("message", "create success");
db.close();
} else {
model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
}
return "message";
}
DB
public void createTable() {
String fieldString = "";
fieldString = fieldString + "idx INT PRIMARY KEY";
fieldString = fieldString + ", name TEXT";
fieldString = fieldString + ", middleScore INT";
fieldString = fieldString + ", finalScore INT";
String query = "CREATE TABLE " + this.tableName + " (" + fieldString + ")";
try {
Statement statement = this.connection.createStatement();
statement.executeUpdate(query);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
위 방법은 객체데이터가 Student일 때만 사용할 수 있다. 거기에 맞춰서 DB query를 만들었기 때문이다.
신규 (generic 사용)
HomeController
위와 동일
DB
public void createTable(T t) { // 기존에는 Student student라고 해서 Student라는 객체가 들어온다 명시를 했다. T는 어떤 객체가 들어올지 모른단 뜻. DB를 DB<T>로 Generic(제네릭)을 사용한다.
Class<?> dataClass = t.getClass(); // t의 Class Object를 가져와 return해서 dataClass라는 변수명에 저장.
Field[] dataClassFields = dataClass.getDeclaredFields(); // dataClass라는 클래스의 변수들을 array로 return.
String fieldString = "";
for (Field field: dataClassFields) { // array로부터 for each 문을 돌면서 하나씩 분해해 쿼리에 넣을 문자열을 만든다.
if (!fieldString.isEmpty()) { // 반복문 처음에는 fieldString이 비어 있기 때문에 콤마를 찍지 않는다. 2번째 반복문 부터 시작할 때 콤마를 찍는다. 따라서 마지막 반복문 때는 앞에만 콤마가 찍히고 뒤에는 콤마가 찍히지 않는다.
fieldString = fieldString + ",";
}
String fieldName = field.getName();
String fieldType = field.getType().toString();
fieldString = fieldString + fieldName;
if (fieldName.matches("idx")) {
fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
} else if (fieldType.matches("(int|long)")) {
fieldString = fieldString + " INTEGER";
} else if (fieldType.matches("(float|double)")) {
fieldString = fieldString + " REAL";
} else if (fieldType.matches(".*String")) {
fieldString = fieldString + " TEXT";
}
}
String query = "CREATE TABLE " + this.tableName + " (" + fieldString + ")";
try {
Statement statement = this.connection.createStatement();
statement.executeUpdate(query);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
generic을 사용(여기서는 T)해서 어떤 객체 데이터가 들어오든 만능으로 돌아가도록 반응형으로 만든다!
위와 같은 방법은 'java get class properties' 등으로 검색하면 된다.
여기까지 정리하면
HomeController
package com.kopo.student;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
// 쿼리를 이용해 테이블 생성하기.
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {
DB db = new DB<Student>("경로 및 DB 파일 이름", "student");
if (db.open()) {
db.createTable(new Student());
model.addAttribute("message", "create success");
db.close();
} else {
model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
}
return "message";
}
}
DB
package com.kopo.student;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import org.sqlite.SQLiteConfig;
public class DB<T> {
private String dbFileName;
private String tableName;
private Connection connection;
static {
try { // 이 이름을 가진 DB가 없을 수도 있기 때문에 try~catch
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public DB (String dbFileName, String tableName) {
this.dbFileName = dbFileName;
this.tableName = tableName;
}
public boolean open() {
SQLiteConfig config = new SQLiteConfig();
try {
this.connection = DriverManager.getConnection("jdbc:sqlite:/" + this.dbFileName, config.toProperties());
return true;
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
public void close() {
if (this.connection != null) {
try {
this.connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public void createTable(T t) { // 기존에는 Student student라고 해서 Student라는 객체가 들어온다 명시를 했다. T는 어떤 객체가 들어올지 모른단 뜻. DB를 DB<T>로 Generic(제네릭)을 사용한다.
Class<?> dataClass = t.getClass(); // t의 Class Object를 가져와 return해서 dataClass라는 변수명에 저장.
Field[] dataClassFields = dataClass.getDeclaredFields(); // dataClass라는 클래스의 변수들을 array로 return.
String fieldString = "";
for (Field field: dataClassFields) { // array로부터 for each 문을 돌면서 하나씩 분해해 쿼리에 넣을 문자열을 만든다.
if (!fieldString.isEmpty()) {
fieldString = fieldString + ",";
}
String fieldName = field.getName();
String fieldType = field.getType().toString();
fieldString = fieldString + fieldName;
if (fieldName.matches("idx")) {
fieldString = fieldString + " INTEGER PRIMARY KEY AUTOINCREMENT";
} else if (fieldType.matches("(int|long)")) {
fieldString = fieldString + " INTEGER";
} else if (fieldType.matches("(float|double)")) {
fieldString = fieldString + " REAL";
} else if (fieldType.matches(".*String")) {
fieldString = fieldString + " TEXT";
}
}
String query = "CREATE TABLE " + this.tableName + " (" + fieldString + ")";
try {
Statement statement = this.connection.createStatement();
statement.executeUpdate(query);
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
message.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Message</title>
</head>
<body>
<P>${message}</P>
</body>
</html>
이번에는 위 코드를 활용해 Color 객체데이터랑 Memo 객체데이터를 활용해 DB를 만들어보자.
Color.java
package com.kopo.student;
public class Color {
int idx;
String name;
String code;
Color() {
}
public Color(String name, String code) {
this.name = name;
this.code = code;
}
public Color(int idx, String name, String code) {
this.idx = idx;
this.name = name;
this.code = code;
}
}
HomeController
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {
// DB db = new DB<Student>(".../student.db", "student");
DB db = new DB<Color>(".../color.db", "color"); // 여기를 바꿔준다. (DB 파일과 테이블)
if (db.open()) {
// db.createTable(new Student());
db.createTable(new Color()); // 여기를 바꿔준다. (createTable에 보낼 객체 데이터)
model.addAttribute("message", "create success");
db.close();
} else {
model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
}
return "message";
}
Memo도 동일하다.
package com.kopo.student;
public class Memo {
int idx;
String memo;
Memo() {
}
Memo (String memo) {
this.memo = memo;
}
Memo (int idx, String memo) {
this.idx = idx;
this.memo = memo;
}
}
HomeController
@RequestMapping(value = "/create", method = RequestMethod.GET)
public String create(Locale locale, Model model) {
// DB db = new DB<Student>(".../student.db", "student");
// DB db = new DB<Color>(".../color.db", "color");
DB db = new DB<Color>(".../memo.db", "memo");
if (db.open()) {
// db.createTable(new Student());
// db.createTable(new Color());
db.createTable(new Memo());
model.addAttribute("message", "create success");
db.close();
} else {
model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
}
return "message";
}
'개발자 > Java' 카테고리의 다른 글
Java (자바) CRUD 정리 3 static ★클래스 메소드, 인스턴스 메소드★ (0) | 2020.09.06 |
---|---|
Java (자바) CRUD 정리 2 Insert/Update(객체데이터, fieldString, Generic, null체크, 숫자체크) (0) | 2020.09.03 |
전자정부 프레임 시작하기 2 (게시판 예제) (0) | 2020.07.09 |
전자정부 프레임 시작하기 1 (설치) (0) | 2020.07.08 |
리눅스에서 자바 설치 openjdk 내려받기 (0) | 2020.06.30 |