Mybatis-04-结果集映射resultMap/动态SQL/关联查询

一.结果集映射resultMap

resultType可以指定将查询结果映射为持久化类,但需要持久化类的属性名和sql查询的列名一致才能映射成功。如果数据库中的表的字段名和持久化类的属性名不一致,则需要通过resultMap将字段名和属性名建立起对应关系
例如:
数据库表bbs_employee

这里写图片描述

持久化类BbsEmployee

public class BbsEmployee {

    private String username;
    private String password;
    private String degree;
    private String email;
    private Boolean gender;
    private String imgUrl;
    private String phone;
    private String realName;
    private String school;
    .......

需要在mapper.xml文件中添加配置:

  <!-- type指定映射到哪一个持久化类-->
  <resultMap id="BaseResultMap" type="com.sandking.mybatis.pojo.BbsEmployee" >

    <id column="username" property="username" jdbcType="VARCHAR" />
    <!-- property:对应持久化类中的属性 -->
    <!-- column:对应数据库表中的字段 -->

    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="degree" property="degree" jdbcType="VARCHAR" />
    <result column="email" property="email" jdbcType="VARCHAR" />
    <result column="gender" property="gender" jdbcType="BIT" />
    ......
    <result column="is_del" property="isDel" jdbcType="BIT" />
  </resultMap>

< resultMap >标签与< select >< insert >等标签同级

二.动态SQL

通过Mybatis为mapper映射文件提供的几种标签,实现动态**拼接**SQL,即SQL不是写死的而是根据传入的参数可以发生变化的

1.if标签

为参数设定条件,当条件满足才会将if标签内的内容拼接到向数据库发送的SQL中
if标签的使用案例:
mapper.xml文件

<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
          resultType="com.sandking.mybatis.pojo.BbsEmployee">
    SELECT * FROM `bbs_employee`
    WHERE 1=1
    <!--添加if标签,test属性是if的条件-->
    <if test="username != null and username !=''">
      AND username  LIKE #{username}
    </if>
    <if test="password != null and password !=''">
      AND password LIKE #{password}
    </if>
  </select>

测试程序:

@Test
    public void testQuery(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        BbsEmployee employee = new BbsEmployee();
        employee.setUsername("%ad%");
        //传入查询参数,password的值不为空
        employee.setPassword("%1%");
        BbsEmployee bbsEmployee = sqlSession.selectOne("queryTest",employee);

        System.out.println(bbsEmployee);
        sqlSession.close();

    }

查询结果:

这里写图片描述

Mybatis向数据库发送的查询语句中有两个限定范围的条件,username和password

更改测试程序传入的查询参数值

@Test
    public void testQuery(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        BbsEmployee employee = new BbsEmployee();
        employee.setUsername("%ad%");
        //设置传入参数password的值为空
        employee.setPassword("");
        BbsEmployee bbsEmployee = sqlSession.selectOne("queryTest",employee);

        System.out.println(bbsEmployee);
        sqlSession.close();

    }

查询结果:

这里写图片描述

可以看到,因为password的值为null,不符合if标签的条件,if标签内的内容就没有拼接到向数据库发送的SQL中

2.foreach标签

如果SQL的参数是一个数组,例如:

SELECT * FROM `bbs_employee` WHERE id IN ( ? , ? , ? , ? )

需要传递id的值,而且不确定到底有多少个id值(即SQL需要根据参数的数量做相应更改),这是就需要用到foreach标签
foreach标签的使用案例:

在BbsEmployee持久化类中增加一个字符串数组

private List<String> ids;

mapper映射文件:

    <select id="query3" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
          resultType="com.sandking.mybatis.pojo.BbsEmployee">
    SELECT * FROM `bbs_employee`
    WHERE
    <!-- foreach标签遍历集合或数组 -->
    <!-- collection:遍历的集合,这里是的ids属性 -->
    <!-- item:定义被遍历的元素的名称,需要和后面的#{}中的名称对应 -->
    <!-- open:在前面添加的sql片段 -->
    <!-- close:在结尾处添加的sql片段 -->
    <!-- separator:指定遍历的元素之间使用的分隔符 -->
    <foreach collection="ids" item="id" open="id IN (" close=")"
             separator=",">
      #{id}
    </foreach>
  </select>

测试程序:

    @Test
    public void query3(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        BbsEmployee employee = new BbsEmployee();
        List<String> list = new ArrayList<String>();
        list.add("1");
        list.add("2");
        list.add("4");
        list.add("5");
        employee.setIds(list);
        List<BbsEmployee> list1 = sqlSession.selectList("query3",employee);
        for (BbsEmployee e:list1) {
            System.out.println(e);
        }
        sqlSession.close();

    }

查询结果:
这里写图片描述

3.include标签

用于抽取相同的SQL片段,增加重用性,减少书写量

include标签的使用案例:

  <select id="query3" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
          resultType="com.sandking.mybatis.pojo.BbsEmployee">
    <include refid="select"/>
    WHERE
    <foreach collection="ids" item="id" open="id IN (" close=")"
             separator=",">
      #{id}
    </foreach>
  </select>

  <sql id="select">
    SELECT * FROM `bbs_employee`
  </sql>

4.where标签

用于代替传统SQL语句中的“where 1=1”

where标签的使用案例:
传统方式:

<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
          resultType="com.sandking.mybatis.pojo.BbsEmployee">
    SELECT * FROM `bbs_employee`
    WHERE 1=1
    <if test="username != null and username !=''">
      AND username  LIKE #{username}
    </if>
    <if test="password != null and password !=''">
      AND password LIKE #{password}
    </if>
  </select>

使用where标签:

<select id="queryTest" parameterType="com.sandking.mybatis.pojo.BbsEmployee"
          resultType="com.sandking.mybatis.pojo.BbsEmployee">
    SELECT * FROM `bbs_employee`
    <where>
      <if test="username != null and username !=''">
        AND username  LIKE #{username}
      </if>
      <if test="password != null and password !=''">
        AND password LIKE #{password}
      </if>
    </where>
  </select>

查询结果:

这里写图片描述

可以看出where标签自动去掉了username的前的AND关键字

三.关联查询

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/eagleuniversityeye/article/details/78145713
文章标签: mybatis
所属专栏: Mybatis从入门到入土
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭