diff --git a/docs/src/main/asciidoc/mybatis.adoc b/docs/src/main/asciidoc/mybatis.adoc new file mode 100644 index 00000000000000..0595ba213f60c3 --- /dev/null +++ b/docs/src/main/asciidoc/mybatis.adoc @@ -0,0 +1,271 @@ +//// +This guide is maintained in the main Quarkus repository +and pull requests should be submitted there: +https://github.com/quarkusio/quarkus/tree/master/docs/src/main/asciidoc +//// += Quarkus - Using MyBatis +include::./attributes.adoc[] +:extension-status: preview + +This guide demonstrates how your Quarkus application can use the link:https://mybatis.org/mybatis-3/[MyBatis] to support the custom SQL, stored procedures and advanced mappings. + +include::./status-include.adoc[] + +== Prerequisites + +To complete this guide, you need: + +* less than 15 minutes +* an IDE +* JDK 1.8+ installed with `JAVA_HOME` configured appropriately +* Apache Maven {maven-version} +* A running Mysql Database server +* GraalVM, or Docker, installed if you want to run in native mode. + +== Architecture + +The application built in this guide is quite simple: the user can get, add and remove a record through the RESTful API by using the MyBatis Mapper. + + +== Solution + +We recommend that you follow the instructions in the next sections and create the application step by step. + +== Creating the Maven Project + +First, we need a new project. Create a new project with the following command: + +[source, subs=attributes+] +---- +mvn io.quarkus:quarkus-maven-plugin:{quarkus-version}:create \ + -DprojectGroupId=org.acme \ + -DprojectArtifactId=mybatis-quickstart \ + -Dextensions="mybatis,resteay-jackson,jdbc-mysql" +cd mybatis-quickstart +---- +This command generates a Maven project, with its pom.xml importing the quarkus-mybatis extension. + +If you already have your Quarkus project configured, you can add the `mybatis` extension +to your project by running the following command in your project base directory: + +[source,bash] +---- +./mvnw quarkus:add-extension -Dextensions="mybatis" +---- + +This will add the following to your `pom.xml`: + +[source] +---- + + org.amqphub.quarkus + quarkus-mybatis + +---- + +== Creating the User POJO +We are going to create a `User` POJO to access to the data in the backend mysql server. +Create the `src/main/java/org/acme/mybatis/User.java` file, with the following content: + +[source, java] +---- +package org.acme.mybatis; + +public class User { + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} +---- + +== Creating the User Mapper +We are going to create a `UserMapper` class which will use the MyBatis annotations to inject the SQL. +Create the `src/main/java/org/acme/mybatis/UserMapper.java` file, with the following content: + +[source, java] +---- +package org.acme.mybatis; + +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface UserMapper { + + @Select("SELECT * FROM USERS WHERE id = #{id}") + User getUser(Integer id); // <1> + + @Insert("INSERT INTO USERS (id, name) VALUES (#{id}, #{name})") + Integer createUser(@Param("id") Integer id, @Param("name") String name); // <2> + + @Delete("DELETE FROM USERS WHERE id = #{id}") + Integer removeUser(Integer id); // <3> +} +---- + +1. Get a user from the database. +2. Insert a user into the database. We should use the `@Param` to bind the parameters. +3. Delete a user from the databse. + +== Createing the MyBatisResource to handle the requests +We are going to create a `MyBatisResource` class which will handle all the requests to create, query or remove the data +from the database. + +[source, java] +---- +package org.acme.mybatis; + +import javax.inject.Inject; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Path("/mybatis") +public class MyBatisResource { + + @Inject + UserMapper userMapper; // <1> + + @Path("/user/{id}") + @GET + @Produces(MediaType.APPLICATION_JSON) + public User getUser(@PathParam("id") Integer id) { + return userMapper.getUser(id); + } + + @Path("/user") + @POST + @Produces(MediaType.TEXT_PLAIN) + @Consumes(MediaType.APPLICATION_FORM_URLENCODED) + public Integer createUser(@FormParam("id") Integer id, @FormParam("name") String name) { + return userMapper.createUser(id, name); + } + + @Path("/user/{id}") + @DELETE + @Produces(MediaType.TEXT_PLAIN) + public Integer removeUser(@PathParam("id") Integer id) { + return userMapper.removeUser(id); + } +} +---- +1. It uses the UserMapper which should be injected by the Quarkus to access the database. + +== Configure the properties + +We need to config the datasource used to connect to the database and the mybatis will choose the default one. Also you +can use ```quarkus.mybatis.datasource``` for the specific database. + +[source] +---- +quarkus.datasource.db-kind=mysql +quarkus.datasource.username= + +quarkus.datasource.jdbc.url=jdbc:mysql://localhost/test #<1> +quarkus.mybatis.initial-sql=insert.sql #<2> +---- + +1. The datasource used by the mybatis to connect the database. +2. The SQL file which should be executed just after the application is started. + +We could keep the following content in the `insert.sql` to add some data: +[source, sql] +---- +DROP TABLE IF EXISTS USERS; + +CREATE TABLE USERS ( + id integer not null primary key, + name varchar(80) not null +); + +INSERT INTO USERS (id, name) values(1, 'Test User1'); +INSERT INTO USERS (id, name) values(2, 'Test User2'); +INSERT INTO USERS (id, name) values(3, 'Test User3'); +---- + +== Running with the JVM mode +At first, you should make sure the Mysql Server is running and the `test` database has been created. +Then, you just need to run: + +[source, shell] +---- +./mvnw compile quarkus:dev +---- + +You can get the user by using the following command: + +[source, shell] +---- +curl http://localhost:8080/mybatis/user/1 +---- + +Or create a new user: + +[source, shell] +---- +curl -X POST http://localhost:8080/mybatis/user -d 'id=4&name=test' +---- + +Or remove a user: + +[source, shell] +---- +curl -X DELETE http://localhost:8080/mybatis/user/1 +---- + +== Running Native +You have to add the `--report-unsupported-elements-at-runtime` option when buiding the native image now. +So add the following content with the native profile in the `pom.xml`: + +[source, xml] +---- + + native + + + --report-unsupported-elements-at-runtime + + + +---- + +You can build the native executable with: + +[source, shell] +---- +./mvnw package -Pnative +---- + +and then run with: + +[source, shell] +---- +./target/mybatis-quickstart-1.0-SNAPSHOT-runner +---- + +== Configuration References +include::{generated-dir}/config/quarkus-mybatis.adoc[opts=optional, leveloffset=+1] diff --git a/extensions/mybatis/runtime/src/main/resources/META-INF/quarkus-extension.yaml b/extensions/mybatis/runtime/src/main/resources/META-INF/quarkus-extension.yaml index 937196a0a3161b..2ecf549c519d8c 100644 --- a/extensions/mybatis/runtime/src/main/resources/META-INF/quarkus-extension.yaml +++ b/extensions/mybatis/runtime/src/main/resources/META-INF/quarkus-extension.yaml @@ -6,4 +6,4 @@ metadata: guide: "https://quarkus.io/guides/mybatis" categories: - "data" - status: "stable" + status: "preview" diff --git a/integration-tests/mybatis/src/main/java/io/quarkus/it/mybatis/MybatisResource.java b/integration-tests/mybatis/src/main/java/io/quarkus/it/mybatis/MybatisResource.java index e26db275156dce..e92076fca3497a 100644 --- a/integration-tests/mybatis/src/main/java/io/quarkus/it/mybatis/MybatisResource.java +++ b/integration-tests/mybatis/src/main/java/io/quarkus/it/mybatis/MybatisResource.java @@ -1,19 +1,3 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package io.quarkus.it.mybatis; import javax.inject.Inject;