您的位置:首页 > 数据库

mybatis学习四之输入输出映射以及动态sql

2017-10-19 10:16 603 查看
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将关联查询的
4000
多条记录映射到集合对象中

        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>

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: