百木园-与人分享,
就是让自己快乐。

Mybatis如何使用连表查询

某天,产品经理给了这么一个需求技术小哥,能不能帮用户添加一个搜索栏,查询包含某个关键字的所有类目。技术小哥稍微想了一下,目前跟类目相关的表有两个,一个是content_category类目表,一个是content_system内容系统表。而用户要查找的关键字是存在content_system表里面,这样一来需要连表查询一下。难度好像不大,也就爽快地答应了。

技术小哥再仔细分析了一下两个表的结构:

CREATE TABLE `content_category` (
  `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'类目编号Id\',
  `pid` int(10) unsigned DEFAULT NULL COMMENT \'上级编号id\',
  `level` tinyint(4) NOT NULL COMMENT \'层级\',
  `name` varchar(20) NOT NULL COMMENT \'名称\',
  `description` varchar(200) DEFAULT NULL COMMENT \'描述\',
  `icon` varchar(50) DEFAULT NULL COMMENT \'图标\',
  `type` tinyint(3) NOT NULL DEFAULT \'1\' COMMENT \'类型(1:普通,2:热门...)\',
  `alias` varchar(20) DEFAULT NULL COMMENT \'别名\',
  `system_id` int(11) DEFAULT NULL COMMENT \'系统编号id\',
  `ctime` bigint(20) unsigned NOT NULL COMMENT \'创建时间\',
  `orders` bigint(255) unsigned NOT NULL COMMENT \'排序\',
  `attention` bigint(20) unsigned NOT NULL COMMENT \'关注度\',
  PRIMARY KEY (`category_id`),
  KEY `content_category_orders` (`orders`),
  KEY `content_category_pid` (`pid`),
  KEY `content_category_alias` (`alias`),
  KEY `content_category_level` (`level`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT=\'内容类目表\';

 

CREATE TABLE `content_system` (
  `system_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT \'系统编号id\',
  `name` varchar(20) NOT NULL COMMENT \'系统名称\',
  `code` varchar(20) DEFAULT NULL COMMENT \'别名\',
  `description` varchar(300) DEFAULT NULL COMMENT \'描述\',
  `ctime` bigint(20) DEFAULT NULL COMMENT \'创建时间\',
  `orders` bigint(20) DEFAULT NULL COMMENT \'排序\',
  PRIMARY KEY (`system_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT=\'内容系统表\';

 

不难看出,两个表都有system_id作为关联,当用户输入一个关键字,例如 code = \"news\" 时候,系统需要自动搜索出 system_id = 1 的所有类目信息。

于是技术小哥开始了他的工作,首先是定义Mapper.xml

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">
<mapper namespace=\"com.thomson.content.rpc.mapper.ContentCategoryExtMapper\">
    <!-- 定义基础类型 -->
    <resultMap id=\"BaseResultMap\" type=\"com.thomson.content.dao.model.ContentCategory\">
        <!-- 实体类的字段名和数据表的字段名映射 -->
        <id column=\"category_id\" jdbcType=\"INTEGER\" property=\"categoryId\" />
        <result column=\"pid\" jdbcType=\"INTEGER\" property=\"pid\" />
        <result column=\"level\" jdbcType=\"TINYINT\" property=\"level\" />
        <result column=\"name\" jdbcType=\"VARCHAR\" property=\"name\" />
        <result column=\"description\" jdbcType=\"VARCHAR\" property=\"description\" />
        <result column=\"icon\" jdbcType=\"VARCHAR\" property=\"icon\" />
        <result column=\"type\" jdbcType=\"TINYINT\" property=\"type\" />
        <result column=\"alias\" jdbcType=\"VARCHAR\" property=\"alias\" />
        <result column=\"system_id\" jdbcType=\"INTEGER\" property=\"systemId\" />
        <result column=\"ctime\" jdbcType=\"BIGINT\" property=\"ctime\" />
        <result column=\"orders\" jdbcType=\"BIGINT\" property=\"orders\" />
        <result column=\"attention\" jdbcType=\"BIGINT\" property=\"attention\" />
    </resultMap>
    <!--继承基础类型BaseResultMap, association 一对一关联查询 -->
    <resultMap extends=\"BaseResultMap\" id=\"ClassesResultMap\" type=\"com.thomson.content.dao.model.ContentCategory\">
    </resultMap>
  
<!-- 这一步是关键的连表查询 --> <select id=\"selectContentCategoryByCode\" parameterType=\"map\" resultMap=\"ClassesResultMap\"> select content_c.* from content_category content_c left join content_system content_s on content_s.code=content_s.code=#{code,jdbcType=VARCHAR} where content_s.system_id=content_c.system_id </select> <!-- 缓存 --> <cache type=\"org.mybatis.caches.ehcache.LoggingEhcache\" /> </mapper>

 

然后是Mapper接口

package com.thomson.content.rpc.mapper;

import com.thomson.content.dao.model.ContentCategory;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 类目ExtMapper
 * Created by Thomson on 2022/01/10.
 * 根据content_system 的 code 获取类目
 */
public interface ContentCategoryExtMapper {

    int up(String code);

    int down(String code);

  
    List<ContentCategory> selectContentCategoryByCode(@Param(\"code\") String code);

}

 

接下来是实现类

import com.thomson.Content.dao.model.ContentArticle;
import com.thomson.Content.rpc.mapper.ContentCategoryExtMapper;
import com.thomson.common.annotation.BaseService;
import com.thomson.common.base.BaseServiceImpl;
import com.thomson.Content.dao.mapper.ContentCategoryMapper;
import com.thomson.Content.dao.model.ContentCategory;
import com.thomson.Content.dao.model.ContentCategoryExample;
import com.thomson.Content.rpc.api.ContentCategoryService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
* ContentCategoryService实现
* Created by Thomson on 2021/01/10.
*/
@Service
@Transactional
@BaseService
public class ContentCategoryServiceImpl extends BaseServiceImpl<ContentCategoryMapper, ContentCategory, ContentCategoryExample> implements ContentCategoryService  {

    private static final Logger LOGGER = LoggerFactory.getLogger(ContentCategoryServiceImpl.class);

    @Autowired
    ContentCategoryExtMapper ContentCategoryExtMapper;

    // @Override
    public List<ContentCategory> selectContentCategoryByCode(String code) {
        return ContentCategoryExtMapper.selectContentCategoryByCode(code);
    }

}

 

在controll下获取数据

    @ApiOperation(value = \"类目列表\")
    @RequiresPermissions(\"content:category:read\")
    @RequestMapping(value = \"/list\", method = RequestMethod.GET)
    @ResponseBody
    public Object list(
            @RequestParam(required = false, defaultValue = \"0\", value = \"offset\") int offset,
            @RequestParam(required = false, defaultValue = \"10\", value = \"limit\") int limit,
            @RequestParam(required = false, value = \"sort\") String sort,
            @RequestParam(required = false, value = \"order\") String order) {
     Map<String, Object> result = new HashMap<>(2);
        String code = \"news\";
        List<ContentCategory> categories = ContentCategoryService.selectContentCategoryByCode(code);
        System.out.print(\"\\n\"+categories+\"\\n\");
      result.put(\"rows\", categories);
     result.put(\"total\", total);
return result;
    }

至此,技术小哥获取到了自己想要的数据。顺利完成了产品经理给的任务。 

 


来源:https://www.cnblogs.com/thomson-fred/p/16609410.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » Mybatis如何使用连表查询

相关推荐

  • 暂无文章