普段はJavaEEで開発を行っているのでデータベースへのアクセスはJPAを活用しています。
ただ、JavaEE環境だとglassfish経由でデータベースを動かしているので、glassfishを動かさずにデータベースへのアクセスをしたいときに、通常はアクセスできません。
そこで緊急的に直でデータベースにアクセスできる手法を探しました。
個人的な要望としては下記のような状態です。
- JDBCは知っているのですが、もっとスマートにかけるほうほうをしりたい
- デバッグなども簡単にできる
- 通常のSQLであってもO/Rマッパーでもどちらでもよい。
- なるべく設定ファイルなどを追加しないほうがいい
- JPAでGlassfish経由でなく直にアクセスする方法はしっているが設定がめんどい&少し遅い
こんな方法をいろいろと考えていましたが、DBUtilsというライブラリが便利で、上記条件を満たしているので使うことに。
※似た名前でDBUnitsというものがありますがこれは違います。
インストール
例によって下記をpomに追加します。
http://mvnrepository.com/artifact/commons-dbutils/commons-dbutils/1.5
1 2 3 4 5 |
<dependency> <groupId>commons-dbutils</groupId> <artifactId>commons-dbutils</artifactId> <version>1.6</version> </dependency> |
コード
- selectでは型を指定し、SQLを入力すればOK
- よくMap、List<Map>のデータをinsertしたいケースがあるので、これ用のメソッドを容易
- updateというメソッドはSQLのinseert,update,delete全てを含みます。単純にSQLを投げればOK
バインドさせているものと、いないものがあったりとあまり統一性はないので(とりあえずテストデータのinsertと抽出ができればOKだったので)詳しく仕様を見たい方はリンク先を見てみてください。
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
public class DBUtilsConnect{ /** * 接続情報 */ @Setter @Getter private Connection con = null; /** * URL */ @Getter @Setter private String url = ""; /** * ユーザー */ @Getter @Setter private String user = ""; /** * パスワード */ @Getter @Setter private String password = ""; /** * クエリランナー */ @Getter @Setter private QueryRunner qr = null; /** * コンストラクタで初期データのセット */ public DBUtilsConnect() { this.url = "jdbc:mysql://DBのホスト/データベース名"; this.user = "ユーザー名"; this.password = "パスワード"; } /** * DBに接続 */ public void connect() { try { Class.forName("org.gjt.mm.mysql.Driver"); Connection tmpCon = null; try { tmpCon = DriverManager.getConnection(url, user, password); con = tmpCon; qr = new QueryRunner(); } catch (SQLException ex) { Logger.getLogger(DBUtilsConnect.class.getName()).log(Level.SEVERE, null, ex); } } catch (ClassNotFoundException ex) { Logger.getLogger(DBUtilsConnect.class.getName()).log(Level.SEVERE, null, ex); } } /** * DBとの接続を閉じる */ public void close() { try { this.con.close(); } catch (SQLException ex) { Logger.getLogger(DBUtilsConnect.class.getName()).log(Level.SEVERE, null, ex); } } /** * 特定のSQLを読み込んでエンティティを返す * * @param <T> 型 * @param clazz 型情報 * @param selectQuery クエリ * @return LIst型パラメータ */ public <T> List<T> select(Class<T> clazz, String selectQuery) { List<T> entityList = new ArrayList<>(); try { this.connect(); ResultSetHandler rsh = new BeanListHandler(clazz); entityList = (List) qr.query(con, selectQuery, rsh); this.close(); } catch (SQLException ex) { Logger.getLogger(DBUtilsConnect.class.getName()).log(Level.SEVERE, null, ex); } return entityList; } /** * LIST/MAP系のデータを一括でインサートする * * @param tableName テーブル名 * @param dataList LIST/MAPのデータ */ public void ListMapToInsert(String tableName, List<Map<String, String>> dataList) { dataList.stream().forEach(map -> { MapToInsert(tableName, map); }); } /** * MAP型式のデータをインサートする * * @param tableName テーブル名 * @param map インサートするMap */ public void MapToInsert(String tableName, Map<String, String> map) { Set<String> keySet = map.keySet(); Object[] valueSet = map.values().toArray(); String bind = StringUtils.repeat("?", ",", valueSet.length); String keyCol = StringUtils.join(keySet, ","); String insQuery = String.format(" INSERT INTO %s ( %s ) VALUES ( %s ) ", tableName, keyCol, bind); this.connect(); try { qr.update(con, insQuery, valueSet); } catch (SQLException ex) { Logger.getLogger(DBUtilsConnect.class.getName()).log(Level.SEVERE, null, ex); } this.close(); } /** * 新規作成(INSERT)、更新(UPDATE)、削除(DELETE)のメソッド * * @param updateQuery 更新のクエリ */ public void update(String updateQuery) { try { this.connect(); qr.update(con, updateQuery); this.close(); } catch (SQLException ex) { Logger.getLogger(DBUtilsConnect.class.getName()).log(Level.SEVERE, null, ex); } } } |
リンク(DBUtils以外のライブラリもあり)
「薄い」JavaのO/Rマッパーの紹介 – DbUtils、Persist、Butterfly Persistence