검색결과 리스트
JDBC에 해당되는 글 2건
- 2009.01.14 IBATIS CLOB처리(flyx)
- 2008.12.02 JDBC2.0 커서이동
글
IBATIS CLOB처리(flyx)
%% 오라클 10g 이상 drive 에서 된다고함 %%
%% Clob 핸들러 없이 일반 select, insert, update, delete 로 처리됨 %%
1. sql-map-config.xml 설정
<dataSource type="DBCP">
<property name="JDBC.Driver" value="${jdbc.driverClassName}"/>
<property name="JDBC.ConnectionURL" value="${jdbc.url}"/>
<property name="JDBC.Username" value="${jdbc.username}"/>
<property name="JDBC.Password" value="${jdbc.password}"/>
<property name="JDBC.DefaultAutoCommit" value="true" />
<property name="Pool.MaximumActiveConnections" value="10"/>
<property name="Pool.MaximumIdleConnections" value="5"/>
<property name="Pool.MaximumCheckoutTime" value="120000"/>
<property name="Pool.TimeToWait" value="500"/>
<property name="Pool.PingQuery" value="select 1 from dual"/>
<property name="Pool.PingEnabled" value="true"/>
<property name="Pool.PingConnectionsOlderThan" value="1"/>
<property name="Pool.PingConnectionsNotUsedFor" value="1"/>
<property name="Driver.SetBigStringTryClob" value="true"/>
</dataSource>
</transactionManager>
2. sqlMap.xml 설정
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="DOMAIN">
<resultMap id="result_lob_map" class="java.util.HashMap">
<result property="idx_key" column="idx_key" />
<result property="content" column="content" jdbcType="CLOB" javaType="java.lang.String" />
</resultMap>
<select id="select_clob" resultMap="result_lob_map">
SELECT id idx_key, content content FROM CHON
</select>
<insert id="insert_clob" parameterClass="java.util.HashMap" >
insert into CHON(id, content)
values(#id#, #content:java.lang.String#)
</insert>
<update id="update_clob" parameterClass="java.util.HashMap" >
update CHON
set content = #content:java.lang.String#
where id = #id#
</update>
</sqlMap>
select시 resultMap을 이용해서 처리해야한다.
아래 insert부분은 flyx에 포함된 ibatis에서 insert 시 사용된 부분이다.
clob타입이든 varchar 타입이든 다른부분이 없음.
select시에만 상이함.
참고로 altibase5.0에서도 clob처리 방법이 동일함사용방법 동일함
(flex(flyx)+spring+ibatis+altibase경우 위에 첫번째에 해당하는 부분 불필요함)
<resultMap id="ResultClob" class="java.util.HashMap">
<result property="IDX" column="IDX" javaType="String"/>
<result property="TITLE" column="TITLE" javaType="String" />
<result property="CONTENT" column="CONTENT" javaType="java.lang.String" jdbcType="CLOB" />
</resultMap>
<select id="SELECT3" parameterClass="java.util.HashMap" resultMap="ResultClob">
SELECT IDX,TITLE,CONTENT FROM TEST1
</select>
<insert id="INSERT3" parameterClass="java.util.HashMap">
<![CDATA[
INSERT INTO TEST1(IDX,TITLE,CONTENT)
VALUES ((SELECT NVL(MAX(IDX),0)+1 AS IDX FROM TEST),#TITLE#,#CONTENT#)
]]>
</insert>
설정
트랙백
댓글
글
JDBC2.0 커서이동
/*
현재 프로그램은 콘솔창에서 실행되는 프로그램이다.
* 전체 -> 1 추가 ->2 삭제 ->3 종료->4
* 위의 메뉴에 따라 키보드로부터 값을 받아서 처리해야 한다.
rs.last() // 커서를 마지막으로 이동
rs.getRow(); // 테이블의 행의 갯수를 리턴함
아래코드는 넷빈으로 작성된 코드인데 ui부분은 swing의jTable을 이용하였다.
JDBC2.0 을 이용해서 커서를 제어하는 부분만 보면 도움이 될것이다.
테스트를 위한 SQL 스크립트파일 및 넷빈에서 돌려볼수있는 JAVA 소스 첨부
*/
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
/*
* JDBC_JTable.java
*/
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
public class JDBC_JTable extends javax.swing.JFrame {
private Connection con;
private Statement stmt;
private PreparedStatement pstmt;
private CallableStatement cstmt;
private ResultSet rs;
int row_count,col_count;
public JDBC_JTable() {
initComponents();
setBounds(200,200,500,500);
connected();
}
private void connected(){
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:sg", "scott", "tiger");
/*
* Statement를 아래와 같이 만들어주는 이유는 아래의 Statement를 통하여 얻어지는 결과
* 객체(ResultSet)의 커서와 형태를 유동적 또는 유연하게 하기 위해 JDBC2.0 기술을 사용한다.
* ex> rs.last(); // 커서를 마지막 행으로 이동
* rs.beforeFirst(); // 커서를 첫행보다 앞으로 이동
* rs.first(); // 커서를 첫행으로 이동
*/
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
pstmt = con.prepareStatement(
"insert into phone_values(phone_t_idx.nextvla,?,?,?)");
cstmt = con.prepareCall("{call del_phone(?)}");
setTitle("db연결완료");
} catch (Exception exception) {}
}
private void closed(){
try {
if(rs!=null)
rs.close();
if(stmt!=null)
stmt.close();
if(pstmt!=null)
pstmt.close();
if(cstmt !=null)
cstmt.close();
if(con !=null)
con.close();
} catch (Exception e) {
}
}
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jScrollPane1 = new javax.swing.JScrollPane();
table = new javax.swing.JTable();
jMenuBar1 = new javax.swing.JMenuBar();
jMenu1 = new javax.swing.JMenu();
jMenuItem1 = new javax.swing.JMenuItem();
jMenuItem2 = new javax.swing.JMenuItem();
jMenuItem3 = new javax.swing.JMenuItem();
jSeparator1 = new javax.swing.JSeparator();
jMenuItem4 = new javax.swing.JMenuItem();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
table.setModel(new javax.swing.table.DefaultTableModel(
new Object [][] {
},
new String [] {
}
));
jScrollPane1.setViewportView(table);
getContentPane().add(jScrollPane1, java.awt.BorderLayout.CENTER);
jMenu1.setText("SQL");
jMenuItem1.setText("전체보기");
jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jMenuItem1ActionPerformed(evt);
}
});
jMenu1.add(jMenuItem1);
jMenuItem2.setText("추가");
jMenu1.add(jMenuItem2);
jMenuItem3.setText("삭제");
jMenu1.add(jMenuItem3);
jMenu1.add(jSeparator1);
jMenuItem4.setText("종료");
jMenu1.add(jMenuItem4);
jMenuBar1.add(jMenu1);
setJMenuBar(jMenuBar1);
pack();
}// </editor-fold>
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
rs = stmt.executeQuery("select * from phone_t");
/*결과 객체의 커서를 마지막 행으로 이동*/
rs.last();
row_count = rs.getRow(); // 레코드의 수 (1차원 배열의 수);
rs.beforeFirst(); // 결과 객체의 커서를 원위치
/*컬럼 명들을 가져오기 위한 작업*/
ResultSetMetaData rsmd = rs.getMetaData(); // 열들의 대한 정보객체
col_count = rsmd.getColumnCount();
String[] f = new String[col_count];
for(int i = 0 ; i<f.length ; i++){
f[i] = rsmd.getColumnName(i+1);
}
/* 윗 부분까지가 컬럼 작업완료*/
/*db의 자원을 Object형 2차원 배열로 재포장 작업*/
Object[][] data = new Object[row_count][col_count];
/*
* 실제 자원은 ResultSet이 가지고 있으므로 그곳에 있는 자원들을
* data라는 2차원 배열의 각 요소에 넣어주면된다.
*/
for(int r =0;rs.next();r++){ // 레코드 수만큼
for(int c = 0;c<col_count;c++){ //컬럼의 수만큼 반복하는 반복문
data[r][c] = rs.getString(c+1);
System.out.println(data[r][c]);
}
}
table.setModel(new MyModel(data,f));
} catch (Exception exception) {
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JDBC_JTable().setVisible(true);
}
});
}
// Variables declaration - do not modify
private javax.swing.JMenu jMenu1;
private javax.swing.JMenuBar jMenuBar1;
private javax.swing.JMenuItem jMenuItem1;
private javax.swing.JMenuItem jMenuItem2;
private javax.swing.JMenuItem jMenuItem3;
private javax.swing.JMenuItem jMenuItem4;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JTable table;
// End of variables declaration
}
RECENT COMMENT