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