2021. 3. 17. 00:18ㆍ웹프로젝트/설정
Mybatis 다운로드 방법
1. github.com/mybatis 접속하여 아래와 같이 mybatis.jar 다운로드
2. 다운로드 된 mybatis.jar를 mybatis를 설정할 프로젝트에 추가해줌.
Mybatis 프로젝트 적용
Mybatis를 적용하기 전 프로젝트는 순수 Java JDBC가 적용된 웹프로젝트(dynamic web project)였음.
하지만, SPRING 적용전 공부삼아 mybatis 적용을 위해 설정해봄.
[JDBC 적용된 웹프로젝트]
1. TestInsert.java
public class TestInsert implements CommandAction{
private DataService service = DataService.getInstance();
@Override
public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
DataProcess dataProc = new DataProcess();
Connection conn = dataProc.getConnect(PropConfig.getPropString("DB_URL"), PropConfig.getPropString("DB_USER_ID"), PropConfig.getPropString("DB_USER_PW"));
boolean queryRet = dataProc.InsertTabDocTitleData(conn);
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
2. DataProcess.java
public class DataProcess {
private String INSERT_TAB_DOC_TITLE_SQL = "insert into tab_doc_title(doc_key_num, doc_key_num_nm) values(?,?)";
/**
* 데이터베이스 연결
* @param url
* @return
*/
public Connection getConnect(String url, String id, String pw) {
//excel 테이블 추가
public boolean InsertTabDocTitleData(Connection conn) {
PreparedStatement pstmt = null;
ResultSet rs = null;
int rowCnt = 0;
try {
//PDF 파일 정보를 Insert 한다.
pstmt = conn.prepareStatement(INSERT_TAB_DOC_TITLE_SQL);
System.out.println("pstmt1 : " +pstmt);
pstmt.setString(1, (new SimpleDateFormat("yyyyMMddHHmmssSSS")).format(new Date())); //문서 KEY
pstmt.setString(2, "통합문서1"); //문서 이름
rowCnt = pstmt.executeUpdate();
Thread.sleep(10);
conn.commit();
return true;
}
catch(Exception e) {
System.out.println(e.toString());
logger.error(e.toString());
try {
conn.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
System.out.println(e1.toString());
logger.error(e1.toString());
}
return false;
} finally {
try {
if( rs != null ) {rs.close();}
if( pstmt != null ) {pstmt.close();}
if( conn != null ) {conn.close();}
} catch(Exception e) {
throw new RuntimeException(e.getMessage());
}
}
}
}
[mybatis 적용된 웹프로젝트]
적용할 프로젝트에 mybatis.jar 있는지 확인 후 없으면, 다운로드 후 추가
1. TestInsert.java
public class TestInsert implements CommandAction{
private DataService service = DataService.getInstance();
@Override
public String requestPro(HttpServletRequest request, HttpServletResponse response) throws Throwable {
service.insertList();
return null;
}
}
2. DataService.java
package com.tabula.cores;
import java.sql.SQLException;
public class DataService {
private static DataService service;
private DataDAO dao = DataDAO.getInstance();
public static DataService getInstance(){
if(service == null){
service = new DataService();
}
return service;
}
public int insertList() {
int result = 0;
try {
result = dao.insertList();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
}
3. DataDAO.java
SqlSession사용 후 finally{}구문에서 SqlSession 닫을 때 insert,update,delete 쿼리사용시에는 닫기 전 반드시 'sqlSession.commit' 해주어야 함. (안 해주면, 에러 발생없이 디비에 반영이 안됨)
public class DataDAO {
private static DataDAO dao;
public static DataDAO getInstance() {
if(dao == null){
dao = new DataDAO();
}
return dao;
}
SqlSessionFactory sqlSessionFactory = SqlMapClient.getSqlSessionFactory();
public int insertList() throws SQLException {
int resultCnt = 0;
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
String docKeyNum ="123";
String docKeyNumNm = "통합문서23";
Map<String,String> paramMap = new HashMap<String,String>();
paramMap.put("docKeyNum",docKeyNum);
paramMap.put("docKeyNumNm",docKeyNumNm);
List<Map<String,String>> paramList = new ArrayList<Map<String,String>>();
paramList.add(paramMap);
resultCnt = sqlSession.insert("testsql.tabDocTitleInsert", paramList);
}catch(Exception e) {
e.printStackTrace();
}finally {
sqlSession.commit();
sqlSession.close();
}
return resultCnt;
}
}
4.SqlMapClient.java
public class SqlMapClient {
public static SqlSessionFactory sqlSessionFactory;
static{
String resource = "com/tabula/properties/mybatisInfo.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
5.mybatisInfo.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="com/tabula/properties/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_USER_ID}"/>
<property name="password" value="${DB_USER_PW}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/tabula/properties/mybatisSql.xml"></mapper>
</mappers>
</configuration>
6.db.properties
DB_URL=프로젝트에연결할 DB URL
DB_USER_ID=프로젝트에연결할 DB USER ID
DB_USER_PW=프로젝트에연결할 DB USER PW
DB_DRIVER=프로젝트에연결할 DB
7. mybatisSql.xml
insert 파라미터로 List나 Map을 사용할 경우 foreach구문으로 세팅해주어야함.
<?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="testsql" >
<insert id="tabDocTitleInsert" parameterType="java.util.List">
insert into tab_doc_title(
doc_key_num,
doc_key_num_nm
) values(
<foreach collection="list" item="value" index="idx" separator=",">
#{value.docKeyNum}
,#{value.docKeyNumNm}
</foreach>
)
</insert>
</mapper>
참고
1. 참고로, 'insert'쿼리 사용시 나의 경우 DTO 세팅 없이 'insert'쿼리에 넘길 파라미터를 최종적으로 List를 사용해서 넘김.
List나 Array타입을 collection으로 설정할 수 있으며, 이 때 List나 Array데이터는 Map으로 타입이 변환되어 저장됨.
(근데, List로 넘길때는 타입이 Map이 아니면(String, int, ... 등등의 타입) List에 담을 타입을 Map으로 감싼 뒤에 List에 담아서 넘겨야만 정상적으로 실행가능한 것 같음.)
2. mybatis foreach문 지원태그
- collection : 전달받은 인자. Lust or Array 형태만 가능
- item : 전달받은 인자값을 alias명으로 대체
- open : 구문이 시작될 때 삽입할 문자열
- close : 구문이 종료될 때 삽입할 문자열
- seperator : 반복되는 사이에 출력할 문자열
- index : 반복되는 구문 번호. 0부터 순차적으로 증가
2-1. 배열 파라미터를 Map을 통해 넘겼을 경우
String[] userArray = {"1","2","3"}
/*DAO*/
public List<Members> getAuthUserList(String[] userArray) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("userArray",userArray);
return sqlSession.selectList("getAuthUserList", map);
}
/*xml*/
<select id="getAuthUserList" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="userArray" item="arr" open="(" close=")" separator=",">
#{arr}
</foreach>
ORDER BY m.authority;
</select>
2-2. 배열 파라미터를 직접 넘겼을 경우
String[] userArray = {"1","2","3"}
/*DAO*/
public List<Members> getAuthUserList(String[] userArray) {
return sqlSession.selectList("getAuthUserList", userArray);
}
/*xml*/
<!-- collection을 반드시 'array'로 작성하여야 함 -->
<select id="getAuthUserList" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="array" item="arr" open="(" close=")" separator=",">
#{arr}
</foreach>
ORDER BY m.authority;
</select>
2-3. 리스트 Map을 통해 넘길 경우
List<Members> chkList = userService.getUserList();
/*DAO*/
public List<Members> getListTest(List<Members> chkList) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("chkList",chkList);
return sqlSession.selectList("getListTest", map);
}
/*xml*/
<!-- collection을 반드시 넘겨주는 리스트 변수 값과 동일하게 작성하여야 함 -->
<select id="getListTest" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="chkList" item="item" open="(" close=")" separator=",">
#{item.authority}
</foreach>
ORDER BY m.authority;
</select>
2-4. 리스트 직접 넘길 경우
List<Members> chkList = userService.getUserList();
/*DAO*/
public List<Members> getListTest(List<Members> chkList) {
return sqlSession.selectList("getListTest", chkList);
}
/*xml*/
<!-- collection을 반드시 'list'로 작성해야함 -->
<select id="getListTest" resultType="members">
SELECT m.*,a.name FROM members AS m
JOIN authority AS a ON m.authority = a.authority
WHERE m.authority IN
<foreach collection="list" item="item" open="(" close=")" separator=",">
#{item.authority}
</foreach>
ORDER BY m.authority;
</select>
참고 :
blog.naver.com/PostView.nhn?blogId=onnyang&logNo=10180243634