【记录】MyBatis
这是关于使用SpringBoot、Maven和MySQL以及MyBatis的记录。
MyBatis 是什么?
这是一个用于Java等数据库访问的开源软件的O/R映射框架。
与其他O/R映射框架不同的是,它不将数据库和对象进行映射,而是将SQL语句和对象进行映射。
-
- SQLをXMLに記述し、JavaのMapperクラス(interfaceクラス)を実行すると、メソッド名に応じたSQLが実行。
- 引数や戻り値は、JavaのオブジェクトとSQL間でマッピングされる。
O/R映射框架是什么?
将Java等程序中的”对象”和关系数据库(RDS)进行映射,以减少与数据库操作相关的实现复杂性,并解决面向对象和数据库设计思想之间的差异。
-
- 聞いたことはあるけどよく知らないMyBatisにちょっと近づいてみる – ponsuke_tarou’s blog
- O/Rマッピングとは? | Think IT(シンクイット)
MyBatis如何使用
pom的定义
添加mybatis-spring-boot-starter作为依赖。
可查看以下可用版本。
- mybatis-spring-boot-autoconfigure – Introduction
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
application.properties的定义。
定义与RDS的连接信息。
spring.datasource.url=(RDSのURL)
spring.datasource.username=(RDSのユーザー名)
spring.datasource.password=(RDSのパスワード)
# SQLのカラム名=スネークケース(例:user_id)で、java=キャメルケース(例:userId)の場合、
# mybatisで自動的に変換してくれる設定。
mybatis.configuration.map-underscore-to-camel-case=true
创建一个Mapper类
使用@Mapper注解创建Mapper类。
若要用XML编写SQL文
如果只有一个参数,无需使用“@Param”进行描述。
如果有两个或更多参数,则必须进行描述以设置SQL查询中参数和方法参数之间的对应关系。
@Mapper
public interface SampleMapper {
public void selectUser(@Param("id") int no);
public void insertUser(@Param("id") int no, @Param("username") String username, @Param("password") String password);
}
-
- mybatis – MyBatis 3 | Java API
- Spring Boot から MyBatis を利用するための設定 (Gradle/MySQL) – Qoosky
如果要用Java编写SQL语句的话
如果不使用XML来定义SQL,也可以在Java上编写SQL。
在这种情况下,可以使用@Insert,@Update,@Select,@Delete等注释。
@Mapper
public interface SampleMapper {
@Select("SELECT * FROM USER WHERE id = #{id}")
User selectUser(@Param("id") int id);
}
- MyBatis Mapper アノテーションの使い方 – Qiita
创建Mapper.xml
XML和Mapper类需要具有相同的包名和文件名。
XML应该放在resources中,但如果它的包名和文件名不一样,就无法简单地进行关联。此外,如果没有XML文件,在启动时会出错,但如果没有Mapper类,启动时不会出错。
制图器标签
<mapper namespace ="sample.SampleMapper">
# ここにCRUDに対応するXMLタグを記述
</mapper>
属性説明namespaceRインタフェースの完全修飾クラス名(FQCN)を指定。
ここでXMLとインターフフェースクラスの紐付けする。
ここでXMLとインターフフェースクラスの紐付けする。
选择
<mapper namespace ="sample.SampleMapper">
<select id="selectUser" parameterType="int" resultType="hashmap">
SELECT * FROM USER WHERE ID = #{id}
</select>
</mapper>
属性説明idこのネームスペース内で固有な識別子。ステートメント参照に使用。parameterTypeこのステートメントに渡される引数の型。
完全修飾クラス名またはエイリアス。
TypeHandler は実際の引数に応じて自動的に導出されるため省略可。
<デフォルト値:未設定>resultTypeこのステートメントから返されるオブジェクトの型。
完全修飾クラス名またはエイリアス。
ステートメントがコレクションを返す場合は、コレクションの型ではなくコレクションに含まれるオブジェクトの型を指定する必要あり。
複雑なマッピングが必要となる様々なケースに対応可能。
resultType と resultMap は、どちらか一方のみ指定可。
完全修飾クラス名またはエイリアス。
TypeHandler は実際の引数に応じて自動的に導出されるため省略可。
<デフォルト値:未設定>resultTypeこのステートメントから返されるオブジェクトの型。
完全修飾クラス名またはエイリアス。
ステートメントがコレクションを返す場合は、コレクションの型ではなくコレクションに含まれるオブジェクトの型を指定する必要あり。
resultType
と resultMap は、どちらか一方のみ指定可。resultMap別の場所で定義されている resultMap を参照する。複雑なマッピングが必要となる様々なケースに対応可能。
resultType と resultMap は、どちらか一方のみ指定可。
插入 / 更新 / 删除
<mapper namespace ="sample.SampleMapper">
<insert id="insertUser" parameterType="domain.User">
<update id="updateUser">
update User set
username = #{username}, password = #{password}
where id = #{id}
</update>
<delete id="deleteUser">
delete from User where id = #{id}
</delete>
</mapper>
属性説明idこのネームスペース内で固有な識別子。ステートメント参照に使用。parameterTypeこのステートメントに渡される引数の型。
完全修飾クラス名またはエイリアス。
TypeHandler は実際の引数に応じて自動的に導出されるため省略可。
<デフォルト値:未設定>
完全修飾クラス名またはエイリアス。
TypeHandler は実際の引数に応じて自動的に導出されるため省略可。
<デフォルト値:未設定>
- MyBatis – MyBatis 3 | Mapper XML ファイル
样本程序
尝试创建插入功能时的内容。为了试用,省略了除了MyBatis之外的部分。
pom.xml -> 项目配置文件pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>sample</groupId>
<artifactId>sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>sample</name>
<description>sample</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
应用程序属性
mybatis.configuration.map-underscore-to-camel-case=true
spring.datasource.url=(RDSのURL)
spring.datasource.username=(RDSのユーザー名)
spring.datasource.password=(RDSのパスワード)
应用程序类
package sample;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SampleApplication {
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class, args);
}
}
控制器类
为了试用,请直接调用Mapper类而不实现Service类。
使用固定值进行注册。
package sample;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
@RestController
@RequiredArgsConstructor
public class SampleController {
// Mapperクラスを生成
@Autowired
private final SampleMapper sampleMapper;
@PostMapping(value = "/userId", produces = "application/json")
public void getUserId() {
int no = 1;
String UserId = "1234567890";
// ユーザー登録:Mapperクラスのinsertメソッドを呼び出してSQL実行。
sampleMapper.insertUserId(no, UserId);
}
}
映射器类 qì
package sample;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface SampleMapper {
public void insertUserId(@Param("no") int no, @Param("UserId") String UserId);
}
XML文件 (XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace ="sample.SampleMapper">
<insert id="insertUserId">
INSERT INTO test (no, UserId)
VALUES (#{no}, #{UserId})
</insert>
</mapper>
请参考以下网站
-
- The MyBatis Blog(公式サイト)
-
- MyBatis – MyBatis 3 | イントロダクション
-
- mybatis-spring
-
- オープンソースのフレームワーク / MyBatisとは
-
- 6.2. データベースアクセス(MyBatis3編) — TERASOLUNA Server Framework for Java
- 絶対分かるMyBatis!MyBatisで覚えるべきチェックルール25(前半) – Qiita
DB连接处理、SQL语句的构建、对象与数据库数据之间的数据转换等。