[JAVA] J'ai essayé d'implémenter un mappage OU flexible avec MyBatis Dynamic SQL

Utilisons MyBatis Dynamic SQL!

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.

Prêt à courir

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");
		}
	}

}

Exécution SQL

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!

Essaye le ...

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!

référence

https://github.com/mybatis/mybatis-dynamic-sql

https://mybatis.org/mybatis-dynamic-sql/docs/conditions.html

Recommended Posts

J'ai essayé d'implémenter un mappage OU flexible avec MyBatis Dynamic SQL
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
J'ai essayé d'interagir avec Java
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de démarrer avec Web Assembly
J'ai essayé d'implémenter le modèle Iterator
01. J'ai essayé de créer un environnement avec SpringBoot + IntelliJ + MySQL (MyBatis) (Windows 10)
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé de casser le bloc avec java (1)
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai essayé d'implémenter la notification push Firebase en Java
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé de résoudre Small, Large ou Equal d'AOJ
J'ai essayé de démarrer avec Spring Data JPA
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
[Swift] J'ai essayé d'implémenter une interface utilisateur semblable à un profil Instagram avec UICollectionView avec juste du code sans storyboard
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
[Rails] J'ai essayé de créer une mini application avec FullCalendar
J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
Mappage à une classe avec un objet de valeur dans How to My Batis
J'ai essayé d'implémenter une application web pleine de bugs avec Kotlin
Je veux implémenter diverses fonctions avec kotlin et java!
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
J'ai essayé de pouvoir passer plusieurs objets avec Ractor
J'ai essayé DI avec Ruby
J'ai essayé node-jt400 (mise à jour SQL)
J'ai essayé node-jt400 (requête SQL)
J'ai essayé node-jt400 (flux SQL)
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
J'ai essayé de vérifier yum-cron
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé de me connecter à MySQL en utilisant le modèle JDBC avec Spring MVC
J'ai essayé de créer un environnement de développement http2 avec Eclipse + Tomcat
J'ai essayé de réimplémenter Ruby's Float (arg, exception: true) avec builtin