잡동사니에도 사랑을

[21.10.15] MyBatis활용 - 입력, 출력 본문

JAVA_EE/MYBATIS

[21.10.15] MyBatis활용 - 입력, 출력

luvforjunk 2021. 10. 15. 23:13
728x90
반응형

★ myBatis

ORM(Object Relational Mapping) 프레임워크는 데이터베이스와 객체와의 관계를 맵핑시켜

퍼시스턴스 로직 처리를 도와주는 프레임워크이다. 대표적으로 iBatis와 hibernate, JPA가 있다.

 

myBatis는 SQL쿼리문, 예외처리, 트랙잭션 관리들을 XML형식으로 관리한다.

POJO(Plain Old Java Object)객체와 테이블의 컬럼들을 편리하고 빠르고 정확하게 매칭할 수 있다.

 

myBatis의 목표와 특징은 쉽고, 간단하고, 의존성이 적다는 것이다.

SQL문과 자바코드를 분리함으로 인해 자바 개발자는 쿼리문을 신경 쓰지 않아도 된다.

 

myBatis는 자바오브젝트와 SQL문 사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다.

자바코드와 SQL를 분리하므로써 SQL문의 변경이 있을 때마다 자바를 수정하지 않아도 되고 컴파일을 하지 않아도 된다.

 

https://blog.mybatis.org
 

The MyBatis Blog

A blog about the the MyBatis data mapper framework.

blog.mybatis.org

 

 

 

////////UserMain.java

package user.main;

import java.util.Scanner;

import user.service.UserInsertService;
import user.service.UserSelectService;
import user.service.UserService;

public class UserMain {

	public static void main(String[] args) {
		UserMain userMain = new UserMain();
		userMain.menu();
		System.out.println("프로그램을 종료합니다.");

	}

	private void menu() {

		Scanner scan = new Scanner(System.in);
		int num;

		UserService userService = null; // 부모 설정 - 부모는 생성할 필요 없고 참조만 해주면 된다

		while (true) {
			System.out.println();
			System.out.println("*************");
			System.out.println("   1. 입력");
			System.out.println("   2. 출력");
			System.out.println("   3. 수정");
			System.out.println("   4. 삭제");
			System.out.println("   5. 검색");
			System.out.println("   6. 종료");
			System.out.println("*************");
			System.out.print("번호 입력 : ");
			num = scan.nextInt();
			if (num == 6)
				break;

			// 결합도를 낮춰 생성을 해줘라
			if (num == 1)
				userService = new UserInsertService(); //부모 = 자식
			else if (num == 2)
				userService = new UserSelectService(); //부모 = 자식
			
			userService.execute(); // 메소드 호출 - insert, select 모두 execute로

		} //while
	}//menu()
}

 

 

 

////////UserService.java

package user.service;

public interface UserService { // UserService : 부모
	
	public void execute(); // 추상메소드
}

 

 

 

////////UserDTO.java

package user.bean;

import lombok.Data;

@Data
public class UserDTO {
	private String name;
	private String id;
	private String pwd;

}

 

 

 

////////sql

create table usertable(
name varchar2(30) not null,
id varchar2(30) primary key,
pwd varchar2(30) not null);

 

→ 이름을 달리해도 상관없으나, 같게 해주는 것이 좋다.

→ 협업 작업을 하다보면 이름을 다르게 설정하거나 매칭되는 타입이 다른 경우가 발생할 수 있는데,

    그렇게 되면 매핑할 수 없게 된다.

→ 그럴 때를 대비해 Mapper에 환경설정을 해둔다

 

 

////////userMapper.xml - 환경설정

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="userSQL">
 	<!-- 오라클 컬럼과 DTO의 필드명이 같지 않을 때 -->
 	<resultMap type="UserDTO" id="userResult">
 		<result property="name" column="NAME"/>
 		<result property="id" column="ID"/>
 		<result property="pwd" column="PWD"/>
 	</resultMap>
 
 	<insert id="write" parameterType="user">
 		insert into usertable values(#{name}, #{id}, #{pwd})
 	</insert>
 	
 	<!-- <select id="getUserList" resultType="user"> --> 
 	<!-- 1줄당 user.bean.UserDTO에 담으면 자동으로 List에 담는다 -->
 	<select id="getUserList" resultMap="userResult">
 		select * from usertable
 	</select>
 </mapper>

*주요 내용

→ <resultMap type="UserDTO" id="userResult"> : userDTO객체의 필드명과 userResult의 조회 컬럼명이 같다는 것을 명시시켜준다.

 필드명과 컬럼명이 일치하므로 쉽게 매핑된다.

→ <select id="getUserList" resultMap="userResult"> select * from usertable </select> : resultMap에 적용한 userResult를

    select문에서 적용한다는 의미.

 

 

////////UserInsertService.java

package user.service;

import java.util.Scanner;

import user.bean.UserDTO;
import user.dao.UserDAO;

public class UserInsertService implements UserService {

	@Override
	public void execute() {
		//데이터
		Scanner scan = new Scanner(System.in);
		
		System.out.println("이름 입력 : ");
		String name = scan.next();
		System.out.println("아이디 입력 : ");
		String id = scan.next();
		System.out.println("비밀번호 입력 : ");
		String pwd = scan.next();
		
		UserDTO userDTO = new UserDTO();
		userDTO.setName(name);
		userDTO.setId(name);
		userDTO.setPwd(pwd);
		
		//DB
		UserDAO userDAO = UserDAO.getInstance(); // 싱글톤
		userDAO.write(userDTO);
		
		//응답
		System.out.println("데이터를 DB에 저장하였습니다");
	}
}

 

 

 

////////UserSelectService.java

package user.service;

import java.util.List;

import user.bean.UserDTO;
import user.dao.UserDAO;

public class UserSelectService implements UserService {

	@Override
	public void execute() {
		//DB - select해서 데이터를 다 꺼내와라
		UserDAO userDAO = UserDAO.getInstance();
		List<UserDTO> list = userDAO.getUserList();

		//응답
		for (UserDTO userDTO : list) {// list에 있는 값을 하나하나 꺼내서 DTO에
			System.out.println(userDTO.getName() + "\t" + userDTO.getId() + "\t" + userDTO.getPwd());
		}
	}
}

 

 

 

////////mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="user.bean.UserDTO" alias="user"/>
	</typeAliases>

	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
				<property name="username" value="c##java" />
				<property name="password" value="bit" />
			</dataSource>
		</environment>
	</environments>

	<mappers>
		<mapper resource="user/dao/userMapper.xml" />
	</mappers>
</configuration>

*주요 내용

→ 경로를 써줘야 하기 때문에 점(.)이 아닌 Slash(/)로 써준다

 

 

////////UserDAO.java

package user.dao;

import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import user.bean.UserDTO;
import user.dao.UserDAO;

public class UserDAO {
	private static UserDAO instance = null;
	private SqlSessionFactory sqlSessionFactory;

	public static UserDAO getInstance() { // 쭉 생성된 채로 있어야 하니까 static
		if (instance == null) {
			synchronized (UserDAO.class) {
				instance = new UserDAO();// 생성
			}
		}
		return instance;
	}
	
	public UserDAO() {
		// mybatis-config.xml에 설정한 환경설정을 읽는다.
		// InputStream 혹은 Reader를 통해 읽어온다
		
		try {
			Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
			// InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
		
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
			// sqlSessionFactory도 인터페이스이므로 SqlSessionFactoryBuilder을 이용한다
		} catch (IOException e) {
			e.printStackTrace();
		}

		
	}

	public void write(UserDTO userDTO) {
		//Mybatis를 쓰는 이유는 자바와 sql을 분리하기 위함으로 sql문장을 써주면 안된다
		SqlSession sqlSession = sqlSessionFactory.openSession();
		sqlSession.insert("userSQL.write", userDTO); // 데이터가 다 들어가 있는 DTO를 가지고 Mapper.xml로
		sqlSession.commit(); //insert, delete, update
		sqlSession.close();
	}

	public List<UserDTO> getUserList() {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		List<UserDTO> list = sqlSession.selectList("userSQL.getUserList");
		sqlSession.close();
		return list;
	}
}
728x90
반응형

'JAVA_EE > MYBATIS' 카테고리의 다른 글

[21.10.18] MyBatis활용 - 수정, 삭제, 검색  (0) 2021.10.18