summary

먼저 아파치 톰캣이 이클립스에 연동되어있다고 가정한다.
서블릿으로 웹요청을 받아들여 디비랑 통신하기 위한 코드에 대한 템플릿이다. 

DB와의 통신은 서블릿 코드에서 DBConnect.java를 통해 디비에 접속하고 Dao를 통해 질의문을 작성한다.


template_server.zip

git

프로젝트 생성

이클립스 > File > New > Dynamic Web Project

서블릿 파일 생성

File > New > Servlet > 아래 코드

package templete_server.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class GetData
 */
@WebServlet(name = "GetData", urlPatterns = { "/GetData" })
public class GetData extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public GetData() {
		super();
		// TODO Auto-generated constructor stub
	}

	protected void processRequest(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();

		/////////////////////////////////////////////////////////////////
		// HTML SOURCE CODE
		out.println("<html>");
		out.println("<head>");
		out.println("<title>Servlet GetData</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Servlet GetData at " + request.getContextPath()
				+ "</h1>");
		out.println("<p>");
		out.println("get data : " + request.getParameter("id"));
		out.println("</body>");
		out.println("</html>");

		out.println("");
		// HTML SOURCE CODE
		/////////////////////////////////////////////////////////////////

		String id = request.getParameter("id");
		System.out.println(id);
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processRequest(request, response);
	}

}

DB Connect ( Mysql)

jdbc나 mysql 드라이버는 'WebContent > WEN-INF > lib' 안에 넣어주어야 한다.

첫 번째 코드는 DB를 연결하기 위함이고, 두 번째 코드는 질의문을 서버에 작성할 수 있다.


DBConnector.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnector {
	private String driver = "com.mysql.jdbc.Driver";
	private String url = "jdbc:mysql://localhost:3306/dbschema?useUnicode=true&characterEncoding=UTF-8";
	private String user = "userid";	//DB user ID
	private String pwd = "password";	//DB user Password
	private Connection conn = null;
	
	public Connection getConnection(){
		try{
			Class.forName(driver);
		}catch(ClassNotFoundException e){
			System.out.println("BusInfoSystem : 드라이버 로딩 실패(getConnection)");
			System.out.println(e.getMessage());
		}
		try{
			conn = DriverManager.getConnection(url,user,pwd);
		}catch(SQLException e){
			System.out.println("BusInfoSystem : DB 연결 실패(getConnection)");
			System.out.println(e.getMessage());
		}
		return conn;
	}
}

tempateDao.java
package templete_server.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class templateDao {

	private DBConnector dbc;

	public templateDao() {
		dbc = new DBConnector();
	}

	public int getData(int arg1) {
		int result = 0;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		String sql = new String("select * from dbtable where ID = ?;");

		conn = dbc.getConnection();
		try {
			ps = conn.prepareStatement(sql);
			ps.setInt(1, arg1);
			rs = ps.executeQuery();
			rs.first();
			while (true) {
				result = rs.getInt("id");
				if (rs.isLast())
					break;
				rs.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeDB(rs, ps, conn);
		}

		return result;
	}

	/**
	 * DataBase 자원 반환
	 * 
	 * @param rs
	 * @param ps
	 * @param conn
	 */
	private void closeDB(ResultSet rs, Statement ps, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (Exception e) {
			}
		}
		if (ps != null) {
			try {
				ps.close();
			} catch (Exception e) {
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (Exception e) {
			}
		}
	}
}


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


캐릭터셋 확인하기


mysql> show variables like 'char%';


캐릭터셋 변경하기


MySQL이 설치된 곳에서 my.ini 파일에 아래 코드를 입력 후 mysql을 재가동시킨다.

없다면 my-default.ini 파일을 복사하여 이름을 바꾸어 준다.

# 2014-07-21 utf setting
character-set-client-handshake = FALSE
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
character-set-server = utf8

[client]
default-character-set = utf8

[mysql]
default-character-set = utf8

[mysqldump]
default-character-set = utf8


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


오토커밋(AUTOCOMMIT) 상태 확인, 변경하기


상태 확인하기
SQL> select @@autocommit;

변경하기
# 설정
SQL> set autocommit = 1;
SQL> set autocommit = TRUE;
# 해제
SQL> set autocommit = 0;
SQL> set autocommit = FALSE;


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


함수 만들기

DELIMITER $$
DROP FUNCTION IF EXISTS `db_name.function_name`$$
CREATE  FUNCTION `db_name.function_name`(stID int, endID int, line int) RETURNS int
    DETERMINISTIC
BEGIN

Declare stOrd int;
declare endOrd int;
declare result int;

select ord into stOrd 
from busstoplinelist 
where BusLineID = line and BusStopID = stID;

select ord into endOrd 
from busstoplinelist 
where BusLineID = line and BusStopID = endID;

RETURN endOrd - stOrd;
    END$$
DELIMITER ;

select function_name(421, 423, 1525);
DELIMITER : $$ 문장의 끝을 $$로 바꾸어준다는 뜻
DETERMINISTIC : Link

예외 처리

delimiter $$

DROP PROCEDURE IF EXISTS db_name.procedure_name$$

CREATE PROCEDURE db_name.procedure_name(IN num INT, IN ch VARCHAR(2))

BEGIN

     DECLARE err INT DEFAULT '0'; 
     DECLARE CONTINUE HANDLER FOR SQLEXCEPTION  SET err = -1; 

     START TRANSACTION;

     INSERT INTO table_name VALUES (num, ch);     // 성공
     INSERT INTO table_name VALUES (ch, num);     // 실패

     IF err < 0 THEN 
          ROLLBACK; 
     ELSE 
          COMMIT; 

     END IF; 

END $$

delimiter ;


참고사이트 Link

 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


문제점

컴퓨터 강제종료시 발생하는 것 같다. 

error log
2014-07-09 11:01:56 2280 [Note] Plugin 'FEDERATED' is disabled.
2014-07-09 11:01:56 1248 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
2014-07-09 11:01:56 2280 [Note] InnoDB: Using atomics to ref count buffer pool pages
2014-07-09 11:01:56 2280 [Note] InnoDB: The InnoDB memory heap is disabled
2014-07-09 11:01:56 2280 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2014-07-09 11:01:56 2280 [Note] InnoDB: Compressed tables use zlib 1.2.3
2014-07-09 11:01:56 2280 [Note] InnoDB: Not using CPU crc32 instructions
2014-07-09 11:01:56 2280 [Note] InnoDB: Initializing buffer pool, size = 165.0M
2014-07-09 11:01:56 2280 [Note] InnoDB: Completed initialization of buffer pool
2014-07-09 11:01:56 2280 [Note] InnoDB: Highest supported file format is Barracuda.
2014-07-09 11:01:56 2280 [Note] InnoDB: The log sequence numbers 1810266 and 1810266 in ibdata files do not match the log sequence number 1810276 in the ib_logfiles!
2014-07-09 11:01:56 2280 [Note] InnoDB: Database was not shutdown normally!
2014-07-09 11:01:56 2280 [Note] InnoDB: Starting crash recovery.
2014-07-09 11:01:56 2280 [Note] InnoDB: Reading tablespace information from the .ibd files...
2014-07-09 11:01:56 2280 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous tablespace bis/busstop uses space ID: 2 at filepath: .\bis\busstop.ibd. Cannot open tablespace mysql/innodb_index_stats which uses space ID: 2 at filepath: .\mysql\innodb_index_stats.ibd
InnoDB: Error: could not open single-table tablespace file .\mysql\innodb_index_stats.ibd
InnoDB: We do not continue the crash recovery, because the table may become
InnoDB: corrupt if we cannot apply the log records in the InnoDB log to it.
InnoDB: To fix the problem and start mysqld:
InnoDB: 1) If there is a permission problem in the file and mysqld cannot
InnoDB: open the file, you should modify the permissions.
InnoDB: 2) If the table is not needed, or you can restore it from a backup,
InnoDB: then you can remove the .ibd file, and InnoDB will do a normal
InnoDB: crash recovery and ignore that table.
InnoDB: 3) If the file system or the disk is broken, and you cannot remove
InnoDB: the .ibd file, you can set innodb_force_recovery > 0 in my.cnf
InnoDB: and force InnoDB to continue crash recovery here.


해결방안

C:\Program Files\MySQL\MySQL Server 5.6\data\mysql 이나 data가 저장되는 폴더의 mysql폴더로 이동한다.

폴더를 하나 생성하고 아래와 같은 파일 이동시킨다. 즉 백업하고서 mysql 을 다시 실행 시킨다.

innodb_index_stats.frm 
innodb_index_stats.ibd 
innodb_table_stats.frm 
innodb_table_stats.ibd 
slave_master_info.ibd 
slave_relay_log_info.frm 
slave_relay_log_info.ibd 
slave_worker_info.frm 
slave_worker_info.ibd


참고사이트 링크1, 링크2, 링크3


문제점

▶ 사용자 추가할때 에러 발생
ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value

해결방안

▶ mysql 버전이 높아지면서 보안관련 오류라고 한다. 사용자추가시 몇개의 필드를 추가한다.

로컬접근 허용 mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) -> values ('localhost','사용자명',password('비밀번호'),'','','');

외부접근 허용 mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) -> values ('%','사용자명',password('비밀번호'),'','','');


문제점


해결방안

▶ 아래 명령어 입력
mysqld --skip-grant-tables
▶ 확인하기
mysql -u root  mysql
mysql> show databases;


1. mysql-connector Librarie추가

현재 프로젝트 오른쪽 클릭 - Properties - Java Build Path - Add External JARs...

Download Connector/J Link

(mysql 설치시 Java Connector 도 같이 설치된다.)





2. MySQL DB, Java 코드로 연동하기

public class TestClass {
	public static void main(String[] args) {
		Connection con = null;
		Statement st = null;
		ResultSet rs = null;

		try {

			con = DriverManager.getConnection("jdbc:mysql://localhost", "root",
					"1234");

			st = con.createStatement();
			rs = st.executeQuery("SHOW DATABASES");

			if (st.execute("SHOW DATABASES")) {
				rs = st.getResultSet();
			}

			while (rs.next()) {
				String str = rs.getNString(1);
				System.out.println(str);
			}
		} catch (SQLException sqex) {
			System.out.println("SQLException: " + sqex.getMessage());
			System.out.println("SQLState: " + sqex.getSQLState());
		} finally {
			if (rs != null) { try { rs.close(); } catch (Exception e) {}}
			if (st != null) { try { st.close(); } catch (Exception e) {}}
			if (conn != null) { try {conn.close();} catch (Exception e) {}}
		}
	}
}

문제점

SQLException: No suitable driver found for jdbc:mysql://localhost
▶ 해결방법 : 위 1번 드라이버 추가했는지 확인할 것.


SQLException: Access denied for user 'root'@'localhost' (using password: YES)
▶ 해결방법 : 링크


 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-2600K CPU @ 3.40GHz 3.40GHz

 Memory

 8.00 GB

 OS

 Windows 7 Professional K 64bit

 Java

 1.8.0_05

 MySQL

 Ver 14.14 Distrib 5.6.19, for Win64


MySQL data 디렉토리 변경하기

확실한 방법인지는 모르겠다. my.ini을 찾아보려해도 없어 WorkBench 를 이용해 바꾸어 보았다.

(이에 대한 문제는 책임지지 않는다.)


1. 먼저 MySQL 을 Stop한 뒤에 WorkBench를 실행하고 왼쪽에 Options File를 클릭하고 datadir의 경로를 바꾸어 주었다.


2. 기존 data 폴더에 있는 두개의 디렉토리를 복사하여 변경한 디렉토리에 넣어준다.


3. MySQL 을 Start 한다.


 실행환경

 Notebook

 SAMSUNG NT550p5c-s61r

 CPU

 Intel Core i5-3210M 2.50GHz

 Memory

 8 GB

 OS

 Window 7 ultimate 64bit

 Java

 1.8.0_05

 Android SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3 (Jelly Bean)

 WebServer

 Apache Tomcat 7.0


1. 엑셀파일 변환하기



먼저 엑셀파일을 구분자로 나눠진 파일로 변환한다. 

(1)쉼표로 분리한 .csv 파일이나 (2)탭으로 분리된 텍스트파일중 상황에 맞게 할 수 있다.


2. SQLite DB에 import하기

1) 위에서 생성한 파일을 android SDK가 설치된 디렉토리 내 tools 폴더로 이동한다. 

그리고 커맨트 창을 띄우고 tools 폴더로 이동한다.



2) .db 파일을 생성한다. sqlite2.exe [db파일명] 으로 생성하거나 기본의 db파일을 읽어온다.

테이블을 생성하고 테이블을 확인해보았다.


DB 명령문


3) .separator "[구분자]" 명령어를 통해 구분자를 구분하고, .import [구분되어진 파일] [테이블명] 으로 데이터를 가져온다. import할 파일은 확장자까지 입력한다. 

데이터가 import되었는지 확인하기 위해서는 sqlite>select * from [테이블명]; 으로 확인한다.




LOAD DATA LOCAL INFILE 'D:/project/file.csv' 
INTO TABLE dbName.tableName
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
IGNORE 1 ROWS;

참조 Link

sql>password;
패스워드를 변경한다.



MySQL DB export, import

Export(내보내기) mysqldump -h 호스트명 -u 사용자명 -p DB명 > 경로\저장할파일명.sql Import(가져오기) mysql -h 호스트명 -u 사용자명 -p DB명 < 경로\가져올파일명.sql

* C 드라이브에서 오류 발생할 수 있으니, 다른 드라이브에 저장 후 실행할 것.

MySQL data export, import

→data export, import 는 테스트해보지 않았으므로 확실하지 않음.

Export(내보내기) select * into outfile "/temp/file.dump" fields terminated by '\t' optionally enclosed by '"' lines terminated by '\n' from [dababase.tablename]; Import(가져오기) LOAD DATA INFILE 'file.dump' INTO TABLE [dababase.tablename] FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n';


참고사이트

'Database > MySQL' 카테고리의 다른 글

[MySQL] MySQL 환경변수 설정하기  (0) 2014.08.04
[MySQL] csv 파일 import 하기  (0) 2014.07.23
[MySQL] ODBC 설치 및 설치 에러: Error 1918  (0) 2014.06.25
[MySQL] MySQL 설치하기  (0) 2014.06.25

1. MySQL 설치파일 다운받기

먼저 링크를 통해 MySQL 홈페이지에서 설치파일을 받는다.


2. MySQL 설치하기






Connector/ODBC 이 설치가 되지않는다면 추후에 받도록 한다.






root의 비밀번호를 지정해준다.





데이터베이스 생성하기

mysql> create database DB명;

혹은 mysql> create schema 스키마명;

두 명령어는 같은 역할을 한다. 참고


데이터베이스 제거하기

mysql> delete from db where db='DB명';

혹은 mysql> drop database DB명;


! 변경사항 적용하기 위해 아래 명령어 사용.

mysql >flush privileges;




'Database > MySQL' 카테고리의 다른 글

[MySQL] ODBC 설치 및 설치 에러: Error 1918  (0) 2014.06.25
[MySQL] MySQL 설치하기  (0) 2014.06.25
[MySQL] root 계정 비밀번호 변경하기  (0) 2014.03.15
[MySQL] 버전 확인하기  (2) 2014.03.05

사용자 확인, 사용자 추가


▶ 사용자 확인

mysql> use mysql;
mysql> select user, host from user;
▶ 사용자 추가

로컬접근 허용 mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) -> values ('localhost','사용자명',password('비밀번호'),'','','');

외부접근 허용 mysql> insert into user(host,user,password,ssl_cipher,x509_issuer,x509_subject) -> values ('%','사용자명',password('비밀번호'),'','','');

▶ 사용자 삭제
mysql> drop user 사용자명@호스트;
▶ 변경사항 적용
mysql> flush privileges;

사용자 데이터베이스 권한 부여, 박탈(삭제)

*grant 문을 이용하면 flush privileges 를 할 필요가 없다.


▶ 모든 권한 주기
mysql> grant all privileges on *.* to 사용자명@호스트
     -> identified by '비밀번호' with grant option;
▶ 특정 사용자에게 특정 DB의 모든 테이블에 모든 권한 부여하기
mysql> grant all privileges on DB명.* to 사용자명@호스트 identified by '비밀번호';
▶ 특정 사용자에게 특정 DB의 모든 테이블에 select, insert 권한 부여하기
mysql> grant select, insert on DB명.* to 사용자명@호스트 
     -> identified by '비밀번호';
▶ 특정 사용자에게 특정 DB의 특정 테이블의 정해준 컬럼에만 update 권한 부여하기
mysql> grant update(컬럼1,컬럼2,컬럼3) on DB명.테이블명 to 사용자명@호스트
     -> identified by '비밀번호';
▶ 모든 호스트에서 접속가능하고 select 권한만 갖는 사용자를 추가할 땐
mysql> grant select on DB명.* to 사용자명@% identified by '비밀번호';
▶ ip주소가 192.168.0.으로 시작하는 컴퓨터에서 접속가능한 사용자를 추가할 땐
mysql> grant all privileges on *.* to 사용자명@'192.168.0.%' identified by '비밀번호';


▶ 모든 권한 삭제
mysql> REVOKE ALL PRIVILEGES ON *.* FROM 사용자명@호스트;
▶ usage (삭제하면 로그인조차 안됨) 권한 부여, 삭제

usage 권한 부여 mysql> GRANT USAGE ON *.* TO USER_NAME@HOST IDENTIFIED BY 'USER_NAME'; usage 권한 삭제 mysql> REVOKE USAGE ON *.* FROM USER_NAME@HOST;


▶ 권한 확인하기
mysql> SHOW GRANTS FOR 사용자명;


참고사이트



'Database > MySQL' 카테고리의 다른 글

[MySQL] root 계정 비밀번호 변경하기  (0) 2014.03.15
[MySQL] 버전 확인하기  (2) 2014.03.05
[MySQL] 원격 접속 하기  (0) 2014.01.26
[MySQL] 명령문  (0) 2014.01.06

상단에 Downloads 탭 선택


JDBC Drivers 클릭


각자 사용할 드라이버 선택해서 로그인후 다운받음




행정안전부에서 제공하는 도로명주소 데이터입니다.


도로명 주소 검색


도로명 주소 DB


도로명 주소 매칭테이블


 

DBMS(Database Management System)

  • 중복성 통제 – 데이터의 사전 검증을 통해서 중복된 데이터를 최소화 시키게 된다. 그렇기 때문에 조인을 이용하게 되며 적은 저장 공간으로 많은 데이터를 관리할 수 있게 된다. 이러한 데이터 중복성 통제는 데이터의 저장, 개발, 성능 및 유지보수 측면에서 장점을 갖게 된다.
  • 메타 데이터 관리 – 데이터의 관계나 특성들이 메타 데이터에 저장된다. 이러한 메타 데이터의 관리로 관련 프로그램들의 수정 없이도 데이터의 구조적인 변경이 가능하게 된다.
  • 사용자 중심의 데이터 처리 – 데이터간의 복잡한 관계는 DBMS가 처리해 줌으로써 사용자에 의한 데이터 처리가 좀더 용이해 진다. 또한 대부분의 DBMS는 다중 사용자를 위해서 다양하고 용이한 인터페이스를 제공하고 있다.
  • 데이터의 일관성 유지 – 중앙 집중식 통제로 동일한 사실을 표현하는 데이터들간의 불일치를 방지하고 동질성을 보장하게 된다.
  • 데이터의 정합성 보장 – DBMS는 입력이나 갱신 작업을 수행할 때마다 사용된 데이터가 규칙에 위배되지 않는 정확한 값인가를 검사하여 유효한 데이터만 허용하게 된다. 이와 같이 데이터 정합성 검증이 수행되므로 모든 데이터는 정합성을 유지할 수 있게 된다.
  • 백업 및 복구 기능 – 보관된 데이터의 안정성을 높이기 위해서 데이터의 복제본을 저장할 수 있도록 하는 백업 기능을 제공한다. 또한 장애가 발생했을 경우 백업기능으로 생성된 복제본을 이용하여 데이터를 복원시킬 수 있는 복구 기능을 제공한다.'
  • 질의(query) 처리 – 데이터를 사용하기 위해서 사용자가 질의를 수행할 경우 효과적인 방법으로 데이터에 접근하는 방법을 제공한다.
  • 보안 기능 – 데이터베이스에 대해서 허용된 사용자에 의해서만 접근을 가능하게 할 수 있다. 또한 처리 가능한 데이터를 확인 및 검사함으로써 개인 정보를 보호할 수 있도록 한다.

+ Recent posts