본문 바로가기

Dev/[Java]

[DBMS] 7-1. Mybatis 연동후 MariaDB와 붙여서 CRUD작성(첨부터 해보기)

반응형

이제 각각한다....

작성순서 ...

 

1. 테이블을 만듭니다.. 각자 하고싶은데로...

 

2. UserVO 클래스를 작성합니다.

 

3. VO클래스를 만들면 , 어디다가 세팅해줘야대나?

거기 src밑에 보면 SQLMapConfig.xml 파일이 있다....

여기 안에 TypeAliase 가 있따. 여기다가 선언해줘야되요..

 

4. 자 이제 쿼리문을만들어줘야죠?

XXXmapper.xml을 만들어줍니다.

 

5. 그다음엔? DAO만들어줘야죠?

 

6. DAO Test(Junit)까지 해봅시다.

 

 

 

 

 

 

1. Dynamic Web Project 생성...

프로젝트 이름을 적어준다..

나는 도서관을 해보려고 한다..

 

 

주의사항은. context root 이름과 web.xml파일 생성 체크박스를 체크하는것이다..

 

 

 

2. Maven 프로젝트로 변환

이렇게 변환해준다..

 

 

피니시 눌러준다..

 

변환 후 POM.xml 파일에 Maven Repository에서 가져올 Dependency 들을 적어주어야 한다..

우리가 필요한 것은 아래와 같다...

(1)Mybatis,

(2) mysql jdb driver

오라클은 따로 Maven Repository 에서 제공을 안하니 로컬로 import해줘야한다.. 그 방법은 이전에 설명했다.

 

<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/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>Dynamic_Web_CCS1_Bookstore</groupId>
	<artifactId>Dynamic_Web_CCS1_Bookstore</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.0</version>
				<configuration>
					<release>11</release>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>3.2.1</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>

		<dependency>
			<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.5.6</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.22</version>
		</dependency>


	</dependencies>
</project>

 

 

 

다음으로 build path에서 Junit을 라이브러리로 추가해줄것이다..

 

 

add library를 눌러주고...

JUnit4버전을 추가해주고 Apply and close한다..

 

 

 

이후 db.properties, SqlMapConfig.xml, xxxMapper.xml 이 세가지 파일을 넣어주어야 한다..

 

 

 

 

 

 

 

 

 

 

이제 프로젝트 설정에서 할 일은 다 끝났다...

 

데이터베이스를 만들어준다..

책이므로... 테이블을 어떻게 짜볼까?

 

3. 테이블 생성(MariaDB)

아래와 같이 생성해볼것이다..

데이터베이스 새로 설치하고 계정생성하는것은 이전에 다루었으므로 패스..

툴은 DataGrip을 쓴다.

 

create table books(
    id int(10) not null auto_increment primary key,
    bookid varchar(30) not null,
    bookname varchar(30) not null,
    author varchar(20),
    genre varchar(20),
    regdate DATETIME default now()
);

 

유니크 인덱스도 준다.

alter table books add unique index books_bookid_idx(bookid);

 

책을 하나 추가해보자..

insert into books(bookid,bookname,author,genre) values('stock', '주식책','홍길동','재테크');

 

여기까지가 이제 테이블에 관련한 설정 끝...

 

 

 

4. VO클래스 작성

다음으로는 BookVO 클래스를 만들어줄것이다.

 

이후 멤버변수와 생성자, Getter, Setter를 만들어준다.

 

package jdbc.book.vo;

import java.sql.*;

/**
 * VO(Value Object)
 */

public class BookVO {
	private int id;
	private String bookid;
	private String bookname;
	private String author;
	private String genre;
	private Date regdate;

	// 기본 생성자 만들기
	public BookVO() {
	}

	// 생성자 오버로딩
	public BookVO(int id, String bookid, String bookname, String author, String genre, Date regdate) {
		super();
		this.id = id;
		this.bookid = bookid;
		this.bookname = bookname;
		this.author = author;
		this.genre = genre;
		this.regdate = regdate;
	}
    
    public BookVO(String bookid, String bookname, String author, String genre) {
		this.bookid = bookid;
		this.bookname = bookname;
		this.author = author;
		this.genre = genre;
	}

	// Getter / Setter 만들기

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getBookid() {
		return bookid;
	}

	public void setBookid(String bookid) {
		this.bookid = bookid;
	}

	public String getBookname() {
		return bookname;
	}

	public void setBookname(String bookname) {
		this.bookname = bookname;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public String getGenre() {
		return genre;
	}

	public void setGenre(String genre) {
		this.genre = genre;
	}

	public Date getRegdate() {
		return regdate;
	}

	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}

	// toString Override
	@Override
	public String toString() {
		return "BookVO [id=" + id + ", bookid=" + bookid + ", bookname=" + bookname + ", author=" + author + ", genre="
				+ genre + ", regdate=" + regdate + "]";
	}

}

 

 

5. Mapping 하기

 

자 다음으로 아까 추가한

db.properties

SqlMapConfig.xml 

XXXMaper.xml

 

에 대한 내용을 바꿔준다.

 

(1) db.properties

계정은 그냥 아까 썼던 Scott그대로 쓰기때문에.. 여긴 따로 바꿔주지 않는다.

 

#db.driver=oracle.jdbc.OracleDriver
#db.url=jdbc:oracle:thin:@127.0.0.1:1521:xe
#db.username=scott
#db.password=tiger

db.driver=com.mysql.cj.jdbc.Driver
db.url=jdbc:mysql://127.0.0.1:3306/java_db?useUnicode=true&charaterEncoding=utf-8&useSSL=false&serverTimezone=UTC
db.username=scott
db.password=tiger

 

(2) SqlMapConfig.xml

여기선 TypeAlias 부분과... Mapper Resource 부분을 주의하면 될 것 같다..

<?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>
	<!-- DB 접속정보를 가진 Properties file을 설정해준다.. -->
	<properties resource="db.properties" />
	
	<!-- VO객체를 설정한다..(클래스 이름이 뭔지 알려주는거지.) -->
	<!-- jdbc.user.vo.UserVO 이걸 짧게 쓰기 위해 Alias를 준다.alias="User" -->
	<typeAliases>
		<typeAlias alias="Book" type="jdbc.book.vo.BookVO"/>
	</typeAliases>

	<!--  DataSource 설정 -->
	<!--  나중에 Spring 연동하면 이부분은 안한다. -->
	<!--  db.properties 에 있는 정보들을 아래와같이 넣어준다. -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${db.driver}"/> <!-- 런타임에 이부분 치환됨 -->
				<property name="url" value="${db.url}"/>
				<property name="username" value="${db.username}"/>
				<property name="password" value="${db.password}"/>
			</dataSource>
		</environment>
	</environments>
	
	<!-- SQL 문을 포함한 Mapper XML 설정 -->
	<!-- 나중에 XML파일이 많아지면 여기아래에 쭉 써주면된다. -->
	<mappers>
		<mapper resource="BookMapper.xml" />
	</mappers>

</configuration>

 

 

(3) BookMaper.xml

여기다가는 이제 쿼리문을 작성해주면 된다..

기본적으로 

1) 책 한권 bookid 로 조회하기

2) 전체조회하기(select all)

3) insert

4) update

5) delete

 

이렇게 5가지의 쿼리문을 넣어줄 것이다.

<?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="userNS">
 
 	<!-- 파라미터 2개이상일경우 객체로받아야댐... -->
 	<select id="selectBookByBookid" parameterType="string" resultType="Book">
 		select * from books where bookid = #{value}
 	</select>
 	
 	<select id="selectBookList" resultType="Book">
 		select * from books order by id
 	</select>
 	
 	<insert id="insertBook" parameterType="Book">
 		insert into books (bookid, bookname, author, genre) value(#{bookid},#{bookname},#{author},#{genre})
 	</insert>
 	
 	<update id="updateBook" parameterType="Book">
 		update books set 
 			name = #{bookname},
 			gender= #{author},
 			city = #{genre}
 		where bookid = #{bookid};
 	</update>
 	
 	<delete id="deleteBook" parameterType="integer">
 		delete from books where id=#{value}
 	</delete>
 	
 
 </mapper>
 

 

 

 

6. DAO 클래스 작성

최초에 클래스를 생성하고, factory 부터 작성해본다.

이 factory 가 아까 뭐라고 했지? SqlSession을 만들어주는 객체이다.

private SqlSessionFactory sqlSessionFactory;

 

이후

1)생성자를 하나 만들고,

2)리소스를 매핑해주고

3) Factory를 빌드한다?

public BookDAO() {
		// 이제 이만큼은 안해도된다.
		// 최초에 한번만 하면된다..
		String resource = "SqlMapConfig.xml";
		try {
			InputStream inputStream = Resources.getResourceAsStream(resource);
			sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

		} catch (IOException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}
	}

 

자 이제 Bookid 를 이용하여 1권의 책을 조회하는 것을 만들어보자.

여기서부터 중요한 것은 뭐다?

BookMapper.xml에 작성한 것들과 파라미터를 꼭 맞춰줘야한다. 

대소문자도 오타도 허용안되니 조심..

 

매퍼에 만약..이렇게 있다면.. 

<select id="selectBookByBookid" parameterType="string" resultType="Book">
 		select * from books where bookid = #{value}
 	</select>

DAO소스코드에는 이렇게 있어야 한다.

여기서 볼 부분은 selectBookByBookid라는 부분이 똑같은 것과... String 타입을 넘겨주는 것을 중요하게 보면된다..

 

// Book 1건 조회
	public BookVO getBook(String bookid) {
		BookVO book = null;
		SqlSession session = sqlSessionFactory.openSession();

		try {
			book = session.selectOne("userNS.selectBookByBookid", bookid);
		} finally {
			session.close();
		}

		return book;
	}

 

 

그다음엔 이걸 테스트하기위해 Junit 패키지와 클래스를 추가해준다.

 

최초에는 객체를 클래스 멤버변수로 선언해주고..

@Before 어노테이션이 붙은 Init()메서드를 꼭 추가해줘야댄다..

그래야 객체를 계속 쓸 수 있다.

그리고 꼭 Unittest 메서드는 public void 로 써야댄다..

 

@Test, @Ignore 어노테이션을 계속 쓰자.

그리고 여기서 하면서 알아낸건데,,

getBook()메서드에 착각해서

getBook(String bookid) 와 같이 적어줄경우

 

코드상 그냥 파라미터를 쓰지 않을 뿐 소스코드 실행에는 지장이 없으나 에러가 나며 테스트 통과못한다.

public void 이고 라이브러리에서 실제 구현코드가 동작하다보니... 그런 것 같다..

package jdbc.book.test;

import org.junit.Before;
import org.junit.Test;

import jdbc.book.dao.BookDAO;
import jdbc.book.vo.BookVO;


public class BookTest {
	
	BookDAO dao;
	
	
	@Before
	public void init() {
		dao = new BookDAO();
	}
	
	
	@Test
	public void getBook() {
		BookVO book= dao.getBook("stock");
		System.out.println(book);
	}

}

 

이제 같은 방식으로..

Select *

insert

update

delete

를 작성해줄것이다..

 

완성 소스코드는 다음 포스트에...

 

 

반응형