티스토리 뷰
myBatis mapper에서 바인딩 변수는 파라미터 값을 이용합니다.
그런데 시스템 공통 값을 property에 설정하고 이용할 수는 없을까요?
예를 들어 아래와 같은 쿼리에서 'securityKey' 값은 UserParam에는 없는 값입니다.
<select id="getUserInfo" resultType="User" parameterType="UserParam">
SELECT
user_id
, user_nm
, AES_DECRYPT(UNHEX(PW), '${securityKey}') pw
FROM USERS
WHERE user_id = #{userId}
</select>
이런 경우 처리 예제입니다.
[테스트 환경]
- java8
- spring boot
- myBatis
- mysql
내용
Datasource를 설정하는 @Configuration Bean에서 mybatis-config.xml을 설정하고 해당 파일에 프라퍼티 설정을 합니다. 그리고 해당 변수를 mapper에서 이용하면 끝~~~
1. Datasource 설정
@Configuration
public class DefaultDatabaseSource {
@Bean(name="dataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name="sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactoryBean(@Autowired @Qualifier("dataSource") DataSource dataSource, ApplicationContext applicationContext)
throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setConfigLocation(applicationContext.getResource("classpath:mybatis-config.xml"));
factoryBean.setMapperLocations(applicationContext.getResources("classpath:mapper/**/*.xml"));
return factoryBean.getObject();
}
@Bean(name="sqlSession")
@Primary
public SqlSessionTemplate sqlSession(@Autowired @Qualifier("sqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name="transactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Autowired @Qualifier("dataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
2. mybatis-config.xml에 property 설정.
<?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>
<properties resource="security.properties"></properties>
<settings>
<setting name="useGeneratedKeys" value="true"/>
<setting name="callSettersOnNulls" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="defaultStatementTimeout" value="200"/>
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="cacheEnabled" value="false" />
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
<typeAliases>
<package name="eblo"/>
</typeAliases>
<typeHandlers>
<typeHandler javaType="java.sql.Timestamp"
handler="org.apache.ibatis.type.DateTypeHandler"/>
<typeHandler javaType="java.sql.Time"
handler="org.apache.ibatis.type.DateTypeHandler"/>
<typeHandler javaType="java.util.Date"
handler="org.apache.ibatis.type.DateTypeHandler"/>
</typeHandlers>
</configuration>
<properties resource="security.properties"></properties> <-- 이 부분입니다.
해당 부분을 하단에 설정하는 경우 에러가 납니다.
에러내용
Caused by: org.xml.sax.SAXParseException: 요소 유형 "configuration"의 콘텐츠는 "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)"과(와) 일치해야 합니다.
에러 내용을 보고 properties가 오타도 아니고 일치하는데 왜 그럴까 싶은데 해당 속성이외 순서도 일치해야합니다.
순서 중요해요~~~
3. 프라퍼티 파일 생성, security.properties
securityKey=test1234
4. 테스트
기타 고려 사항.
사용자가 정의한 변수는 #{securityKey} 이렇게 사용할 수는 없습니다.
반드시 '${securityKey}' 이렇게 해야 합니다.
'DB' 카테고리의 다른 글
MYSQL - WITH 구문 (0) | 2023.07.19 |
---|---|
[ORACLE]LISTAGG 함수, ONE TO MANY, SINGLE ROW로 보여주기 (0) | 2020.04.03 |
[Oracle]삭제 데이터 복구하기 (0) | 2020.04.02 |
[mysql]암복화 예제 (0) | 2020.04.02 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Spring Boot
- springboot
- spring
- mapToList
- 샘플
- restful서비스
- lombok
- 그리드
- 설정
- example
- UI
- ag grid
- 타임리프
- 스프링
- oracle
- cache
- thymeleaf
- RESTful
- Javascript
- 스프링부트
- 엑셀
- listToMap
- AG-GRID
- 메시지
- java
- sample
- 예제
- SHEETJS
- mybatis
- REST
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함