2018年11月18日

Eclipse MyBatisの導入方法と使い方 その2

ここの記事からの続きです。

XMLにSQLのテンプレートを持たせることで、javaのソース改修や再ビルドなしにSQLの変更が可能になります。

ポイント
  • パターン1
    SQLの中で"<",">"記号を使う場合はエスケープする必要がある。
  • パターン2
    XMLにforeachを使うことで引数にListコレクションが渡せる
  • パターン3
    メソッドの戻り値をHashMapで受け取る。

UsertableMapper.javaに以下のメソッドを追加する。
    // UsertableMapper.java 既存のメソッドの下に追加

    /** 引数にDate型を渡す。 */
    List<Usertable> selectWhereDate(@Param("birthday") Date date);

    /** 引数にList渡す。 */
    List<Usertable> selectWhereList(@Param("addresslist") List<String> addresslist);

    /** 結果をMapで取得する。 */
    List<Map<String, Object>> selectGetMap();
mapperフォルダの下にVUsertableMapper.xml(UTF-8)を作成し、以下のように編集する。
<?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">
<mapper namespace="jp.example.entity.dao.UsertableMapper">
 
  <!-- 引数にDate型を渡す。XML内で"<",">"記号を使うには、以下のように <![CDATA[ ? ]]> で囲みます。 -->
  <select id="selectWhereDate" parameterType="map" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from UserTable
    where birthday <![CDATA[ >= ]]> #{birthday,jdbcType=DATE}
    Order By userid
  </select>
 
  <!-- 引数にList渡す。 -->
  <select id="selectWhereList" parameterType="map" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List" />
    from UserTable
    where (address IN
    <foreach item="item" collection="addresslist" open="(" separator="," close=")">
        #{item, jdbcType=VARCHAR}
    </foreach> )
    Order By userid
  </select>
 
  <!-- 結果をMapで取得する。 -->
  <select id="selectGetMap" parameterType="map" resultType="hashmap">
    select address as todofuken, count(address) as cnt
    from usertable
    group by address
    order by cnt
  </select>
</mapper>
mybatis-config.xmlに"VUsertableMapper.xml"の記述を追加する。

追加したメソッドの使用例
※サンプルなので引数が固定値になっていますが、実際は動的な値を渡します。
public class MyClass {
public static void main(String... args) {
try (Reader r = Resources.getResourceAsReader("mybatis-config.xml")) {
Properties properties = new Properties();

SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(r, properties);
try (SqlSession ss = ssf.openSession()) {
// Mapperインスタンス作成
UsertableMapper map = ss.getMapper(UsertableMapper.class);

// パターン1 日付を指定してレコード取得
// 条件:生年月日が1980年以降の人を取得
Date targetDate = (new SimpleDateFormat("yyyy/MM/dd")).parse("1980/01/01");
List<Usertable> result01 = map.selectWhereDate(targetDate);
System.out.println("パターン1");
for (Usertable cur : result01) {
System.out.println(cur.getName() + " - " + cur.getBirthday());
}

// パターン2 引数にListを渡す
List<String> nameList = new ArrayList<>();
nameList.addAll(Arrays.asList("奈良県", "大阪府"));
List<Usertable> result02 = map.selectWhereList(nameList);
System.out.println("パターン2");
for (Usertable cur : result02) {
System.out.println(cur.getName() + " - " + cur.getAddress());
}

// パターン3 結果をmapで取得
List<Map<String, Object>> result03 = map.selectGetMap();
System.out.println("パターン3");
for (Map<String, Object> cur : result03) {
System.out.println(cur.get("todofuken") + " - " + cur.get("cnt"));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
タグ:JAVA Eclipse
posted by Hiro at 22:05| Comment(2) | プログラム

2018年11月10日

Android Studio最新版でCocos2d-xのプロジェクトを開く方法

Android StudioでCocos2d-xから生成したプロジェクトを開くためのメモです。
どちらのソフトも既にインストール・設定が済んでいるという前提で書きます。
説明文の中のドライブ、パス等は各自の環境に合わせて適宜読み替えてください。

導入済みソフト
  • Android Studio 3.2.1
  • Cocos2d-x 3.17

既存のNDKの確認方法。2018年11月時点で18が最新です。
20181110_001.png

NDKのダウンロード

ここからNDKのバージョンr16bをダウンロードし、(最新バージョンとは別の)任意の場所に展開。
今回はD:\Android\配下に展開する。
D:\Android\android-ndk-r16b\

※cocos2d-xのコマンドラインでNDKを使うには以下の設定を行う。
Windowsキー+pauseキーでシステム画面→「システムの詳細設定」クリック、システムのプロパティ画面→環境変数ボタン、環境変数画面→ユーザーの環境変数で"NDK_ROOT"のパスを変更する。

次のコマンドでCocosのプロジェクトを生成する。
cocos new NewGame -p jp.example.newgame -l cpp -d D:\TEMP
Android Studioで "D:\TEMP\NewGame\proj.android"を開く。
イベントログにエラー等がでてもとりあえず無視。

Gradle Scripts配下にある、ファイル"gradle.properties"を開く。
PROP_APP_ABI= の箇所を、デバッグに使用するAVDに合わせ変更し、保存する。
今回は"x86"に変更する。
PROP_APP_ABI=x86
20181110_002.png

ファイル"local.properties"を開く。
ndk.dir=の箇所を、先ほど展開したNDKのパスに変更し保存する。
コロンと円マークはエスケープする。
ndk.dir=D:\\Android\\android-ndk-r16b
20181110_003.png

エディタ右上の"Try Again"をクリック。
デバッグを実行。AVDが起動し、Cocos2d-xのロゴが表示されれば成功。
20181110_004.png

posted by Hiro at 13:11| Comment(2) | プログラム

2018年11月06日

Java - Apache Log4jを使う

pom.xml ライブラリへ追加
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jp.example</groupId>
<artifactId>MyMaven</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</project>
MyLogger.java ログ出力専用のクラスを作成。このクラスを使ってログ出力を行う。
package jp.co.example;

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.MessageFormat;
import java.util.Properties;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.xml.DOMConfigurator;

public class MyLogger {

/** ロガー **/
private Logger logger;

/** プロパティ **/
private Properties p = new Properties();

/**
* コンストラクタ
* @param outputFile log出力先パス
* @throws Exception
*/
public MyLogger(String outputFile) throws Exception {

try {
// log4j設定ファイル指定
logger = Logger.getLogger(MyLogger.class);
DOMConfigurator.configure("config/log4j.xml");

// ログ出力
RollingFileAppender appender = (RollingFileAppender) logger.getParent().getAppender("mylog");
appender.setFile(outputFile);
appender.activateOptions();

// プロパティ読み込み
final String messageFile = "config/message.properties";
InputStream messageInputStream = new FileInputStream(messageFile);
p.load(messageInputStream);
messageInputStream.close();

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 通常ログ
* @param msgId メッセージID
* @param params パラメータ
*/
public void outLog(String msgId, Object... params) {
outputLog(msgId, Level.INFO, null, params);
}

/**
* エラーログ
* @param msgId メッセージID
* @param cause スローされた例外
* @param params パラメータ
*/
public void outLog(String msgId, Throwable cause, Object... params) {
outputLog(msgId, Level.ERROR, cause, params);
}

/**
* ログをファイルへ出力
*/
private void outputLog(String msgId, Level level, Throwable cause, Object... params) {

String fmt = MessageFormat.format("{0} : {1}", msgId, p.getProperty(msgId));
String message = MessageFormat.format(fmt, (Object[]) params);
logger.log(MyLogger.class.getName(), level, message, cause);
}
}
config/log4j.xml (log4j設定ファイル)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" >

<!-- ログファイル出力 -->
<appender name="mylog" class="org.apache.log4j.RollingFileAppender">
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10MB" />
<param name="File" value="./work/mylog.log" />
<param name="Append" value="true" />
<param name="Encoding" value="Shift_JIS" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%-5p] [%t] [%l] - %m%n" />
</layout>
</appender>

<!-- 画面出力 -->
<appender name="stdout" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%d] [%-5p] [%t] [%l] - %m%n" />
</layout>
</appender>

<!-- ログレベル・出力先 -->
<root>
<level value="debug"/>
<appender-ref ref="mylog"/>
<appender-ref ref="stdout"/>
</root>
</log4j:configuration>
config/message.properties (プロパティエディタで編集)
MSGID-001 = メッセージID1
MSGID-002 = メッセージID2 {0}
MSGID-901 = エラーメッセージID901
Main.java 使用例、呼び出し元のクラス。
ポイント
  • IDを指定するだけで定型文をログ出力。
  • 定型文は外部ファイルで管理。
  • エラー時はStackTraceをそのまま出力。
package jp.co.example;

public class Main {

// ロガー
private static MyLogger myLogger;

public static void main(String... args) {
try {
// ロガー初期化
myLogger = new MyLogger("./mylogfile.log");

// ログ出力
myLogger.outLog("MSGID-001");
myLogger.outLog("MSGID-002", "引数渡せます");

// エラー誘発
System.out.println(0 / 0);

} catch (Exception e) {
// エラーログ出力
myLogger.outLog("MSGID-901", e);
}
}
}
タグ:JAVA Eclipse
posted by Hiro at 22:43| Comment(0) | プログラム