[boost course]1. SQL&JDBC 프로그래밍

hyeon·2022년 4월 27일
0

1. SQL

MYSQL 설치 및 다루기

  1. mysql 관리자 계정인 root로 db 관리 시스템에 접속

    mysql -uroot -p;

  1. connectdb 라는 이름으로 데이터베이스 생성

    create database connectdb;

  2. db 사용자 생성과 권한 주기 (8.0 기준)

    CREATE USER 사용자이름@localhost IDENTIFIED BY '암호';
    GRANT ALL PRIVILEGES ON connectdb.* TO '사용자이름'@'localhost';

  3. dbms에게 적용하기

    flush privileges;

  • 생성한 db에 접속하기

    mysql -h호스트명 -uDB계정명 -p 데이터베이스이름

  • db 연결 끊기

    exit 또는
    quit

  • 쿼리 입력중 취소해야하는경우

    \c

  • 존재하는 db 보기, 테이블 보기, db 전환하기

    show database;
    show table;
    use db이름;

2. Java

JAVA Code Conventions

class 명 : 첫글자를 대문자로
프로젝트 명, 패키지명 : 소문자

JDBC(JAVA Database Connectivity)

자바와 데이터베이스를 연결해주는 것
자바 프로그램내에서 sql문을 실행하기 위한 자바 api라고도 할 수 있다.
SQL과 프로그래밍 언어의 통합 접근 중 한 형태

표준 인터페이스인 JDBC API를 제공

  • JDBC를 이용한 프로그래밍 방법
  1. import java.sql.*; (패키지 import)
  2. 드라이버를 로드 한다. ```
Class.forName("com.mysql.jdbc.Driver");
  1. Connection 객체를 생성한다. (=db에 접속한다)

    String dburl="jdbc:mysql://localhost/dbName";
    Connection con=DriverManager.getConnection(dburl,ID,PWD);
    //DB 벤더에서 우리 DB사용하려면 이렇게 써야한다고 알려준다.
  2. Statement 객체를 생성 및 질의 수행(=쿼리 만들고 실행)

    Statement stmt=con.createStatement();
    ResultSet rs=stmt.excuteQuery("select no from user");
  3. SQL문에 결과물이 있다면 ResultSet 객체를 생성한다.

ResultSet rs= stmt.executeQuery("select no from user");
while(rs.next())
	System.out.println(rs.getInt("no"));
    //데이터는 db가 가지고 있다 프로그램에서는 레퍼런스만 가질뿐이다 (만약 만건의 데이터가 들어올때 서버가 다 수용할수 없기 때문)
  1. 모든 객체를 닫는다.
rs.close();
stmt.close();
con.close();
//가장 마지막에 열린 result set을 가장 먼저 닫아주고 역순서로 닫아줘야함

=> 반복적인 작업을 framework가 알아서 실행해준다.

3. Maven

  • Maven
    반복적으로 진행해왔던 작업들을 지원하기 위해 등장한 도구이다.
    Maven을 사용하면 빌드(Build), 패키징, 문서화, 테스트와 테스트 리포팅, git, 의존성관리, svn등과 같은 형상관리서버와 연동(SCMs), 배포 등의 작업을 손쉽게 할 수 있습니다.

-Maven의 장점
의존성 라이브러리 관리 : Maven을 사용하면 설정 파일에 몇 줄 적어줌으로써 직접 다운로드 받거나 하는 것을 하지 않아도 라이브러리를 사용할 수 있습니다.

-Maven 태그의 의미

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>kr.or.connect</groupId>
    <artifactId>examples</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>mysample</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

project : pom.xml 파일의 최상위 루트 엘리먼트(Root Element)입니다.
modelVersion : POM model의 버전입니다.
groupId : 프로젝트를 생성하는 조직의 고유 아이디를 결정합니다. 일반적으로 도메인 이름을 거꾸로 적습니다.
artifactId : 해당 프로젝트에 의하여 생성되는 artifact의 고유 아이디를 결정합니다. Maven을 이용하여 pom.xml을 빌드할 경우 다음과 같은 규칙으로 artifact가 생성됩니다. artifactid-version.packaging. 위 예의 경우 빌드할 경우 examples-1.0-SNAPSHOT.jar 파일이 생성됩니다.
packaging : 해당 프로젝트를 어떤 형태로 packaging 할 것인지 결정합니다. jar, war, ear 등이 해당됩니다.
version : 프로젝트의 현재 버전. 추후 살펴보겠지만 프로젝트가 개발 중일 때는 SNAPSHOT을 접미사로 사용합니다. Maven의 버전 관리 기능은 라이브러리 관리를 편하게 합니다.
name : 프로젝트의 이름입니다.
url : 프로젝트 사이트가 있다면 사이트 URL을 등록하는 것이 가능합니다.

  • Maven Project에서 Specify Archetype parameters 설정

Group Id는 보통 프로젝트를 진행하는 회사나 팀의 도메인 이름을 거꾸로 적습니다.
Artifact Id는 해당 프로젝트의 이름을 적습니다.
버전은 보통 기본값(0.0.1-SNAPSHOT)으로 설정합니다.
package이름은 group id와 Artifact Id가 조합된 이름이 됩니다.
Group Id를 kr.or.connect이고 Artifact Id가 mavenweb으로 설정했기 때문에 package이름은 kr.or.connect.mavenweb이 됩니다.

4. JDBC 실습(1)

  1. maven 프로젝트 만들기
  2. maven pron.xml 설정
<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.45</version>
		</dependency>

mysql dependency 추가

<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.6.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
				</configuration>
			</plugin>
            

플러그인 추가

  1. 프로젝트 우클릭 maven -> update project 필수 !
  2. dto 패키지만들고 db에서 받을 role 의 생성자, getter와 setter 만들기
package kr.or.connect.jdbcexam.dto;

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 + "]";
	}

}
  1. 데이터베이스의 값을 받아오는 dao패키지의 roleDao 만들기
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 kr.or.connect.jdbcexam.dto.Role;
public class RoleDao {
	private static String dburl ="jdbc:mysql://localhost:3306/connectdb?useSSL=false";
	private static String dbUser ="Mysql";
	private static String dbpasswd="6497";
	public Role getRole(Integer roleId) {
		//roleId(Primary Key)에 해당하는 한 건의 정보를 가져오는 메서드
		Role role =null;
		Connection conn=null;//연결을 맺어낼 수 있는 객체를 선언
		PreparedStatement ps =null;	//statement 객체 선언
		ResultSet rs =null;	//결과값을 담을 객체 선언
		
		
		//예외처리
		try {
			//드라이버 로딩
			Class.forName("com.mysql.jdbc.Driver");
			conn=DriverManager.getConnection(dburl,dbUser,dbpasswd);
						
			//connection에 statement 연결
			//getRole의 인자로 들어온 role_id 값이 ?에 들어감 
			//이 물음표를 대신해서 사용해주는 것이 preparedStatement라는 쿼리의 특징이다
			String sql ="SELECT role_id,description FROM role WHERE role_id=?";
			ps=conn.prepareStatement(sql);
			ps.setInt(1,roleId);  //인자1: 몇번째 물음표인지 인자 2: 실제 ?에 들어갈 값
			
			//쿼리 실행
			rs=ps.executeQuery();
			
			if(rs.next()) //next메서드는 결과값이 있다면 첫 번째 레코드로 코드를 이동시키고 true 리턴해줌
			{
				//값 꺼내오기
				int id= rs.getInt("role_id");		//이렇게 이름을 적어줄 수도 있고 아래처럼 몇번째인지 적어줘도 된다.
				String description = rs.getString(2);	//두번째 칼럼의 값
				//role 객체에 담아서 보내줌
				role=new Role(id,description);
				
			}
		}catch(Exception e) {
			e.printStackTrace();
			
		}finally {	//반드시 수행되는 구절에서 닫아주는 코드 써주기
			if(rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			}
			if(ps!=null) {
				try {
					ps.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				}
			if(conn!=null) {
				try {
					conn.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				}
		}
		
		return role;
	}
}
  1. 마지막으로 읽어올 role id 의 값을 출력하는 코드작성
package kr.or.connect.jdbcexam;

import kr.or.connect.jdbcexam.dao.RoleDao;
import kr.or.connect.jdbcexam.dto.Role;

public class JDBCExam1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RoleDao dao=new RoleDao();
		Role role=dao.getRole(100);
		System.out.print(role);
	}

}
profile
남기고 싶은 개발자입니다 :>

0개의 댓글