1.输入映射
1.1需求
完成用户信息的综合查询,需要传入的查询条件很复杂,包含多面信息
1.2方法
针对需求使用自定义的包装类pojo,可以将所有用到的查询条件作为属性
2.输出映射
2.1resultType
2.1.1输出pojo类型
使用result Type进行输出映射,只用查询出来的列名和pojo的属性名一样,该列才能映射成功,如果列名和pojo的属性名都不一样,则不会创建pojo对象,如果列名和pojo属性名有一个一样,则会创建pojo对象
2.1.2输出简单类型
2.2resultMap
当查询的列名和pojo中的属性名不一致的时候
1)定义resultMap
<resultMap type="要映射的pojo" id="resultMap的唯一标识" >
<id column="查询结果集中的唯一标识列名" property="pojo的属性名"/> //如果多个列确定唯一标识,就配置多个<id /> 标签
<result columns="普通列名" property="pojo的属性名" />
</resultMap>
2)使用resultMap进行映射
在mapper.xml文件中
<select id="" parameterType="" resultMap="上面的resultMap的唯一标识"> sql </select>
3)查询关联表中的信息
<resultMap type="" id="">
<association property="" javaType="">
<id column="第一个表中关联用户的唯一标识" property="pojo的属性名"/> //假如User表是主表,该句就表示映射到user表的哪个属性
<result columns="普通列名" property="pojo的属性名" />
<result columns="普通列名" property="pojo的属性名" />
</association>
</resultMap>
4)一对一查询的输出
resultType: 没有查询结果的特殊要求建议使用,但pojo中若没有相应的列名则应增加
resultMap: 查询结果有特殊的要求使用,可以将关联查询映射到pojo 中(关联查询时,pojo需要加入另一个pojo对象时)
另外resultMap可以实现延迟加载,resultType无法实现延迟加载
5)一对多的查询(在resultMap中使用,当查询结果中有一个别的表的list集合,如某班级中所有学生信息)
public class Class{
private List<student> studList; //这个在resultMap中用collection
}
collection将关联查询的多条记录映射到集合对象中
property 将关联查询映射到哪个属性(父类中的List属性名,比如班级中的学生的List集合)
ofType 指定要映射到list集合属性中的pojo属性(List<E> ,ofType指定的是其中的E)
javaType 指定Java的类型 ,一般List是 ArrayList
<collection property="orders" ofType="cn.com.OrderTail" >
<id columns="" property=" " />
<result columns="" property="" />
........
</collection>
使用extends继承可以不用配置已经配置过的内容,extends="另一个resultMap的id", 多对多的话就是 collection的嵌套使用
其中一种方式:(使用两个查询,在resultMap中定义collection的select用来调用第二个select查询,其中column必须有,可以在collection中配置<result><id>等)
<resultMap id="collectionTest" type="teacher"> <id column="id" property="ida"/> <result column="name" property="namea"/> <result column="password" property="passworda"/> <collection property="list" ofType="com.domain.Mybatisforeach" column="id" select="query"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="password" property="password"/> </collection> </resultMap> <select id="queryCollectionTest" resultMap="collectionTest" > select * from teacher ; </select> <select id="query" resultType="Mybatisforeach" > select * from Mybatisforeach ; </select>
3.动态sql
3.1需求
对查询条件进行判断,如果条件不为空则进行拼接
语法: <if test=" and " ></if>
例如:<where >
<if test="sex != "" "> //如果传过来的pojo中的sex参数不为空就拼接下面的sql
and sex=#{sex}
</if>
<if test = " name != "" "> //如果传过来的pojo中的name不为空,就拼接下面的sql
and name=#{name}
</if>
</where>
注:这里使用<where> 标签的用处是表示sql中的WHERE ,好处是如果有条件成立则会自动去掉开头的第一个条件中的and
3.2 sql片段
将上述实现的动态sql判断代码抽取出来组成一个sql片段,其他的statment就可以引用这个片段,在mapper.xml中书写
语法:<sql id="唯一的标识" > </sql>
定义sql片段,基于单表的定义,重用性高 ,sql片段中不用where标签,在statement中使用where标签
引用sql片段: <include refid="sql片段的id" ></build>
PS:如果是引用另外一个xml中的sql片段,则sql片段id前面要加上xml文件namespace的值。
3.3foreach向sql传递数组或List,mybatis使用foreach进行解析
3.3.1需求
在查询列表和查询总数的statement中增加多个id输入查询,如下:
3.3.2 sql语句
select * from user where id=1 or id = 3 or id = 5 ;或者select * from user id IN(1,3,5);(有多个id的输入)
<if test=" ids != null ">
<foreach collection="ids" item="id1" open="" close="" spearator="">//open 开始遍历时拼接的串,close结束遍历时拼接的串,speatator遍历的两个对象中间需要拼接的串,比如or ,and等
中间写每次遍历的内容 id=#{id}
</foreach>
</if>