MyBatis

문이빈·2023년 9월 11일
0

MyBatis

ORM(Object Relational Mapping)

ORM프레임워크는 데이터베이스와 객체와의 관계를 맵핑시켜 퍼시스턴스 로직 처리를 도와주는 프레임워크이다.
대표적으로 iBatis와 hibernate, JPA가 있다

MyBatis는 SQL쿼리문, 예외처리, 트랙잭션 관리들을 XML형식으로 관리한다
POJO(Plain Old Java Object)객체와 테이블의 컬럼들을 편리하고 빠르고 정확하게 매칭할 수 있다.

같은 이름끼리 맵핑. DTO 와 DB 컬럼의 이름은 같아야한다.

MyBatis의 목표와 특징은 쉽고, 간단하고, 의존성이 적다는 것이다
SQL문과 자바코드를 분리함으로 인해 자바 개발자는 쿼리문을 신경 쓰지 않아도 된다.

myBatis는 자바오브젝트와 SQL문 사이의 자동 매핑 기능을 지원하는 ORM 프레임워크이다
자바코드와 SQL를 분리하므로서 SQL문의 변경이 있을 때 마다 자바를 수정하지 않아도 되고 컴파일을 하지 않아도 된다

사이트 : https://blog.mybatis.org

우리가 필요한 jar 파일

Java Project : mybatisTest
Package  : user.main
Class    : UserMain.java (public static void main(String[] args)

Package   : user.service
Interface : UserService.java - public void execute(); (추상메소드)
Class     : UserInsertService.java
            UserSelectService.java
            UserUpdateService.java
            UserDeleteService.java
            UserSearchService.java

Package : user.bean
          UserDTO.java
Package : user.dao
          UserDAO.java
          userMapper.xml (SQL)

src      : mybatis-config.xml (환경설정)

★ 테이블 작성
create table usertable(
name varchar2(30) not null,
id varchar2(30) primary key,
pwd varchar2(30) not null);

info 파일을 삭제하고 lib 폴더에 들어간 jar 파일들을 build path를 사용하여 Referenced Libraries에 추가해준다.

마이 바티스가 환경설정을 직접 만들어준다.

sql문장은 Mapper파일이 만들어준다.

SqlSession 객체가 MyBatis와 연결을 한다.

★마이 바티스 config의 기본위치는 src

같은 이름으로 쓰는게 좋음

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 시작태그 mapper -->
<mapper namespace="userSQL">

	<insert id="write" parameterType="user.bean.UserDTO">
		insert into usertable values(#{name}, #{id}, #{pwd})
	</insert>

</mapper>
-------------------------------UserMain-------------------------------
package user.main;

import java.util.Scanner;

import user.service.UserDeleteService;
import user.service.UserInsertService;
import user.service.UserSearchService;
import user.service.UserSelectService;
import user.service.UserService;
import user.service.UserUpdateService;

public class UserMain {
	
	public void menu() {
		
		Scanner scan = new Scanner(System.in);
		UserService userService = null;
		int num;

		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) 
				// UserInsertService serInsertService = new UserInsertService();  
                // 1:1 관계 불편해 -> 부모=자식 
				userService = new UserInsertService(); // 모든 자식클래스를 참조할 수 있다.
			
			else if(num == 2) 
				userService = new UserSelectService();
				
			else if(num == 3) 
				userService = new UserUpdateService();
				
			else if(num == 4) 
				userService = new UserDeleteService();
				
			else if(num == 5) 
				userService = new UserSearchService();
				
			userService.execute();
		}//while
	}

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

	}

}

-------------------------------UserDTO-------------------------------

package user.bean;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter

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

}

-------------------------------UserDAO-------------------------------

package user.dao;

import java.io.IOException;
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;

public class UserDAO {
	// DB랑 직접연결 못함
	private SqlSessionFactory sqlSessionFactoy;
	
	public UserDAO() {
		try {
		//InputStream inputStream = Resources.getResourceAsStream(mybatis-config.xml);
		Reader reader = Resources.getResourceAsReader("mybatis-config.xml"); 
        // 모든 리소스 파일 읽어옴
		
		sqlSessionFactoy = new SqlSessionFactoryBuilder().build(reader); // 생성
		
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
		

	public void write(UserDTO userDTO) {
		SqlSession sqlSession = sqlSessionFactoy.openSession(); // 생성
		sqlSession.insert("userSQL.write", userDTO);
		sqlSession.commit();
		sqlSession.close();
		
	}

	public List<UserDTO> getUserList() {
		SqlSession sqlSession = sqlSessionFactoy.openSession(); // 생성
		List<UserDTO> list = sqlSession.selectList("userSQL.getUserList");
		sqlSession.close();
		
		return list;
	}


	public UserDTO getUser(String id) {
		SqlSession sqlSession = sqlSessionFactoy.openSession(); // 생성
		UserDTO userDTO = sqlSession.selectOne("userSQL.getUser", id);
		sqlSession.close();
		
		return userDTO;
	}


	public void update(UserDTO userDTO) {
		SqlSession sqlSession = sqlSessionFactoy.openSession(); // 생성
		sqlSession.update("userSQL.update", userDTO);
		sqlSession.commit();
		sqlSession.close();
		
	}


	public void delete(String id) {
		SqlSession sqlSession = sqlSessionFactoy.openSession(); // 생성
		sqlSession.delete("userSQL.delete", id);
		sqlSession.commit();
		sqlSession.close();
		
	}


	public void select(String name) {
		SqlSession sqlSession = sqlSessionFactoy.openSession(); // 생성
		List<UserDTO> list = sqlSession.selectList("userSQL.search1");
		sqlSession.close();
		
		return ;
	}

	
}

-------------------------------userMapper-------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- 시작태그 mapper -->
<mapper namespace="userSQL">

	<!-- 등록 -->
	<insert id="write" parameterType="user.bean.UserDTO">
		insert into usertable values(#{name}, #{id}, #{pwd})
	</insert>

	<!-- 출력 -->
	<select id="getUserList" resultType="user.bean.UserDTO">
		select * from usertable
	</select>
	
	<!-- 수정 -->
	<select id="getUser" parameterType="java.lang.String" resultType="user.bean.UserDTO">
		select * from usertable where id=#{id}
	</select>
	
	<update id="update" parameterType="user.bean.UserDTO">
		update usertable set name=#{name}, pwd=#{pwd} where id = #{id}
	</update>
	
	<!-- 삭제 -->
	<delete id="delete" parameterType="String">
		delete from usertable where id=#{id}
	</delete>
	
	<select id="search1" resultType="user.bean.UserDTO">
		select * from usertable where id=${*id*}
	</select>
	
	
</mapper>

-------------------------------mybatis-config-------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 "https://mybatis.org/dtd/mybatis-3-config.dtd">

<!-- 시작 태그 configuration -->
<configuration>
	<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="1234"/>
			</dataSource>
		</environment>
	</environments>
	
	<mappers>
    
		<mapper resource="user/dao/userMapper.xml"/> 
           <!-- resource는 user.dao가 아닌 /로 경로를 표현 -->
	</mappers>
</configuration>

-------------------------------UserInsertService-------------------------------

package user.service;

import java.util.Scanner;

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

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

}

-------------------------------UserUpdateService-------------------------------

package user.service;

import java.util.Scanner;

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

public class UserUpdateService implements UserService{
	
	@Override
	public void execute() {
		System.out.println();
		
		Scanner scan = new Scanner(System.in);
		System.out.print("수정할 아이디 입력: ");
		String id = scan.next();
		
		// DB
		UserDAO userDAO = new UserDAO();
		UserDTO userDTO = userDAO.getUser(id);

		if(userDTO == null) {
			System.out.println("아이디가 존재하지 않습니다.");
		
		}else {
		System.out.println(userDTO.getName() +"\t"+ userDTO.getId() +"\t"+ userDTO.getPwd());
			
		System.out.print("수정할 이름 입력 : ");
		String name = scan.next();
		System.out.print("수정할 비밀번호 입력 : ");
		String pwd = scan.next();
		
		userDTO.setName(name);
		userDTO.setPwd(pwd);
		
		//DB
		userDAO.update(userDTO);
		
		System.out.println();
		System.out.println("데이터를 수정하였습니다.");
		
		}//else
	}
}

-------------------------------UserSelectService-------------------------------

package user.service;

import java.util.List;

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

public class UserSelectService implements UserService{
	
	@Override
	public void execute() {
		System.out.println();
		
		// DB에서 꺼내오기
		UserDAO userDAO = new UserDAO();
		List<UserDTO> list = userDAO.getUserList();
		
		// 응답
		for(UserDTO userDTO: list) {
			System.out.println(userDTO.getName() +"\t"+ userDTO.getId() +"\t"+ userDTO.getPwd());
		}
				
	}

}

-------------------------------UserDeleteService-------------------------------

package user.service;

import java.util.Scanner;

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

public class UserDeleteService implements UserService{
	
	@Override
	public void execute() {
		System.out.println();
		
		Scanner scan = new Scanner(System.in);
		System.out.print("삭제할 아이디 입력 : ");
		String id = scan.next();
		
		// DB
		UserDAO userDAO = new UserDAO();
		UserDTO userDTO = userDAO.getUser(id);

		if(userDTO == null) {
			System.out.println("아이디가 존재하지 않습니다.");
			
			// 현재 메소드를 벗어나라 -> return : void는 return 값이 없어서
			return;
		
		}else {
			
			//DB
			userDAO.delete(id);
			
			System.out.println();
			System.out.println("데이터를 삭제하였습니다.");
			
		}
	}

}

0개의 댓글