From c0b417cb355187e9f3d2bde7e9682b3771c789ab Mon Sep 17 00:00:00 2001
From: Rikako Wu <496063163@qq.com>
Date: Wed, 31 Aug 2022 00:03:20 +0800
Subject: [PATCH] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
mybatis/mybatis.md | 192 ++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 191 insertions(+), 1 deletion(-)
diff --git a/mybatis/mybatis.md b/mybatis/mybatis.md
index 10f0731..acb9c2a 100644
--- a/mybatis/mybatis.md
+++ b/mybatis/mybatis.md
@@ -305,4 +305,194 @@ sql标签定义的sql片段可以被include标签进行引用,并且include标
-```
\ No newline at end of file
+```
+## parameter
+- 简单的参数映射
+```xml
+
+
+```
+- 向参数传递复杂对象,例如User类型对象,那么将会从对象中获取id、username、password等属性并传递给参数
+```xml
+
+ insert into users (id, username, password)
+ values (#{id}, #{username}, #{password})
+
+```
+## mybatis ${}
+对于mybatis,可以通过#{}来设置PreparedStatement的占位参数,但是,当想要动态设置sql statement中的元数据(如表名称、字段名称)时,可以通过${}来插入一个未修改的字符串进行拼串。
+```java
+// 未使用${}
+@Select("select * from user where id = #{id}")
+User findById(@Param("id") long id);
+
+@Select("select * from user where name = #{name}")
+User findByName(@Param("name") String name);
+
+@Select("select * from user where email = #{email}")
+User findByEmail(@Param("email") String email);
+
+// 使用${}之后
+@Select("select * from user where ${column} = #{value}")
+User findByColumn(@Param("column") String column, @Param("value") String value);
+```
+## resultMap
+- 对于简单的statement,其映射不需要用到resultMap
+```xml
+
+
+```
+- 对于POJO,当select的返回列名和POJO类的属性名相同时,会自动生成resultMap来将column和POJO对象属性关联到一起
+```xml
+
+```
+- 自定义外部的resultMap来映射到User类
+```xml
+
+
+
+
+
+
+
+```
+- 高级结果集映射
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+### resultMap的元素和属性
+- resultMap中可嵌套如下元素:
+ - constructor:在通过构造方法实例化类时,将select语句返回的result注入到构造方法中
+ - idArg:标识为id的参数,将result标识为id可以提高整体的性能
+ - arg:将result注入到constructor中
+ - id:标识为id的result,将result标识为id可以提高整体性能
+ - result:select语句返回的result,将被注入到返回POJO类型的field
+ - association:复杂关联,返回results中的部分results将会被包装到这种关联中
+ - 关联被嵌套在resultMap中,关联本身可以是resultMap,或者可以引用一个外部resultMap
+ - collection:复杂类型的集合
+ - 集合被嵌套在resultMap中,其本身可以是一个resultMap,或者其可以引用要给外部的resultMap
+ - discrimination:鉴别器,可以通过结果值来判断使用哪个resultMap
+ - case:条件选项,当值为xx时使用特定的resultMap
+ - case同样是一个resultMap,case可以是resultMap本身,也可以引用其他的resultMap
+- resultMap元素可包含如下属性:
+ - id:在命名空间内,可以通过该id引用该resultMap
+ - type:java类的全限定类名或typeAlias
+ - autoMapping:为resultMap开启或关闭自动映射
+### id和result元素
+id和result元素是resultMap的基础,id和result都将一个column字段值映射到java类型的field域。
+> id和result标签的区别是,当result被标识为id时,该result将会被看作对象的标识符,在比较对象时id result将会被使用。这样可以提高整体性能,尤其是在缓存或是嵌套resultMap时。
+
+- id和result元素的属性:
+ - property:column映射到的java对象的field
+ - column:数据库表的列名
+ - javaType:java类型的全限定类名或者typeAlias,通常映射到java bean时mybatis可以推断java类型,但是当映射到HashMap时,需要显式指定javaType
+ - jdbcType
+ - typeHandler
+### constructor元素
+当想要构建不可变对象时,可以通过constructor属性来向构造方法中注入result构建对象。
+```java
+public class User {
+ //...
+ public User(Integer id, String username, int age) {
+ //...
+ }
+//...
+}
+```
+```xml
+
+
+
+
+
+
+```
+- constructor元素的属性:
+ - column:数据库表列名
+ - javaType
+ - jdbcType
+ - typeHandler
+ - resultMap
+ - select