[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 폴더를 생성한다. 그리고 오른쪽 클릭을 하고 파일을 생성한다.
생성된 파일 안에 다음과 같은 코드를 적는다. 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
프로젝트에 오른쪽 클릭하고 데이터베이스 이름의 파일을 생성한다.
그리고 테이블을 생성시키는 코드를 입력한다.
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>
이제 서버를 실행하면 작동하는 것을 볼 수 있다.