一、动态sql
1. 动态 SQL 之标签 注意:标签的 test 属性中写的是对象的属性名,如果是包装类的对象要使用 OGNL 表达式的写法。 另外要注意 where 1=1 的作用~!
2. 动态 SQL 之标签为了简化上面 where 1=1 的条件拼装,我们可以采用标签来简化开发。
3. 动态标签之标签SQL 语句:
select 字段 from user where id in (?)
标签用于遍历集合,
它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{} open:代表语句的开始部分
close:代表结束部分item:代表遍历集合的每个元素,生成的变量名 sperator:代表分隔符
Mybatis 中简化编写的 SQL 片段 Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。定义代码片段
<!-- 抽取重复的语句代码片段 -->
<sql id="defaultSql">
select * from user
</sql>
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="user">
<include refid="defaultSql"></include> </select>
二、多表查询
- 一对一
accout类 ,同样的也有一个user类,省略,可以看到上面包含了user类
<!--account对应的xml.定义封装user和account 的封装-->
<resultMap id="findUA" type="account">
<id property="id" column="aid"></id>
<result property="uid" column="uid"></result>
<result property="money" column="money"></result>
<!--一对一的关系映射,配置封装user的内容-->
<association property="user" column="uid" javaType="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</association>
</resultMap>
<select id="findUserAcc" resultMap="findUA">
SELECT u.*, a.id AS aid,username ,address FROM account a,USER u WHERE a.uid=u.id
</select>
- 一对多
一对多查询collection 是用于建立一对多中集合属性的对应关系 ofType 用于指 定集合元素的数据类型
对应的user类
<!--配置user和account 的一对多的配置-->
<resultMap id="userAccountFind" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="address" column="address"></result>
<result property="sex" column="sex"></result>
<collection property="accounts" ofType="account">
<id property="id" column="aid"></id>
<id property="uid" column="uid"></id>
<id property="money" column="money"></id>
</collection>
</resultMap>
<!--查找所有用户-->
<select id="FindAll" resultMap="userAccountFind">
SELECT *FROM USER u LEFT OUTER JOIN account a ON u.id =a.uid
</select>
- 多对多
user类,其中可以看到 包含了role的集合,同样的
配置各自的xml文件
<resultMap id="userRole" type="user">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<result property="birthday" column="birthday"></result>
<collection property="roles" ofType="role">
<id property="roleId" column="ID"></id>
<result property="roleName" column="ROLE_NAME"></result>
<result property="roleDesc" column="ROLE_DESC"></result>
</collection>
</resultMap>
<select id="FindAll" resultMap="userRole">
SELECT *FROM USER u
LEFT OUTER JOIN user_role ur ON u.id=ur.uid
LEFT OUTER JOIN role r ON r.id=ur.rid
</select>
<resultMap id="FindAllUR" type="role">
<id property="roleId" column="ID"></id>
<result property="roleName" column="ROLE_NAME"></result>
<result property="roleDesc" column="ROLE_DESC"></result>
<collection property="user" ofType="user" >
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<result property="birthday" column="birthday"></result>
</collection>
</resultMap>
<select id="FindAllUser" resultMap="FindAllUR">
SELECT *FROM role r
LEFT OUTER JOIN user_role ur ON r.id=ur.rid
LEFT OUTER JOIN USER u ON u.id=ur.uid
</select>