JDBC文字化け対策
データベースがutf8以外の文字コードになっていたりして通常通りデータを操作すると化けることが発生。
まあPHPの時だとしょっちゅうだったんですがJPAになってからそういうケースに遭遇していませんでした。
私の場合DBがlatin1になってて、他のデータベースもあるので設定ファイルをこわくて修正できない、なんてケース。
そんなときでもutf8で入れてutf8で見れればいいんですが、JPAではディフォルトではどうやらDBへの接続は接続先の文字コードで参照するようです。(???になっている。ということはlatin1で参照しているということでしょう。)
insertしたら思いっきり化けていました。
下記のように対策したところなんとか無事に対応
URLに接続するときに文字コードを指定してあげればutf8でしっかりとinsertできるようです。
GlassfishのJDBC接続poolのURLで下記のように引数を付けてあげればOKです。
jdbc:mysql://DBのURL:ポート番号/DB名?useUnicode=true&characterEncoding=utf8
参考リンク
[Java] JDBCでMySQLにデータを追加すると文字化けする場合の対処法
ちなみに以前紹介した文字コード判定のライブラリ(juniversalchardet)なんですが、マルチバイトが一切ないと文字判定ができずnullでエラーになります。
その場合は初期値でutf8などにしておくとよいでしょう。
BigDecimal
Javaでは小数点の切り上げ、切捨て、四捨五入なんかを使うときにBigDecimalを使います。
その使用法に対して。
ソース
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 |
/** * 四捨五入 * * @param val 値 * @param position 少数第何位(0が少数第一位、1が少数第二位) * @return 整形された値 */ public BigDecimal getRoundingNumber(double val,Integer position){ BigDecimal bd = new BigDecimal(val); return bd.setScale(position, BigDecimal.ROUND_HALF_UP); } /** * 切り捨て * * @param val 値 * @param position 少数第何位 * @return 整形された値 */ public BigDecimal getfloorNumber(double val,Integer position){ BigDecimal bd = new BigDecimal(val); return bd.setScale(position, BigDecimal.ROUND_DOWN); } /** * 切り上げ * * @param val 値 * @param position 少数第何位 * @return 整形された値 */ public BigDecimal getCeilNumber(double val,Integer position){ BigDecimal bd = new BigDecimal(val); return bd.setScale(position, BigDecimal.ROUND_UP); } |
参考リンク
CreateQuery
日付がらみの処理をしているときにどうしてもJPQLでわからない処理がでてきており、MySQLを使いたい!となりました。
そんな時はエンティティマネージャーのcreateQueryを使えば大丈夫です。が、いろいろデメリットはあるでしょうね。
対処法的な感じで考えており、いずれはJPQLに直さないとまずいなあと思っております。
ちなみにJPQLのクエリに関して下記リンクに細かくメリット、デメリットが書かれています。
参考リンク
NativeQueryじゃだめ?〜JPAクエリ表現ごとのパフォーマンス比較
jsfのconvertNumber
jsfのconvertNumber(数字の整形のタグ。たとえば100000→100,000にしたいなど)は引数が数字(int型)じゃないと反映されません。
まあNumberとなっているので当たり前でしょうか・・・
せっかくBigDecimalを使っているので、特段の理由がない限りは、BigDecimalのインスタンスで返すように設計してみてくださいな。
アドバイスありがとうございます。
BigDecimalについてわかっていませんでしたね(汗)。修正しました。