Cette fois, j'ai essayé une implémentation qui utilise MyBatis Dynamic SQL pour émettre du SQL et récupérer des données!
Je vais l'utiliser à des fins professionnelles, je vais donc le laisser sous forme de mémorandum. Le format d'implémentation est similaire à S2JDBC de Seasar2, et SQL est créé en exécutant plusieurs chaînes de méthodes.
J'ai préparé un tableau simple comme celui-ci. Enregistrez plusieurs données dans Texto.
CREATE TABLE "MEMBER" (
"ID" NUMBER(8,0)
, "BLOOD" VARCHAR2(20 BYTE)
, "NAME" VARCHAR2(20 BYTE)
, "CORP" VARCHAR2(20 BYTE)
);
L'entité est également créée selon la structure de la table.
public class Member {
private Integer id;
private String name;
private String corp;
private String blood;
//getter / setter omis
}
Créez l'interface du mappeur comme suit. Cette fois, il est implémenté en supposant que plusieurs données seront renvoyées à List.
public interface MemberMapper {
@SelectProvider(type=SqlProviderAdapter.class, method="select")
@Results(id="memberResult", value={
@Result(column="ID", property="id"),
@Result(column="NAME", property="name"),
@Result(column="CORP", property="corp"),
@Result(column="BLOOD", property="blood"),
})
List<Member> selectMany(SelectStatementProvider selectStatement);
}
Créez une classe de support pour travailler avec MyBatis Dynamic SQL. Il est utilisé lors de la spécification de la colonne à acquérir ou de la clause WHERE.
public final class MemberDynamicSqlSupport {
public static final Member Member = new Member();
public static final SqlColumn <Integer> id = Member.id;
public static final SqlColumn <String> name = Member.name;
public static final SqlColumn <String> corp = Member.corp;
public static final SqlColumn <String> blood = Member.blood;
public static final class Member extends SqlTable {
public final SqlColumn <Integer> id = column("ID", JDBCType.INTEGER);
public final SqlColumn <String> name = column("NAME", JDBCType.VARCHAR);
public final SqlColumn <String> corp = column("CORP", JDBCType.VARCHAR);
public final SqlColumn <String> blood = column("BLOOD", JDBCType.VARCHAR);
public Member() {
super("Member");
}
}
}
Implémentons une classe qui émet réellement du SQL en utilisant la classe créée ci-dessus. Cette fois, je vais implémenter le code de test en utilisant junit.
import static jp.co.stylez.support.MemberDynamicSqlSupport.*;
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
import static org.mybatis.dynamic.sql.SqlBuilder.isLessThan;
import static org.mybatis.dynamic.sql.SqlBuilder.select;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MybatisConfig.class)
public class Main {
@Autowired
ApplicationContext context;
@Test
public void test() {
MemberMapper mapper = context.getBean(MemberMapper.class);
SelectStatementProvider selectStatement = select(Member.allColumns()).from(Member).where(id, isLessThan(10))
.and(corp, isEqualTo("stylez")).orderBy(id).build().render(RenderingStrategies.MYBATIS3);
List<Member> members = mapper.selectMany(selectStatement);
for (Member member : members) {
System.out.println("********************");
System.out.println("id:" + member.getId());
System.out.println("name:" + member.getName());
System.out.println("corp:" + member.getCorp());
System.out.println("blood:" + member.getBlood());
System.out.println("********************");
}
}
}
Implémentez la classe Config séparément et définissez les cibles DataSource et MapperScan. Il peut être défini au format XML, mais cette fois, il a été défini en Java. (Je vais omettre l'explication relative au réglage)
Le mappeur enregistré avec MapperScan est retiré et le SQL est effectivement exécuté.
Le résultat de l'exécution est le suivant.
********************
id:1
name:hogehoge
corp:stylez
blood:B
********************
********************
id:2
name:test.taro
corp:stylez
blood:O
********************
********************
id:3
name:hiroya.endo
corp:stylez
blood:A
********************
Il a été confirmé que plusieurs données avec les conditions spécifiées pouvaient être acquises!
J'ai senti qu'il était possible de l'implémenter de manière très flexible, principalement en ce qui concerne la spécification de condition de la clause WHERE. Le code était très lisible et facile à enduire, j'ai donc eu l'impression qu'il était facile à utiliser.
Je pense que c'est aussi l'une des attractions car il peut gérer les jointures de table et les sous-requêtes. Il est également possible de l'utiliser correctement avec SQL qui utilise Mapper.xml, donc je pense que vous pouvez gérer la configuration selon vos besoins.
J'espère que ce sera une bonne référence pour ceux qui l'utiliseront désormais!
https://github.com/mybatis/mybatis-dynamic-sql
https://mybatis.org/mybatis-dynamic-sql/docs/conditions.html
Recommended Posts