[JAVA] Ich habe versucht, eine flexible ODER-Zuordnung mit MyBatis Dynamic SQL zu implementieren

Verwenden wir MyBatis Dynamic SQL!

Diesmal habe ich eine Implementierung ausprobiert, die MyBatis Dynamic SQL verwendet, um SQL auszugeben und Daten abzurufen!

Ich werde es für geschäftliche Zwecke verwenden, also werde ich es als Memorandum belassen. Das Implementierungsformat ähnelt dem S2JDBC von Seasar2, und SQL wird durch Ausführen mehrerer Methodenketten erstellt.

Bereit zu rennen

Ich habe so einen einfachen Tisch vorbereitet. Registrieren Sie mehrere Daten in Texto.

CREATE TABLE "MEMBER" ( 
  "ID" NUMBER(8,0)
  , "BLOOD" VARCHAR2(20 BYTE)
  , "NAME" VARCHAR2(20 BYTE)
  , "CORP" VARCHAR2(20 BYTE)
);

Die Entität wird auch gemäß der Tabellenstruktur erstellt.

public class Member {
	
	private Integer id;
	
	private String name;
	
	private String corp;
	
	private String blood;
	
    //Getter / Setter weggelassen

}

Erstellen Sie die Mapper-Schnittstelle wie folgt. Dieses Mal wird davon ausgegangen, dass mehrere Daten an List zurückgegeben werden.

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

}

Erstellen Sie eine Supportklasse für die Arbeit mit MyBatis Dynamic SQL. Es wird verwendet, wenn die zu erfassende Spalte oder die WHERE-Klausel angegeben wird.

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

}

SQL-Ausführung

Implementieren wir eine Klasse, die tatsächlich SQL mit der oben erstellten Klasse ausgibt. Dieses Mal werde ich den Testcode mit junit implementieren.

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

}

Implementieren Sie die Config-Klasse separat und legen Sie die DataSource- und MapperScan-Ziele fest. Es kann im XML-Format eingestellt werden, diesmal jedoch in Java. (Ich werde die Erklärung bezüglich der Einstellung weglassen)

Der bei MapperScan registrierte Mapper wird entfernt und die SQL wird tatsächlich ausgeführt.

Das Ausführungsergebnis ist wie folgt.

********************
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
********************

Es wurde bestätigt, dass mehrere Daten mit den angegebenen Bedingungen erfasst werden konnten!

Versuch es ...

Ich hatte das Gefühl, dass es möglich ist, es sehr flexibel umzusetzen, hauptsächlich in Bezug auf die Bedingungsspezifikation der WHERE-Klausel. Der Code war sehr gut lesbar und leicht zu beschichten, so dass ich den Eindruck hatte, dass er einfach zu verwenden war.

Ich denke, das ist auch eine der Attraktionen, weil es Tabellenverknüpfungen und Unterabfragen verarbeiten kann. Es ist auch möglich, es ordnungsgemäß mit SQL zu verwenden, das Mapper.xml verwendet, sodass ich denke, dass Sie die Konfiguration nach Bedarf verwalten können.

Ich hoffe, es wird eine gute Referenz für diejenigen sein, die es von nun an verwenden werden!

Referenz

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

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

Recommended Posts

Ich habe versucht, eine flexible ODER-Zuordnung mit MyBatis Dynamic SQL zu implementieren
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, das Iterator-Muster zu implementieren
01. Ich habe versucht, eine Umgebung mit SpringBoot + IntelliJ + MySQL (MyBatis) (Windows 10) zu erstellen.
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Ich habe versucht, einen Server mit Netty zu implementieren
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Ich habe versucht, CSV mit Outsystems zu lesen und auszugeben
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Ich habe MySQL 5.7 mit Docker-Compose gestartet und versucht, eine Verbindung herzustellen
Ich habe versucht, AOJs Small, Large oder Equal zu lösen
Ich habe versucht, mit Spring Data JPA zu beginnen
Ich habe versucht, Animationen mit der Blazor + Canvas-API zu zeichnen
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
[Swift] Ich habe versucht, mit UICollectionView eine Instagram-ähnliche Benutzeroberfläche mit nur Code ohne Storyboard zu implementieren
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Ich habe versucht, den Chat mit dem Minecraft-Server mit der Discord-API zu verknüpfen
Zuordnung zu einer Klasse mit einem Wertobjekt in How to My Batis
Ich habe versucht, eine Webanwendung voller Fehler mit Kotlin zu implementieren
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen
Ich habe versucht, mit Swagger mit Spring Boot zu beginnen
Ich habe versucht, mit Ractor mehrere Objekte übergeben zu können
Ich habe DI mit Ruby versucht
Ich habe versucht, node-jt400 (SQL Update)
Ich habe versucht, node-jt400 (SQL-Abfrage)
Ich habe versucht, node-jt400 (SQL-Stream)
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, yum-cron zu verifizieren
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe versucht, mithilfe von JDBC Template mit Spring MVC eine Verbindung zu MySQL herzustellen
Ich habe versucht, mit Eclipse + Tomcat eine http2-Entwicklungsumgebung zu erstellen
Ich habe versucht, Ruby's Float (arg, Ausnahme: true) mit Builtin neu zu implementieren