MyBatisは、作成後にクエリを実行するように設計されていますが、必要なものを得るためには、内部構成と少しの知識を活用することができます。
MyBatisは非常に素晴らしいフレームワークですが、残念ながらドキュメント側には欠けているので、ソースコードはあなたの友人です。あなたが周りを掘る場合は、動的SQLを構築するためのキープレーヤーであるorg.apache.ibatis.mapping.MappedStatement
とorg.apache.ibatis.mapping.BoundSql
のクラスにぶつかるべきです。ここでは基本的な使用例です。その中に、このデータと
MySQLのテーブルuser
:
name login
----- -----
Andy a
Barry b
Cris c
User
クラス:
package pack.test;
public class User {
private String name;
private String login;
// getters and setters ommited
}
UserService
インターフェイス:
package pack.test;
public interface UserService {
// using a different sort of parameter to show some dynamic SQL
public User getUser(int loginNumber);
}
UserService.xml
マッパーファイル:
<mapper namespace="pack.test.UserService">
<select id="getUser" resultType="pack.test.User" parameterType="int">
<!-- dynamic change of parameter from int index to login string -->
select * from user where login = <choose>
<when test="_parameter == 1">'a'</when>
<when test="_parameter == 2">'b'</when>
<otherwise>'c'</otherwise>
</choose>
</select>
</mapper>
sqlmap-config.file
:
package pack.test;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class AppTester {
private static String CONFIGURATION_FILE = "sqlmap-config.xml";
public static void main(String[] args) throws Exception {
Reader reader = null;
SqlSession session = null;
try {
reader = Resources.getResourceAsReader(CONFIGURATION_FILE);
session = new SqlSessionFactoryBuilder().build(reader).openSession();
UserService userService = session.getMapper(UserService.class);
// three users retreived from index
for (int i = 1; i <= 3; i++) {
User user = userService.getUser(i);
System.out.println("Retreived user: " + user.getName() + " " + user.getLogin());
// must mimic the internal statement key for the mapper and method you are calling
MappedStatement ms = session.getConfiguration().getMappedStatement(UserService.class.getName() + ".getUser");
BoundSql boundSql = ms.getBoundSql(i); // parameter for the SQL statement
System.out.println("SQL used: " + boundSql.getSql());
System.out.println();
}
} finally {
if (reader != null) {
reader.close();
}
if (session != null) {
session.close();
}
}
}
}
そして結果:
Retreived user: Andy a
SQL used: select * from user where login = 'a'
Retreived user: Barry b
SQL used: select * from user where login = 'b'
Retreived user: Cris c
SQL used: select * from user where login = 'c'
のようであるかもしれない、それは '示し?'の代わりに実際の値。例えば'どこログイン=? '。これを回避するには?ありがとう (私はマッパークラスを使用していません) – agpt