
역할: DB 접속/트랜잭션/데이터소스 환경을 담는 객체
생성
Environment env = new Environment(
"dev",
new JdbcTransactionFactory(), // 권장: 수동 커밋
new PooledDataSource(DRIVER, URL, USER, PASSWORD) // 권장: 커넥션풀
);
트랜잭션 매니저
JdbcTransactionFactory: 코드로 commit/rollback 제어(권장)ManagedTransactionFactory: 컨테이너가 관리(자동 커밋)DataSource
PooledDataSource: 커넥션 풀 사용(속도/메모리 효율 ↑)UnpooledDataSource: 매 호출마다 새 커넥션역할: 전역 설정 컨테이너(환경, 매퍼 등록, 별칭 등)
사용
Configuration conf = new Configuration(env);
conf.addMapper(Mapper.class);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(conf);
try (SqlSession session = factory.openSession(false)) { // auto-commit=false 권장
// ... CRUD
session.commit();
}
Factory: 앱 스코프 싱글톤 추천(여러 번 빌드 금지)
Session:
openSession 주요 오버로드
openSession(): 기본openSession(boolean autoCommit)openSession(Connection)openSession(ExecutorType) — SIMPLE/REUSE/BATCHSqlSession CRUD
| 메서드 | 설명 |
|---|---|
selectOne(String, Object) | 단일 행 |
selectList(String, Object) | 리스트 |
selectMap(String, Object, String mapKey) | 맵 |
insert/update/delete(String, Object) | DML(반환: 영향 행 수) |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
...
</configuration>
<properties>${key} 참조<properties resource="config/db.properties"/>
<settings><settings>
<setting name="jdbcTypeForNull" value="NULL"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>resultType/parameterType 간결화<typeAliases>
<typeAlias type="com.example.Member" alias="Member"/>
</typeAliases>
<environments><environments default="dev">
<environment id="dev">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<mappers><mappers>
<mapper resource="member/model/mapper/member-mapper.xml"/>
<!-- 또는 <mapper class="com.example.MemberMapper"/> -->
<!-- 또는 <package name="com.example.mapper"/> -->
</mappers>
<typeHandler>: 타입 변환(ENUM, 암복호화 등 특수 케이스)<objectFactory>: 결과 객체 생성 커스터마이징(희소)<plugins>: 실행 시점 가로채기(로깅/검증) — AOP 유사Mapper mapper = session.getMapper(Mapper.class);
var date = mapper.selectSysdate();
@Results(id = "menuRM", value = {
@Result(id = true, property = "code", column = "MENU_CODE"),
@Result(property = "name", column = "MENU_NAME"),
@Result(property = "price", column = "MENU_PRICE"),
@Result(property = "categoryCode", column = "CATEGORY_CODE"),
@Result(property = "orderableStatus", column = "ORDERABLE_STATUS")
})
@Select("""
SELECT MENU_CODE, MENU_NAME, MENU_PRICE, CATEGORY_CODE, ORDERABLE_STATUS
FROM TBL_MENU
WHERE ORDERABLE_STATUS='Y' AND MENU_CODE = #{code}
""")
@ResultMap("menuRM")
MenuDTO selectMenuByCode(int code);
@Insert("""
INSERT INTO TBL_MENU (MENU_NAME, MENU_PRICE, CATEGORY_CODE, ORDERABLE_STATUS)
VALUES (#{name}, #{price}, #{categoryCode}, 'Y')
""")
int insertMenu(MenuDTO m);
@Update("""
UPDATE TBL_MENU
SET MENU_NAME=#{name}, MENU_PRICE=#{price}, CATEGORY_CODE=#{categoryCode}
WHERE MENU_CODE=#{code}
""")
int updateMenu(MenuDTO m);
@Delete("DELETE FROM TBL_MENU WHERE MENU_CODE = #{code}")
int deleteMenu(int code);
<mapper namespace="풀클래스명(인터페이스)"> 필수<select|insert|update|delete id> 일치resultMap<resultMap id="MemberRM" type="Member">
<id property="userId" column="USER_ID"/>
<result property="password" column="PASSWORD"/>
<result property="userName" column="USER_NAME"/>
</resultMap>
<id>, <result>, <constructor>, <association>, <collection>, <discriminator>select<select id="findById" parameterType="string" resultMap="MemberRM">
SELECT USER_ID, PASSWORD, USER_NAME
FROM MEMBER
WHERE USER_ID = #{userid}
</select>
#{}(권장) vs ${}(그대로 치환, 인젝션 위험)resultType(직접 타입) 또는 resultMap(매핑 규칙)insert / update / delete<insert id="insertMember" parameterType="Member" useGeneratedKeys="true">
INSERT INTO MEMBER (...) VALUES (#{...})
</insert>
<update id="updateMember" parameterType="Member">
UPDATE MEMBER SET ... WHERE ID = #{id}
</update>
<delete id="deleteMember" parameterType="string">
DELETE FROM MEMBER WHERE ID = #{userid}
</delete>
flushCache, timeout, statementType 등cache / cache-ref<cache eviction="LRU" flushInterval="1000" size="512" readOnly="true"/>
select 캐시, insert/update/delete 시 캐시 삭제sql + include (SQL 조각 재사용)<sql id="columns">
MENU_CODE, MENU_NAME, MENU_PRICE, CATEGORY_CODE, ORDERABLE_STATUS
</sql>
<select id="selectSqlTest" resultMap="menuRM">
SELECT <include refid="columns"/> FROM TBL_MENU WHERE ORDERABLE_STATUS='Y'
</select>
Environment + Configuration으로 구성하고, Factory 싱글톤, Session은 요청 단위 생성/종료.resultMap으로 명시 매핑, 파라미터 바인딩은 #{} 우선.