board_dao2.xml 생성member_dao 파일에 xml 붙여넣기프로젝트할 때
서비스는 기능 이름으로 만들기, 컨트롤러도 마찬가지
namespace에 매핑되는 DAO를 복붙해서 연결한다.
<?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="com.mycompany.backendapi.database.dao.MemberDao">
<insert id="insert"></insert>
<delete id="delete"></delete>
<update id="update"></update>
<select id="selectByMid"></select>
</mapper>
id의 값이 DAO 인터페이스의 메서드 이름과 매핑된다.
동적 SQL은 조건에 따라 SQL 구문이 바뀌는 것이다.
mybatis-config.xml에 아래 설정을 추가한다.
<configuration>
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
</configuration>
<?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="com.mycompany.backendapi.database.dao.BoardDao">
<insert id="insert" parameterType="Board">
<selectKey keyProperty="bno" resultType="int" order="BEFORE">
select board_bno_seq.nextval from dual
</selectKey>
insert into board
(bno, btitle, bcontent, bdate, bwriter,
battachoname, battachsname, battachtype, battachdata)
values
(#{bno}, #{btitle}, #{bcontent}, sysdate, #{bwriter},
#{battachoname}, #{battachsname}, #{battachtype}, #{battachdata})
</insert>
</mapper>
<mapper namespace="...">이 XML이 어떤 DAO 인터페이스와 연결되는지 지정한다.
BoardDao 인터페이스의 메서드와 여기 정의된 SQL이 매핑된다.
<insert id="insert" parameterType="Board">insert라는 이름의 SQL 구문이다.Board 객체를 파라미터로 받는다.Board 타입 alias가 등록되어 있어야 한다.<selectKey> — 핵심 포인트<selectKey keyProperty="bno" resultType="int" order="BEFORE">
select board_bno_seq.nextval from dual
</selectKey>
| 속성 | 의미 |
|---|---|
keyProperty="bno" | 조회 결과를 Board 객체의 bno 필드에 넣는다 |
resultType="int" | 결과 타입은 int |
order="BEFORE" | INSERT 실행 전에 먼저 실행한다 |
Oracle의 시퀀스.nextval로 다음 번호를 가져온다.
MySQL은 AUTO_INCREMENT를 쓰지만, Oracle은 시퀀스를 직접 조회해야 하기 때문에 이 방식을 사용한다.
board_bno_seq.nextval이 bno가 되는 원리board_bno_seq.nextval 실행 → Oracle 시퀀스가 숫자(예: 5) 반환keyProperty="bno" 덕분에 → Board 객체의 bno 필드에 저장#{bno} 사용 → 그 5가 들어간다
keyProperty가 없으면 조회하고 끝이라 INSERT에서 사용할 수 없다.
keyProperty="bno"가 "이 조회 결과를 bno에 넣어라"고 연결해주는 핵심 속성이다.
insert into board
(bno, btitle, bcontent, bdate, bwriter,
battachoname, battachsname, battachtype, battachdata)
values
(#{bno}, #{btitle}, #{bcontent}, sysdate, #{bwriter},
#{battachoname}, #{battachsname}, #{battachtype}, #{battachdata})
#{필드명} → Board 객체의 getter를 통해 값을 가져온다.bdate는 sysdate로 DB에서 현재 시각을 자동 입력한다.battach* 컬럼들은 파일 첨부 정보를 저장한다.| 컬럼 | 역할 |
|---|---|
battachoname | 원본 파일명 (Original Name) |
battachsname | 서버 저장 파일명 (Saved Name) |
battachtype | 파일 MIME 타입 |
battachdata | 파일 데이터 (BLOB) |
insert(board) 호출<selectKey>가 먼저 실행 → board_bno_seq.nextval 조회bno 필드에 자동 주입INSERT INTO board 실행 (bno 포함)Board 객체를 받아 → 시퀀스로 bno 다음 번호 뽑아오기 → 그 bno 포함해서 board 테이블에 INSERT하는 MyBatis SQL mapper