たまにはサンプルプログラムなど
というわけで、データベースアクセスオブジェクトのサンプルなど……。書いているSQLが少しばかり複雑だったり、ORACLEだったりしますが気にしないように。
基底クラス……
/* * 概要 : * DAOの基底クラス * * 備考 : * なし * */ package sample.dao; import java.util.ArrayList; import sample.OrderByVo; /** * BaseDaoクラス。 * * Daoの基底クラス * */ public class BaseDao { /** * Where句の情報としてStringが渡された場合 * ArrayListに変換する。 * * @param obj StringまたはArrayListのWhere句情報 * @return ArrayListのWhere句情報 */ public ArrayList convArrayString(Object obj) { ArrayList list = null; String str = ""; String typeFlg = ""; try { list = (ArrayList) obj; typeFlg = "ArrayList"; } catch (ClassCastException e) { try { str = (String) obj; typeFlg = "String"; } catch (ClassCastException ex) { throw ex; } } if (list != null && typeFlg.equals("ArrayList")) { return list; } if (typeFlg.equals("String") && str.length() != 0) { list = new ArrayList(); list.add(str); return list; } return null; } /** * Order by句の情報としてStringが渡された場合 * ArrayListに変換するメソッド。 * * @param obj OrderBy句情報 * @return OrderByVoのArrayList * @throws Exception */ public ArrayList convOrderBy(Object obj) throws Exception { ArrayList list = null; String str = ""; String typeFlg = ""; OrderByVo vo = null; OrderByVo[] aryVo = null; try { list = (ArrayList) obj; typeFlg = "ArrayList"; } catch (ClassCastException e) { try { str = (String) obj; typeFlg = "String"; } catch (ClassCastException ex) { try { vo = new OrderByVo(null, null); vo = (OrderByVo) obj; typeFlg = "Vo"; } catch (ClassCastException exc) { throw exc; } } } if (list != null && typeFlg.equals("ArrayList")) { return list; } if (typeFlg.equals("String") && str.length() != 0) { list = new ArrayList(); vo = new OrderByVo(str, "ASC"); list.add(vo); return list; } if (typeFlg.equals("Vo") && vo != null) { list = new ArrayList(); list.add(vo); return list; } return null; } }
本体……
/* * * DAOサンプル * * 概要 : * サンプルアクセスクラス。 * * 備考 : * なし * * */ package sample.dao; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Types; import java.util.ArrayList; import sample.Vosample; import sample.OrderByVo; import sample.DBConnection; //import sample.LogUtil; //import sample.LogicException; /** * サンプル−データベースアクセスクラス
* */ public class DaoSample extends BaseDao{ private DBConnection m_conn; /* デフォルトコンストラクタ */ public Daosample(DBConnection m_conn) { this.m_conn = m_conn; } /** * SELECT * * @param column_1 検索条件1 * @param orderBy ORDER BY句条件 * @param rowNum 最大取得件数 * * @return list SELECTした内容 * * @exception Exception 実行処理例外 */ public ArrayList select( Object column_1, Object orderBy, int rowNum) throws Exception { /* 変数宣言 */ PreparedStatement pstmt = null; String vo_strColumn_1 = null; String vo_strColumn_2 = null; String vo_strColumn_3 = null; String vo_strColumn_4 = null; String vo_strColumn_5 = null; String vo_strColumn_6 = null; String vo_strColumn_7 = null; String vo_strColumn_8 = null; String vo_strColumn_9 = null; String vo_strColumn_10 = null; String vo_strColumn_11 = null; ArrayList aryColumn_1 = null; ArrayList aryOrderBy = null; /* レコードセットオブジェクト */ ResultSet rs = null; ArrayList list = new ArrayList(); aryColumn_1 = convArrayString(column_1); aryOrderBy = convOrderBy (orderBy); String sqlWhere = buildSql( aryColumn_1, aryOrderBy, rowNum); try { String sqlStmt = constData.SampleSel + sqlWhere; /* PreparedStatement作成 */ pstmt = m_conn.getPreparedStatement(sqlStmt); int count = 0; /* カラム1 */ if ((aryColumn_1 != null) && (aryColumn_1.size() != 0)) { String strColumn_1 = (String)aryColumn_1.get(0); if ((!strColumn_1.equals("NOT NULL")) && (!strColumn_1.equals("NULL"))) { for (int i = 0; i < aryColumn_1.size(); i++) { pstmt.setString(++count, (String)aryColumn_1.get(i)); } } } /* カラム1 */ if ((aryColumn_1 != null) && (aryColumn_1.size() != 0)) { String strColumn_1 = (String)aryColumn_1.get(0); if ((!strColumn_1.equals("NOT NULL")) && (!strColumn_1.equals("NULL"))) { for (int i = 0; i < aryColumn_1.size(); i++) { pstmt.setString(++count, (String)aryColumn_1.get(i)); } } } /* DAO実行 */ rs = pstmt.executeQuery(); while (rs.next()) { vo_strColumn_1 = rs.getString("COLUMN_1"); vo_strColumn_2 = rs.getString("COLUMN_2"); vo_strColumn_3 = rs.getString("COLUMN_3"); vo_strColumn_4 = rs.getString("COLUMN_4"); vo_strColumn_5 = rs.getString("COLUMN_5"); vo_strColumn_6 = rs.getString("COLUMN_6"); vo_strColumn_7 = rs.getString("COLUMN_7"); vo_strColumn_8 = rs.getString("COLUMN_8"); vo_strColumn_9 = rs.getString("COLUMN_9"); vo_strColumn_10 = rs.getString("COLUMN_10"); vo_strColumn_11 = rs.getString("COLUMN_11"); VoSample Vo = new VoSample( vo_strColumn_1, vo_strColumn_2, vo_strColumn_3, vo_strColumn_4, vo_strColumn_5, vo_strColumn_6, vo_strColumn_7, vo_strColumn_8, vo_strColumn_9, vo_strColumn_10, vo_strColumn_11); list.add(Vo); } } finally { if ((m_conn != null) && (pstmt != null)) { if (rs != null) rs.close(); m_conn.closeStatement(pstmt); } } return list; } /** * Where句以降を動的に組み立てる * * @param aryColumn_1 カラム1 * @param orderBy ORDER BY句の内容 * @param rowNum 最大取得件数 * * @return String SQL文 * * @exception Exception 実行処理例外 */ private String buildSql( ArrayList aryColumn_1, ArrayList orderBy, int rowNum) throws Exception { boolean whereFlg = false; String outString = ""; outString = outString + " (SELECT COUNT(*) AS MAXCOUNT "; outString = outString + "FROM SAMPLE WHERE "; if (aryColumn_1 != null && aryColumn_1.size() != 0) { whereFlg = true; String strColumn_1 = (String)aryColumn_1.get(0); if (strColumn_1.equals("NOT NULL") || strColumn_1.equals("NULL")) { if (strColumn_1.equals("NULL")) { outString = outString + "COLUMN_1 IS NULL AND "; } else { outString = outString + "COLUMN_1 IS NOT NULL AND "; } } else { outString = outString + "COLUMN_1 in ("; for (int i = 0; i < aryColumn_1.size(); i++) { if (i != 0) { outString = outString + ", ?"; } else { outString = outString + "?"; } } outString = outString + ") AND "; } } if (whereFlg == false) { outString = outString.substring(0, outString.length() - 6); } else { outString = outString.substring(0, outString.length() - 4); } outString = outString + ") WHERE "; if (aryColumn_1 != null && aryColumn_1.size() != 0) { String strColumn_1 = (String)aryColumn_1.get(0); if (strColumn_1.equals("NOT NULL") || strColumn_1.equals("NULL")) { if (strColumn_1.equals("NULL")) { outString = outString + "COLUMN_1 IS NULL AND "; } else { outString = outString + "COLUMN_1 IS NOT NULL AND "; } } else { outString = outString + "COLUMN_1 in ("; for (int i = 0; i < aryColumn_1.size(); i++) { if (i != 0) { outString = outString + ", ?"; } else { outString = outString + "?"; } } outString = outString + ") AND "; } } if (whereFlg == false) { outString = outString.substring(0, outString.length() - 6); } else { outString = outString.substring(0, outString.length() - 4); } if (orderBy != null && orderBy.size() != 0) { outString = outString + "ORDER BY "; for (int i = 0; i < orderBy.size();i++) { OrderByVo Vo = new OrderByVo(null,null); Vo = (OrderByVo) orderBy.get(i); if ( i == 0 ) { outString = outString + Vo.getCol() + " " + Vo.getOrder(); } else { outString = outString + ", " + Vo.getCol() + " " + Vo.getOrder(); } } outString.substring(0, outString.length() - 3); } else { outString = outString + "ORDER BY "; outString = outString + "COLUMN_1, "; outString = outString.substring(0, outString.length() - 2); } outString = outString + ")"; if (rowNum > 0) { outString = outString + " WHERE rownum <= " + rowNum + " "; } return outString; }
SQL文定義……これ以降はDAOのなかで作ります。
/* * 概要 : * SQL定数定義。 * */ package sample.dao; /** * SQL定数定義インターフェース。 */ public interface constData { /** * サンプル選択 */ String SampleSel = "SELECT * FROM (SELECT MAXCOUNT, " + "SAMPLE.COLUMN_1, " + "SAMPLE.COLUMN_2, " + "SAMPLE.COLUMN_3, " + "SAMPLE.COLUMN_4, " + "SAMPLE.COLUMN_5, " + "SAMPLE.COLUMN_6, " + "SAMPLE.COLUMN_7, " + "SAMPLE.COLUMN_8, " + "SAMPLE.COLUMN_9, " + "SAMPLE.COLUMN_10, " + "SAMPLE.COLUMN_11 " + "FROM SAMPLE,"; }
SQLが複雑なのは一度に選択できるレコードの数を引数で制御できるようにしてあるからです。MySQLあたりだと、LimitでOrder byの順序を保ったまま選択できるのですが、ORACLEのROWNUMはOrder byがかかる前の段階でレコード数を制限してしまう仕様になっているのでサブクエリーを使わなければならないという。
DBConnectionあたりは、まあわざわざ書かなくても想像がつくと思われるので割愛。さて、これを動かしたときにどんなSQLが組まれるのか……わかったらコメントかトラックバックかしてみるといいかも。(id:syuzabu)
なお、実際に動かしてみていませんので細かいところで間違いがあるかも。