Mybatis小结
一、mybatis的优势:
1. 与JDBC相比,减少了大量冗余代码。
2. 框架体积小,学习成本相对较低。
3. SQL语句和代码分离,降低耦合度,管理便捷,可重用度高。
4. 推荐XML配置方式,支持动态SQL语句的编写。
5. 提供映射标签,支持对象与数据库ORM字段关系映射。
二、mybatis组成:
一般包括一个接口(java文件)和一个XML(映射)文件
四、mybatis规则:
<!-- 求接口和XML文件名保持一致; -->
<!-- 要求接口中方法名与xml文件方法中的id属性保持一致 -->
<!-- 求接口中绑定的形参和返回值变量的类型与xml文件方法中的parameterType和resultType保持一致;-->
<!-- resultType和parameterType的参数可以使用别名-->
三、常用标签
<!-- namespace:配置在映射文件的最上端||xml文件路径的全限定名 -->
Select:查询
<!-- resultMap:一般用于封装多表查询时的结果集 -->
<!-- type:返回值的类(可用别名)-->
<!-- id:代表该po在数据库中的主键 -->
<!-- column:代表sql的列名 -->
<!-- result:代表po中的属性 -->
<!-- include:调用-->
<!-- sql:sql片段(提取出常用的sql语句、字段)-->
<!-- refid:参考的id,指向调用的sql语句id-->
<!-- #{xxx}:这表示一个占位符(?),在select语句中通常可以为任意字符-->
Insert:插入
<!-- insert:一般用于插入 -->
<!-- trim:格式化标记(可以完成set、where)-->
<!-- prefix、suffix:在trim标签包裹的部分的前面或者后面添加内容-->
<!-- prefixOverrides、suffixOverrides :覆盖“”中的内容 -->
<!-- #{xxx}:在insert语句中参数必须是po中的属性,且有序-->
Update:更新
<!-- if:动态sql语句,意思和java中的一样 -->
<!-- test:判断条件-->
<!-- set:sql语句中set关键字-->
<!-- prefixOverrides、suffixOverrides :覆盖“”中的内容 -->
<!-- #{xxx}:在insert语句中参数必须是po中的属性,且有序-->
Delete:删除
<!-- delete:sql删除关键字 -->
以上为增删改查用到的基本语法,接下来是拓展语法。
1. <resultMap>
场景:当返回结果集中包含(一对一映射,一对多映射)时,需要通过该标签封装结果;
<!-- type:映射的po类全限定名(可用别名),Id:唯一标识 -->
<!-- id:映射的po类中的主键字段 || 联合主键的配置多个 -->
<!-- column:映射字段在数据库中对应的字段 -->
<!-- property:映射字段在po类中对应的字段 -->
<!-- association :用于一对一映射 -->
<!-- property:在order类中对应的字段 -->
<!-- javaType:po类的全限定名 -->
<!-- collection:用于一对多映射 -->
<!-- property:在order类中对应的字段 -->
<!-- ofType:po类的全限定名 -->
<!-- 除了使用po类进行映射之外,还可以通过select嵌套一个查询,以column(关联主键)给的字段作为参数,将结果映射到teacher字段中 -->
动态sql
1.<if>
场景:当数据库操作对变量值有一定限制时
<!-- test: 对指定属性做出限制的条件 -->
<!-- concat:拼接模糊查询关键字 -->
2. <choose>(when,otherwise)
场景:当我们仅想使用多个查询条件中的一个。(类似java中switch)
<!-- choose: 父类标签,无实际意义,仅仅是为了包含多个when -->
<!-- when:当满足test中的条件时(true),执行when中的语句并跳出choose,其余的when条件不执行 -->
<!-- otherwise: 类似switch中的default,条件都不满足时执行。 -->
3. <trim>
场景:多条件操作时,某些不满足需求的条件会不执行,而条件之间的连接字符(and,or)会导致sql语法错误。
<!-- trim: 提供前后缀,覆盖功能 -->
<!-- prefix: 在trim标签包裹的部分前添加指定内容 -->
<!-- suffix: 在trim标签包裹的部分后添加指定内容 -->
<!-- prefixOverrides: 表示移除第一个满足条件的字段 -->
<!-- suffixOverrides : 表示移除最后一个满足条件的字段(,)-->
4. <foreach>
场景:批量操作。常用于in后(类似java中的for循环)
<!-- in: 子查询 -->
<!-- collection: 参数类型可以为数组,集合以及map,当参数类型为map时,写入的参数需为map中的key(map.put(“abcd”,zzzz)即写入abcd,此时参数不可乱写)-->
<!-- item: 表示循环体中具体对象 -->
<!-- index: 在list和数组中,index是元素的序号,在map中,index是元素的key-->
<!-- open: 表示该语句以什么开始 -->
<!-- separator: 每次循环元素之间的分隔符 -->
<!-- close: 在trim标签包裹的部分后添加指定内容 -->
5. <bind>
场景:预定义变量,在查询语句中使用;
<!-- value: 预定义的值 -->
****生成代码解析
<!-- criterion.valid: 传入的条件有效 -->
<!-- criterion.noValue: 当条件不符合标准的时候 - -->
<!-- criterion.singleValue: 条件是一个值的时候 调用此条件 -->
<!-- "criterion.betweenValue: 条件是两个值的时候 调用此条件 -->