[Database] MyBatis Java

1. MyBais


데이터베이스를 단독으로 사용하는 경우는 거의 없다. 웹 어플리케이션과 같이 쓰는 경우가 대부분이다. java의 경우 MyBatis라는 라이브러리를 통해 데이터베이스와 연결해서 쓴다.

  • spring jdbc
  • dbcp
  • mybatis
  • mybatis-spring

pom.xml을 열어 </properties> 아래에 다음 repositories 설정을 입력해준다.

<repositories>
			<repository>
				<id>oracle</id>
				<name>ORACLE JDBC Repository</name>
				<url>http://code.lds.org/nexus/content/groups/main-repo</url>
			</repository>
</repositories>

그런다음 하단쪽 부분에 다음과 같은 dependncy를 추가해준다.

<dependency>
			<groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0.3</version>
</dependency>

그러나 다운이 잘 안되는 경우가 많다. 그럴경우 직접 넣어주면 된다. oracle 설치한 폴더로 가서 jdbc 폴더를 찾으면 jdbc 파일이 있다. 나같은 경우 폴더 경로가 C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 이렇게 되어 있었다. jdbc6 파일을 복사하여 WEB-INF>lib 폴더 안에 불어넣기 해준다.
다음 라이브러리로 mvnrepository.com 페이지에 spring jdbc를 검색해 maven을 pom.xml에 복붙해준다.

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-jdbc</artifactId>
		    <version>5.3.15</version>
		</dependency>

그런다음 검색할 라이브러리는 dbcp2이다

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-dbcp2</artifactId>
    <version>2.9.0</version>
</dependency>

버전은 최신버전으로 한다. 그다음 MyBatis를 검색한다.

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

마지막으로 mybatis spring을 검색하고 복붙해준다.

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

2. Properties 생성


WEB-INF 폴더 아래에 properties 폴더를 생성한다. 그리고 오른쪽 클릭을 하고 파일을 생성한다.

그림1

생성된 파일 안에 다음과 같은 코드를 적는다. username과 passoward는 각자 db에 따라 수정한다.

db.classname = oracle.jdbc.OracleDriver
db.url = jdbc:oracle:thin:@localhost:1521:xe
db.username = G00D_DB
db.password = 1234

3. Mapper 만들기


3.1. Mapper

src 폴더에 패키지 kr.co.softcampus.database를 만들어준다. 그리고 그 패키지 안에 Interface를 MapperInterface 이름으로 생성해준다.

3.2. BasicDataSource Bean

일단 파일만 만들어 놓고 BasicDataSource Bean을 정의 먼저 하도록한다. kr.co.softcampus.config 패키지에 ServletAppContext.java 파일 클래스 위에 properties 파일을 사용할 수 있게 @PropertySource(“/WEB-INF/properties/db.properties”)를 선언해준다. 그리고 db classname, url, username, password 빈을 각각 만들어 주입시킨다.

@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {

	@Value("${db.classname}")
	private String db_classname;
	
	@Value("${db.url}")
	private String db_url;
	
	@Value("${db.username}")
	private String db_username;
	
	@Value("${db.password}")
	private String db_password;

그리고 밑에 BasicDataSource Bean을 정의해주도록 한다. BasicDataSource는 import org.apache.commons.dbcp2.BasicDataSource;를 import해준다.

	//데이터베이스 접속 정보관리
	@Bean
	public BasicDataSource dataSource(){
		BasicDataSource source = new BasicDataSource();
		source.setDriverClassName(db_classname);
		source.setUrl(db_url);
		source.setUsername(db_username);
		source.setPassword(db_password);
		
		return source;
	}

3.3. SqlSessionFactory Bean

SqlSessionFactory는 접속, 쿼리 관리를 하는 객체다. 같은 파일 ServletAppContext 안에 Bean 정의하는 메소드 밑에 다음 코드를 추가한다.

	@Bean
	public SqlSessionFactory factory(BasicDataSource source) throws Exception{
		SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
		factoryBean.setDataSource(source);
		SqlSessionFactory factory = factoryBean.getObject();
		return factory;
	}

위에서 정의한 BasicDataSource가 파라메터 앞으로 주입되고 있어서 따로 정의하거나 import할 필요 없다.

3.4. Mapper Bean

Mapper는 쿼리를 관리하는 것으로 이 Mapper를 주입받아 쿼리를 실행하게 된다. 위에서 정의한 SqlSessionFactory 밑에 아래 코드를 추가한다. 제네릭<> 안에는 맨 처음 만든 MapperInterface를 복붙해서 넣어준다.

	// 쿼리문 실행을 위한 객체
	@Bean
	public MapperFactoryBean<MapperInterface> test_mapper(SqlSessionFactory factory) throws Exception {
		MapperFactoryBean<MapperInterface> factoryBean = new MapperFactoryBean<MapperInterface>(MapperInterface.class);
		factoryBean.setSqlSessionFactory(factory);
		return factoryBean;
	}

4. 쿼리 실행


4.1. 데이터 insert

프로젝트에 오른쪽 클릭하고 데이터베이스 이름의 파일을 생성한다. 그림2

그리고 테이블을 생성시키는 코드를 입력한다.

create table spring_mvc_table (
	data1 varchar2(100) not null,
	data2 varchar2(100) not null,
	data3 varchar2(100) not null
	);

오라클 sqldeveloper를 실행하고 sql문을 실행시켜본다.
그런다음 중계처를 만들어야 한다. 패키지 kr.co.softcampus.beans를 생성하고 클래스 DataBean도 그 안에 생성해준다. 그런다음 생성한 테이블의 컬럼 이름과 동일하게 작성해준다.

public class DataBean {
	
	private String data1;
	private String data2;
	private String data3;

}

그런다음 오른쪽 클릭하고 source->generate getter and setter를 눌러 getter와 setter를 생성해준다.
이제 필요한 작업은 끝났다. views 폴더의 home.jsp에 <body> 태그 안에 다음 코드를 써준다.

	<a href='input_data'>input_data</a><br/>
	<a href='read_data'>read_data</a><br/>

그리고 controller도 새로 생성해준다. kr.co.softcampus.controller 패키지에 TestController 클래스 파일을 생성해준다. 그리고 mapping하는 매소드도 만든다.

@Controller
public class TestController {

	@GetMapping("/input_data")
	public String input_data(){
		return "input_data";
	}
}

이에 맞게 input_data jsp 파일도 생성해준다. 그리고 아래와 같이 데이터를 입력받는 코드를 작성한다.

<body>
	<form action='input_pro' method='post'>
		data1 : <input type='text' name='data1'/><br/>
		data2 : <input type='text' name='data2'/><br/>
		data3 : <input type='text' name='data3'/><br/>
		<button type='submit'>확인</button>
	</form>
</body>

이렇게 받은 데이터를 전달해주는 메소드가 필요하다. 그 전에 데이터를 넣어줄 MapperInterface를 작성해준다.

public interface MapperInterface {

	@Insert("insert into spring_mvc_table (data1, data2, data3) values (#{data1}, #{data2}, #{data3})")
	void insert_data(DataBean dataBean);
}

어노테이션 insert를 통해 jsp에서 받은 데이터 data1, data2, data3를 각각 insert해준다. 다시 TestController에 가서 코드를 입력해준다.

@Controller
public class TestController {

	@Autowired
	MapperInterface mapper1;
	
	@GetMapping("/input_data")
	public String input_data(){
		return "input_data";
	}
	
	@PostMapping("/input_pro")
	public String input_pro(DataBean dataBean){
		mapper1.insert_data(dataBean);
		return "input_pro";
	}

이제 받은 데이터를 다시 post해주는 input_pro jsp 파일을 views에 생성해준다. 간략하게 상태만 표시하는 태그만 body에 넣었다

<body>
	<h1>저장완료</h1>
</body>

4.2. 데이터 select

MapperInterface에 어노테이션 select로 데이터를 조회하여 가져오도록 해보겠다. 다음 코드를 추가해준다.

@Select("select data1, data2, data3 from spring_mvc_table")
	List<DataBean> select_data();

List는 java.util을 import해준다. 저렇게 입력하면 데이터를 select해서 가져온다. 로우 두 개 이상 데이터가 있을 경우 List 형태로 가져온다.
Controller로 가서 GetMapping 메소드를 입력해준다.

	@GetMapping("/read_data")
	public String read_data(Model model) {
		
		List<DataBean> list = mapper1.select_data();
		model.addAttribute("list", list);
		
		return "read_data";
	}

마찬가지로 views에 jsp 파일 read_data 이름으로 만들어준다. 상단에 jstl을 쓰기 위한 태그를 입력한다.

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

복수의 로우 데이터이기 때문에 c:forEach를 통해 데이터를 표시하도록 한다.

<body>
	<c:forEach var='obj' items='${list }'>
		${obj.data1 }, ${obj.data2 }, ${obj.data3 }<br/>
	</c:forEach>
</body>

이제 서버를 실행하면 작동하는 것을 볼 수 있다.






© 2021.11. by 21thkafka

Powered by 21thkafka