SQL映射文件的几个顶级元素:
-
cache
- 该命名空间的缓存配置 -
cache-ref
- 引用其他命名空间的缓存配置 -
resultMap
- 描述如何从数据库结果集中加载对象 -
sql
- 可被其他语句引用的可重用语句块 -
insert
- 增 -
update
- 改 -
delete
- 删
select属性
属性 | 描述 |
---|---|
id |
标识符,与Mapper中对应方法的方法名一致 |
parameterType |
传入这条语句的参数的类全限定名或别名 |
resultType |
返回结果的类全限定名或别名,如果返回的是集合,应设置为集合包含的类型而不是集合本身的类型。resultType和resultMap之间只能使用一个 |
resultMap |
对外部resultMap的命名引用,结果映射是Mybatis的最强大的特性 |
sql
sql元素可以用来定义可重用的SQL代码片段,以便在其他语句中使用。参数可以静态地(加载的时候)确定下来并且可以在不同的include元素中定义不同的参数值
<sql id="userColumns">
${alias}.id,${alias}.usernname,${alias}.password
</sql>
常用在include元素的refid属性或内部语句中使用属性值
<sql id="sometable"> ${preifx}Table </sql> <sql id="someinclude"> FROM <include refid="${include_target}"/> </sql> <select id="select" resultType="Map"> SELECT field1,field2,field3 <include refid="someinclude"> <property name="prefix" value="Some"/> <property name="include_target" value="sometable"/> </include> </select>
ResultMap
一对一查询:
<!-- 属性名不一致或进行关联查询时,可用resultMap标签 以查询订单为例,从查询订单角度出发为一对一,因为一个订单只会是一个人下的 --> 1)改造实体类: <!-- 在订单类中添加User属性,即一个引用类型 --> 2)编写resultMap: <resultMap type="order" id="orderUserResultMap"> <id property="id" column="id"/> <result property="userId" column="user_id"/> ... <result property="note" column="note"/> <association property="user" javaType="user"> <id property="id" column="id"/> <result property="username" column="username"/> ... </association> </resultMap> 3)调用实例: <!-- 一对一关联,查询订单,订单内部包含用户属性 --> <select id="queryOrderUserResultMap" resultMap="orderUserResultMap"> SELECT o.id, o.user_id, o.number, o.createtime, o.note, u.username, u.address FROM `order` o LEFT JOIN `user` u ON o.user_id = u.id </select>
一对多查询:
<!-- 查询所有用户信息及相关订单 --> <!-- 对于用户而言,一个用户可能对应多个不同的订单,即一对多 --> 1)改造实体类: 添加订单集合属性,如:List< Order > orders 2)编写resultMap: <resultMap type="user" id="userOrderResultMap"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="birthday" column="birthday" /> <result property="sex" column="sex" /> <result property="address" column="address" /> <!-- 配置一对多的关系 property:填写pojo类中List集合类类属性的名称 javaType:填写集合类型的名称 --> <collection property="orders" javaType="list" ofType="order"> <!-- 配置主键,是关联Order的唯一标识 --> <id property="id" column="oid" /> <result property="number" column="number" /> <result property="createtime" column="createtime" /> <result property="note" column="note" /> </collection> </resultMap> 3)调用实例: <!-- 一对多关联,查询订单同时查询该用户下的订单 --> <select id="queryUserOrder" resultMap="userOrderResultMap"> SELECT u.id, u.username, u.birthday, u.sex, u.address, o.id oid, o.number, o.createtime, o.note FROM `user` u LEFT JOIN `order` o ON u.id = o.user_id </select>
动态SQL
简介
主要介绍Mybatis提供的几种用于实现动态SQL的标签的基本使用方式:
- if
- choose、when、otherwise
- trim、where、set
- foreach
if
if 语句提供了可选的查找文本功能
若 if 中条件成立,则执行 if 标签中的语句,拼接至SQL语句中
若 if 中条件不成立,则忽略,举个栗子:
<select id="findActiveBlogWithTitleLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </select>
choose、when、otherwise
Mybatis提供的choose元素,类似Java的switch语句,可从多个条件中选择一个使用
举个栗子:传入了"title"就按"title"查找,传入了"author"就按"author"查找的情形。
若两者都没有传入,就返回标记为featured=1的BLOG(若多个条件满足则遵循就近原则)
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <choose> <when test="title !=null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
https://www.cnblogs.com/torima/p/15151210.html