MyBatis中的关联查询

一:在使用MyBatis进行关联查询的时候,首先要确定表与表之间的关联关系

  表与表之间一般存在三种关系,即一对一,一对多,多对多关系。 

  下面分别就三种关系讲解

1.一对一和一对多在Mybatis中进行关联查询的思路都是一样的,在一个实体类中创建另一个实体类的对象作为当前类的属性,这样的话数据库中表与表之间的关联关系就体现在了我们的实体类当中

如下,在我们的账单类(SmbmsBill)中添加了一个供应商类(SmbmsProvider)的对象

 

 

 

 当我们查寻所有订单的时候就可以连带的把该账单上的供应商也一并查询出来

2.接下来我们开始创建接口以及查询方法

 

方法创建完成之后在我们的Mapper的配置文件中编写对应方法的实现

 

 由于我们要查询的结果包含了两张表中的数据,MyBatis的自动映射无法把关联对象中的数据自动映射成功,所以我们需要进行手动映射

3.创建相应的resultMap节点

<resultMap id="SmbmsProviderResult" type="SmbmsBill">
  <!--在此处需要主对象手动指定id和result节点进行手动映射-->
  <!--property代表关联对象在实体类中的属性名 javaType 代表他的类型-->
<association property="smbmsProvider" javaType="SmbmsProvider">
  <!--将关联对象进行映射-->

</association>
</resultMap>
上面代码中的<!--association节点是对单个属性进行映射--> 如需进行对泛型集合的映射 节点因改为
  <resultMap id="SmbmsProviderResult" type="SmbmsBill">
        <collection property="smbmsProvider" ofType="SmbmsProvider">
        </collection>

    </resultMap>

4.配置<select>标签进行查询

        <select id="getSmbmsBillList" resultMap="SmbmsProviderResult"> <!--引入上面的resultMap-->
        SELECT b.*,p.proName FROM smbms_bill AS b,smbms_provider AS p   WHERE p.id=b.providerId
    
</select>

5.编写测试类进行测试

    SqlSession sqlSession= SqlSessionUtils.getSession();
    IBillDao mapper = sqlSession.getMapper(IBillDao.class);

    @Override
    public List<SmbmsBill> getSmbmsBillList() {
  //此方法返回的便是所有的账单详情
return mapper.getSmbmsBillList(); }

二:设置自动映射的基本

在上面配置Mapper中的result节点的时候,由于MyBatis默认的自动映射级别无法对关联对象进行映射

我们也可也通过修改mybits的自动映射基本,将他变为全部,这样的话当你数据表和实体类的字段相同时,无须再进行手动映射

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbc.properties"></properties>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    <!--此处为自动映射级别 FULL为全部-->
<setting name="autoMappingBehavior" value="FULL"/> <!--开启二级缓存--> <setting name="cacheEnabled" value="true"></setting> </settings> <typeAliases> <package name="com.yjc.entity"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <package name="com.yjc.dao"/> </mappers> </configuration>

三:自关联查询

自关联代表着数据与数据之间的关联关系存在着一张表之间,那么就需要再当前类中创建一个泛型类型为当前类的泛型集合

3.1数据表的结构(一些商品的分类)

 

 

 3.2创建Category类

public class Category {
    private int id;
    private String name;
    private int type;
     private List<Category> lists=new ArrayList<>();
    //省略get/set方法
}

3.3编写接口的方法

public interface CategoryMapper {
    //查询一级分类(包括其下的子分类)
    Category getOneById(int categoryid);
}

3.4创建对应的Mapper.xml文件

<mapper namespace="com.cmy.mapper.CategoryMapper">
    <resultMap id="cateMap" type="Category">
        <id column="id" property="id"></id>
        <result column="name" property="name"></result>
        <result column="type" property="type"></result>
        <!--
          参照实体类,lists变量的类型是集合(典型的1:N的关系)
          select:指定查询关联对象的select语句(getOneByParent)
          column:查询关联对象select语句的条件值
          本例:根据id获取对应的分类后,以此id为条件获取子级分类(parentId=父级分类ID)
        -->
        <collection property="lists" ofType="Category" select="getOneByParent" column="id"/>
    </resultMap>

    <select id="getOneById" parameterType="int" resultMap="cateMap">
           select * from easybuy_product_category where id=#{cateid}
    </select>

    <select id="getOneByParent" parameterType="int" resultMap="cateMap">
           select * from easybuy_product_category where parentId=#{id}
    </select>
</mapper>

3.5进行测试

 SqlSession session=null;
    CategoryMapper mapper=null;
    @Before
    public void before(){
        session= SqlSessionFactoryUtils.getSession();
        mapper=session.getMapper(CategoryMapper.class);
    }
    @Test
    public void test01(){
        Category cate = mapper.getOneById(548);
        //重写Category类中的toString方法 直接打印
        System.out.println(cate);

    }
    
    @After
    public void after(){
        session.commit();//事务提交
        session.close();//释放session
    }

 

posted @ 2019-10-13 22:08  天戈  阅读(619)  评论(0编辑  收藏  举报