Spring 데이터 베이스 연결
- 어떻게 하면 DB연결을 손쉽게 할 수 있을 것인가에 대한 고민?
- 연동방법에 대한 효과성
- 구조
- DB 및 설정 처리(mybatis-config.xml)
- VO 클래스 선언
- 1.type="해당클래스 실제 위치" alias="mapper에서 사용할 이름" ex) alias="emp"
- environments : db연결정보 처리
- transactionManager type="JDBC"
- dataSource를 통해서 연결정보 선언
- 속성 : type="POOLED"
- 메서드(property)
- driver : oracle.jdbc.driver.OracleDriver
- url : jdbc : oracle:thin:@localhost:1521:orcl
- username:scott
- password:tiger
- mappers : 실제 sql구문이 있는 위치를 설정
- resource="경로/EmpMapper.xml"
- spl 구문 처리(XXXMapper.xml)
- namespace="구분되는 형식 내용 선언"
- ex)패키지명.EmpMapper
- resultMap:결과에 대한 선언
- ResultSet = pstmt.excutequery
- while (rs.next()){ <-- 요런식으루 ArrayList로 가지고옴
- 해당 sql의 결과 값을 선언 ex) type(VO) 이 배열 형태로 모여있는것을정의
- <resultMap type="emp" id="empRst"/>
- config.xml에 선언된 alias의 이름의 배열 형태를 empRst라고 합니다
- select id ="selectEmp" resultMap="empRst" parameterType="emp"
- ArrayList<Emp> selectEmp(Emp sch){
- ArrayList<Emp> empRst.......
- return empRst;
- }
- sql 구분을 쓰는데 외부에서 호출할 때 , selectEmp라고 하면 결과값은 empRst라고 합니다 라는내용
- 데이터를 처리하는 dao단(struts) , repository단 호출 처리
- SqlSessionFactory : 설정 xml호출하여 DB연결처리
- SqlSession : getSqlSessionFactory()의 openSession()을 통해서 특정한 sql을 호출
- sqlSession.selectList(namespace+".sql id")
- ArrayList<VO>의 데이터를 가져올 때 처리하는 메서드
설정을 위한 파일들?
- log4j.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
<!--param name="ConversionPattern" value="
%d{yyyy-MM-dd HH:mm:ss} [%-5p](%-35c{1}:%-3L) %m%n" /-->
</layout>
</appender>
<logger name="ldg.mybatis" additivity="false">
<level value="DEBUG" />
<appender-ref ref="console" />
</logger>
<root>
<level value="DEBUG" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
| cs |
- mybatis-config.xml
- DBConn에서 setConn부분의 역할
1
2
3
4
5
6
7
8
9
10
|
public void setConn() throws ClassNotFoundException, SQLException{
//1.메모리 로딩 jdbc
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.db서버 연걸 sid:orcl port:1521
String coninfo="jdbc:oracle:thin:@59.10.147.68:1521:orcl";
con=DriverManager.getConnection(coninfo,"scott","tiger");
System.out.println("접속성공");
}
| cs |
- 위와 같은 형태의 내용
- typeAlias == 사용될 객체의 주소와 간단하게 선언(alias)
- mapper.xml == mapper.xml파일의 주소
- dataSource type == "POOLED" 데이터를 처리하는방식중 효율적인 방식(?)
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
|
<?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>
<!-- vo 처리
데이터의 한개당 입력되는 클래스를 간단하게 alias이름으로 선언 -->
<typeAliases> 사용될 객체를 선언
<typeAlias type="springwebPackage.d02_myBatis.model.Emp"
alias="emp"/>
</typeAliases>
<!-- db연결정보 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@59.10.147.68:1521:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</dataSource>
</environment>
</environments>
<!-- mapper.xml -->
<mappers>
<mapper resource="springwebPackage/d02_myBatis/mapper/EmpMapper.xml"/>
</mappers>
</configuration>
| cs |
- EmpMapper.xml
- 실제 sql쿼리문이 있는곳
- select id 를 설정해서 해당 아이디를 실행단에서 불러옴
1
2
3
4
5
6
7
8
9
10
11
12
|
<?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">
<!-- namespace : 구분자 -->
<mapper namespace="EmpMapper">
<!-- resultMap선언 -->
<resultMap type="emp" id="empRst"/>
<select id="selectEmplist" resultMap="empRst">
select * from emp
</select>
</mapper>
| cs |
- DBConn에서 이부분의 역할
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public void insComment(Board ins){
String sql=" insert INTO BOARDSJH VALUES(
(select max(no+1) from BOARDSJH),"
+ " ?, ?, ?, sysdate, sysdate, ?, 0) ";
try {
setConn();
pstmt=con.prepareStatement(sql);
con.setAutoCommit(false);
pstmt.setString(1, ins.getTitle());
pstmt.setString(2,ins.getContent());
pstmt.setString(3, ins.getWriter());
pstmt.setInt(4, ins.getRefno());
pstmt.executeUpdate();
con.commit();
pstmt.close();
con.close();
| cs |
- 실행단 EmpRepository
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
32
33
34
35
36
37
38
39
40
|
public class EmpRepository {
private final String NAMESPACE="EmpMapper";
매핑된 mapper는 상수로 처리
//db연결 및 공통 설정정보 처리
private SqlSessionFactory getSqlSessionFactory(){
String resource="mybatis-config.xml";//생성한 mybatis-config파일 매핑
InputStream inputstream=null;
//xml설정 냉용을 stream 형식으로 가져와서 sqlSessionFactory에 넘겨줌
try {
inputstream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new SqlSessionFactoryBuilder().build(inputstream);
}
public List<Emp> selectEmplist(){
SqlSession sqlsess = getSqlSessionFactory().openSession();
try{
return sqlsess.selectList((NAMESPACE)+".selectEmplist");
}finally{
//자원 해제 처리 (에러가나던 어쩌던)
sqlsess.close();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new EmpRepository().selectEmplist();
}
}
| cs |
- vo단에서 직렬화 필수
1
2
|
public class Dept implements Serializable{
| cs |
- 파일구조
- src 바로 하위에 mybatis-config와 log4j 파일이 위치
특정 값을 parameter로 받아서 검색
- EmpMapper.xml 단에 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<select id="setSchEmpList" parameterType="emp" resultMap="empRst">
select * from emp where 1=1
<if test="ename != null">
<!-- if(sch.getEname()!=null)
and ename like '%' +sch.getEname()+'%' 과 동일
#{content} = 해당하는 VO property 설정해서 사용할때 preparestatement로
sql injection 을 차단
${내에용} = 동적 sql 을 사용할 때 : sql inject에 노출될 가망성이 있음
-->
and ename like '%' ||#{ename}||'%'
</if>
</select>
</mapper>
| cs |
- EmpRepository.java 에 메서드 추가
1
2
3
4
5
6
7
8
9
10
11
12
|
public List<Emp> setSchEmpList(Emp sch){
SqlSession sqlsess = getSqlSessionFactory().openSession();
try{
//조건 검색해서 처리할 내용
//select [ ,sch ] 뒤에 검색할 파라미터 값을 추가
return sqlsess.selectList((NAMESPACE)+".setSchEmpList" ,sch );
}finally{
//자원 해제 처리 에러가나던 어쩌던
sqlsess.close();
}
}
| cs |
댓글 없음:
댓글 쓰기