전에 포스팅 했던 MyBatis XML방식으로 데이터베이스와 연동해서 데이터값을 출력했다.
이번엔 기존 XML방식 으로 CRUD을 활용해서 DB데이터를 추가,수정,삭제하는 기능을 구현해보자.
MyBatis에서 XML방식에는는 CRUD에 필요한 SQL 쿼리문과 Java 객체 사이의 매핑을 관리하기 위해 XML 파일이 다음과 같이 필요하다.
자바와 데이터베이스를 연동 하기 위해 별도의 파일을 생성하여 코드를 작성한다.
driver=org.mariadb.jdbc.Driver
url=jdbc:mariadb://127.0.0.1:3306/bangdb
username = kwangjin
password = *****
<mapper namespace="dev">
<!--데이터 조회-->
<select id="selectDataAll" resultType="dto">
select * from membertab
</select>
<!--데이터 추가 -->
<insert id="insertData" parameterType="formbean">
insert into membertab values(#{id},#{name},#{passwd},now())
</insert>
<!--데이터 수정 -->
<update id="updateData" parameterType="formbean">
update membertab set name=#{name} where ${colname}=#{id}
</update>
<!--데이터삭제 -->
<delete id="deleteData" parameterType="string">
delete <include refid="my2" />
</delete>
</mapper>
properties에서 설정한 DB연결 정보와 Mapper안에서 작성한 쿼리문들의 정보를 담고 있는 파일을 하나 생성하자.
XML방식으로 MyBatis를 사용하여 데이터베이스 작업을 수행하려면 아래 코드처럼 설정을 정확하게 구성해야 한다.
<configuration>
<mappers>
<mapper resource="pack/mybatis/DataMapper.xml" />
</mappers>
</configuration>
Configuration.xml 설정 파일을 불러오고 설정 정보를 가져온다.
public class SqlMapConfig {
public static SqlSessionFactory sqlSession;
static {
String resource = "pack/mybatis/Configuration.xml";
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlSession = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (Exception e) {
System.out.println("SqlMapConfig 오류 : " + e);
}
}
public static SqlSessionFactory getSqlSession() {
return sqlSession;
}
}
여기서 CRUD의 기능을 구현하기 때문에 코드가 길어지므로 인터페이스를 사용하자. 그 이유는 각 기능의 목차 유지 보수와, 알아보기가 쉽기 때문이다.
RUD(Create, Read, Update, Delete) 작업을 수행하기 위한 메서드를 정의한 인터페이스이다.
각 메서드는 데이터베이스에서 데이터를 조회하거나 추가, 수정, 삭제하는데 사용된다.
public interface ProcessInterface {
List<DataDto> selectDataAll();
DataDto selectDataPart(String id);
boolean insertData(DataFormbean bean);
boolean updateData(DataFormbean bean);
boolean deleteData(String id);
}
public class ProcessImpl implements ProcessInterface {
private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
@Override
public List<DataDto> selectDataAll() {
SqlSession sqlSession = factory.openSession();
List<DataDto> list = null;
try {
list = sqlSession.selectList("selectDataAll");
} catch (Exception e) {
System.out.println("selectDataAll err : " + e);
} finally {
if(sqlSession != null) sqlSession.close();
}
return list;
}
}
ProcessImpl
클래스 파일은 앞서 CRUD에 필요한 메서드들을 있는 ProcessInterface
클래스 파일을 인터페이스 한다.
데이터베이스 조회이므로 복수 개의 데이터 값을 담고 보이기 위해 List 객체를 사용하였다.
SqlSession은 앞서 SqlSessionFactory 객체를 사용하여 DB와 자바의 상호작용을 하기 위해 생성되었다.
세션을 한번 생성하면 매핑구문을 실행하거나 커밋 또는 롤백을 하기 위해 세션을 사용할수 있다.
// 생략
@Override
public boolean insertData(DataFormbean bean) {
boolean b = false;
SqlSession sqlSession = factory.openSession();
try {
if(sqlSession.insert("insertData", bean) > 0) b = true;
sqlSession.commit();
}
//...생략
return b;
}
// 생략
@Override
public boolean updateData(DataFormbean bean) {
boolean b = false;
SqlSession sqlSession = factory.openSession();
try {
// 비밀번호 비교 후 수정 여부를 판단하는 코드로직 작성
DataDto dto = selectDataPart(bean.getId());
System.out.println("잘 찍히는지 확인하자 : " + dto.getName());
// 비밀번호가 일치하는 경우
if(dto.getPasswd().equals(bean.getPasswd())) {
bean.setColname("id"); // 컬럼명이 동적인 경우
if(sqlSession.update("updateData", bean) > 0) {
sqlSession.commit();
b = true;
}
}
}
//..생략
return b;
}
// 생략
@Override
public boolean deleteData(String id) {
boolean b = false;
SqlSession sqlSession = factory.openSession();
try {
int cou = sqlSession.delete("deleteData", id);
if(cou > 0) b = true;
sqlSession.commit();
}
//..생략
return b;
}