Mybatis小结


一、mybatis的优势:

1. JDBC相比,减少了大量冗余代码。

2. 框架体积小,学习成本相对较低。

3. SQL语句和代码分离,降低耦合度,管理便捷,可重用度高。

4. 推荐XML配置方式,支持动态SQL语句的编写。

5. 提供映射标签,支持对象与数据库ORM字段关系映射。

 

二、mybatis组成:

一般包括一个接口(java文件)和一个XML(映射)文件

 

四、mybatis规则:

<!-- 求接口和XML文件名保持一致; -->

 Mybatis小结Mybatis小结

 

<!-- 要求接口中方法名与xml文件方法中的id属性保持一致 -->

<!-- 求接口中绑定的形参和返回值变量的类型与xml文件方法中的parameterTyperesultType保持一致;-->

<!-- resultTypeparameterType的参数可以使用别名-->

Mybatis小结 

Mybatis小结 

三、常用标签

<!-- namespace:配置在映射文件的最上端||xml文件路径的全限定名 -->

 Mybatis小结 

Select:查询

<!-- resultMap:一般用于封装多表查询时的结果集 -->

<!-- type:返回值的类(可用别名)-->

<!-- id:代表该po在数据库中的主键 -->

<!-- column:代表sql的列名 -->

<!-- result:代表po中的属性 -->

<!-- include:调用-->

<!-- sql:sql片段(提取出常用的sql语句、字段)-->

<!-- refid:参考的id,指向调用的sql语句id-->

<!-- #{xxx}:这表示一个占位符(?),在select语句中通常可以为任意字符-->

 Mybatis小结

Insert:插入

<!-- insert:一般用于插入 -->

<!-- trim:格式化标记(可以完成setwhere-->

<!-- prefixsuffix:trim标签包裹的部分的前面或者后面添加内容-->

<!-- prefixOverridessuffixOverrides :覆盖“”中的内容 -->

<!-- #{xxx}:insert语句中参数必须是po中的属性,且有序-->

 Mybatis小结 

Update:更新

<!-- if:动态sql语句,意思和java中的一样 -->

<!-- test:判断条件-->

<!-- set:sql语句中set关键字-->

<!-- prefixOverridessuffixOverrides :覆盖“”中的内容 -->

<!-- #{xxx}:insert语句中参数必须是po中的属性,且有序-->

 Mybatis小结

Delete:删除

<!-- delete:sql删除关键字 -->

 Mybatis小结 

以上为增删改查用到的基本语法,接下来是拓展语法。


1. <resultMap>

场景:当返回结果集中包含(一对一映射,一对多映射)时,需要通过该标签封装结果;

 <!-- type:映射的po类全限定名(可用别名),Id:唯一标识   -->

 Mybatis小结

 

 <!-- id:映射的po类中的主键字段 || 联合主键的配置多个  -->

 <!-- column:映射字段在数据库中对应的字段  -->

<!-- property:映射字段在po类中对应的字段  -->

 Mybatis小结

 

<!-- association :用于一对一映射  -->

<!-- property:order类中对应的字段  -->

<!-- javaType:po类的全限定名  -->

 Mybatis小结

 Mybatis小结 

<!-- collection:用于一对多映射  -->

<!-- property:order类中对应的字段  -->

<!-- ofType:po类的全限定名  -->

 Mybatis小结 

<!-- 除了使用po类进行映射之外,还可以通过select嵌套一个查询,以column(关联主键)给的字段作为参数,将结果映射到teacher字段中 -->

 Mybatis小结

动态sql

1.<if>

场景:当数据库操作对变量值有一定限制时

<!-- test: 对指定属性做出限制的条件 -->

<!-- concat:拼接模糊查询关键字  -->

 Mybatis小结

 

2. <choose>(when,otherwise)

场景:当我们仅想使用多个查询条件中的一个。(类似java中switch)

<!-- choose: 父类标签,无实际意义,仅仅是为了包含多个when -->

<!-- when:当满足test中的条件时(true),执行when中的语句并跳出choose,其余的when条件不执行 -->

<!-- otherwise: 类似switch中的default,条件都不满足时执行。 -->

 Mybatis小结

3. <trim>

场景:多条件操作时,某些不满足需求的条件会不执行,而条件之间的连接字符(and,or)会导致sql语法错误。

<!-- trim: 提供前后缀,覆盖功能 -->

<!-- prefix: trim标签包裹的部分前添加指定内容 -->

<!-- suffix: trim标签包裹的部分后添加指定内容 -->

<!-- prefixOverrides: 表示移除第一个满足条件的字段 -->

<!-- suffixOverrides : 表示移除最后一个满足条件的字段(,)-->

 Mybatis小结

4. <foreach>

场景:批量操作。常用于in后(类似java中的for循环)

<!-- in: 子查询 -->

<!-- collection: 参数类型可以为数组,集合以及map,当参数类型为map时,写入的参数需为map中的keymap.put(abcd,zzzz)即写入abcd,此时参数不可乱写)-->

<!-- item: 表示循环体中具体对象 -->

<!-- index: list和数组中,index是元素的序号,在map中,index是元素的key-->

<!-- open: 表示该语句以什么开始 -->

<!-- separator: 每次循环元素之间的分隔符 -->

<!-- close: trim标签包裹的部分后添加指定内容 -->

 Mybatis小结

5. <bind>

场景:预定义变量,在查询语句中使用;

<!-- value: 预定义的值 -->

 Mybatis小结

 

****生成代码解析

<!-- criterion.valid: 传入的条件有效 -->

<!-- criterion.noValue: 当条件不符合标准的时候 - -->

<!-- criterion.singleValue:  条件是一个值的时候 调用此条件 -->

<!-- "criterion.betweenValue: 条件是两个值的时候 调用此条件 -->

 Mybatis小结