Mybatis中Mapper标签总结大全
一、标签分类
定义SQL语句
- insert
- delete
- update
- select
配置关联关系
- collection
- association
配置java对象属性与查询结果集中列名的对应关系
- resultMap
控制动态SQL拼接
- foreach
- if
- choose
格式化输出
- where
- set
- trim
定义常量
- sql
其他
- include
二、标签总结
1.基础SQL标签
1.1查询select
标签属性
- id唯一的名称,对应dao中mapper的接口名称
- paramterType定义传入的参数类型
- resultType 返回数据类型对应实体类
- resultMap外部resultMap的命名引用。结果集的映射是MyBatis最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。使用resultMap或resultType,但不能同时使用
- flushCache将其设置为true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:false
- useCache将其设置为true,将会导致本条语句的结果被二级缓存,默认值:对select元素为true
- timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为unset(依赖驱动)
- fetchSize这是尝试影响驱动程序每次批量返回的结果行数和这个设置值相等。默认值为unset(依赖驱动)。
- statementType STATEMENT,PREPARED或CALLABLE的一个。这会让MyBatis分别使用Statement,PreparedStatement或CallableStatement,默认值:PREPARED。
- resultSetType FORWARD_ONLY,SCROLL_SENSITIVE或SCROLL_INSENSITIVE中的一个,默认值为unset(依赖驱动)。
- databaseId如果配置了databaseIdProvider,MyBatis会加载所有的不带databaseId或匹配当前databaseId的语句;如果带或者不带的语句都有,则不带的会被忽略。
- resultOrdered这个设置仅针对嵌套结果select语句适用:如果为true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。这就使得在获取嵌套的结果集的时候不至导致内存不够用。默认值:false。
- resultSets这个设置仅对多结果集的情况适用,它将列出语句执行后返回的结果集并每个结果集给一个名称,名称是逗号分隔的。
/** *根据条件查询用户集合 */ ListselectUsers(@Param("cond")Map map);
selectid,username,password,sex,birthday,addressfromuseru u.username=#{cond.username}, andu.sex=#{cond.sex}, =DATE_FORMAT(#{beginTime},'%Y-%m-%d%H:%T:%s'),]]> andu.addrersslike'%'||#{cond.address}||'%',
1.2增删改
标签属性
- id唯一的名称,对应dao中mapper的接口名称
- parameterType将要传入语句的参数的完全限定类名或别名。这个属性是可选的,因为MyBatis可以通过TypeHandler推断出具体传入语句的参数,默认值为unset。
- flushCache将其设置为true,任何时候只要语句被调用,都会导致本地缓存和二级缓存都会被清空,默认值:true(对应插入、更新和删除语句)。
- timeout这个设置是在抛出异常之前,驱动程序等待数据库返回请求结果的秒数。默认值为unset(依赖驱动)。
- statementTypeSTATEMENT,PREPARED或CALLABLE的一个。这会让MyBatis分别使用Statement,PreparedStatement或CallableStatement,默认值:PREPARED。
- useGeneratedKeys(仅对insert和update有用)这会令MyBatis使用JDBC的getGeneratedKeys方法来取出由数据库内部生成的主键(比如:像MySQL和SQLServer这样的关系数据库管理系统的自动递增字段,oracle使用序列是不支持的,通过selectKey可以返回主键),默认值:false。
- keyProperty(仅对insert和update有用)唯一标记一个属性,MyBatis会通过getGeneratedKeys的返回值或者通过insert语句的selectKey子元素设置它的键值,默认:unset。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
- keyColumn(仅对insert和update有用)通过生成的键值设置表中的列名,这个设置仅在某些数据库(像PostgreSQL)是必须的,当主键列不是表中的第一列的时候需要设置。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
- databaseId如果配置了databaseIdProvider,MyBatis会加载所有的不带databaseId或匹配当前databaseId的语句;如果带或者不带的语句都有,则不带的会被忽略。
SELECTuser_seq.NEXTVALasidfromDUAL insertintoUser(ID,USERNAME,PASSWORD,SEX,ADRESS,CREATED_BY,CREADTED_DATE) values(#{id},#{username},#{password},#{sex},#{adress},#{createdBy},SYSDATE)
1.3其他基础标签
1.3.1sql标签
定义一些常用的sql语句片段
id,username,password,sex,birthday,address
1.3.2include标签
引用其他的常量,通常和sql一起使用
1.3.3if标签
基本都是用来判断值是否为空,注意Integer的判断,mybatis会默认把0变成‘'
1.3.4别名
经常使用的类型可以定义别名,方便使用,mybatis也注册了很多别名方便我们使用,详情见底部附录
2.collection与association标签
collection与association的属性一样,都是用于resultMap返回关联映射使用,collection关联的是集合,而association是关联单个对象
标签属性
- propertyresultMap返回实体类中字段和result标签中的property一样
- column数据库的列名或者列标签别名,是关联查询往下一个语句传送值。注意:在处理组合键时,您可以使用column=“{prop1=col1,prop2=col2}”这样的语法,设置多个列名传入到嵌套查询语句。这就会把prop1和prop2设置到目标嵌套选择语句的参数对象中。
- javaType一般为ArrayList或是java.util.List
- ofTypejava的实体类,对应数据库表的列名称,即关联查询select对应返回的类
- select执行一个其他映射的sql语句返回一个java实体类型
/** *问题表 */ publicclassQuestion{ privateLongid;//问题id privateStringquestion;//问题 privateIntegerquestionType;//问题类型 privateListanswerList;//问题选项集合 //Getter和Setter省略 } /** *问题选项表 */ publicclassQuestionAnswer{ privateLongid;//选项id privateLongquestionId;//问题id privateStringanswer;//选项 //Getter和Setter省略 }
3.resultMap标签
resultMap属性
- id 唯一标识
- type 返回类型
- extends 继承别的resultMap,可选
关联其他标签
- id设置主键使用,使用此标签配置映射关系(可能不止一个)
- result一般属性的配置映射关系,一般不止一个
- association关联一个对象使用
- collection关联一个集合使用
selectq.id,q.question,q.question_type fromquestionq q.id=#{cond.id} q.idin #{id} selecta.id,a.answerfromquestion_answerawherea.question_id=#{id}
4.foreach标签
foreach属性
- collection循环的集合。传的是集合为list,数组为array,如果是map为java.util.HashMap
- item循环的key
- index循环的下表顺序
- open循环的开头
- close循环结束
- separator循环的分隔符
id,question_id,answer insertintoquestion_answer( ) selectquestion_answer_seq.NEXTVAL,A.*from( select#{item.questionId},#{item.answer}fromdual )A insertintoquestion_answer( ) values #{item.id},#{item.questionId},#{item.answer}
5.where标签
where用来去掉多条件查询时,开头多余的and
select fromuseru andu.id=#{id} andu.name=#{name}
6.set标签
set是mybatis提供的一个智能标记,当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:
updateuser username=#{username}, sex=#{sex}, birthday=#{birthday}, address=#{address}, last_modified_by=#{lastModifiedBy}, last_modified_date=SYSDATE, id=#{id}
7.trim标签
trim标记是一个格式化的标记,可以完成set或者是where标记的功能
标签属性
- prefix、suffix表示再trim标签包裹部分的前面或后面添加内容(注意:是没有prefixOverrides,suffixOverrides的情况下)
- prefixOverrides,suffixOverrides表示覆盖内容,如果只有这两个属性表示删除内容
updateuser name=#{username}, password=#{password}, id=#{id}
8.choose、when、otherwise标签
有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java的switch语句,choose为switch,when为case,otherwise则为default。if是与(and)的关系,而choose是或(or)的关系
SELECT FROMUseru u.usernameLIKECONCAT(CONCAT('%',#{username}),'%') ANDu.sex=#{sex} ANDu.birthday=#{birthday}
附Mybatis已经注册好的别名表
别名 | 映射类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
map | Map |
hashmap | HashMap |
list | list |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
二、写在后面
在网上看了很多标签的解释,但不是很全,我就自己总结了一份,搭配示例更好理解标签的含义,如有什么遗漏或是错误还望多多发言补充,我会继续完善。
注:关于参数指定jdbcType,是因为当传参为null时候,mybatis无法自动判断类型,就必须要显示指定它的类型,多用于insert中
到此这篇关于Mybatis中Mapper标签总结大全的文章就介绍到这了,更多相关MybatisMapper标签内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!