springboot中model的使用以及多表查询案列

话不多说,直接上代码

  1. 需求

1:跳转租房页面
2:检查是否选择对应的城市
        a:没有选择城市,则需要在url中提示信息
        b: 选择对应城市,则需要查询对应城市下的房源信息列表
        c:再次点击【租房】,不需要校验是否有城市(从某个地方获取第一次选择的城市信息)
3:查询对应城市下的房源列表信息

  1. 页面
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. pom依赖

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.kejizhentan</groupId>
        <artifactId>renthouseproject</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>renthouseproject</name>
        <description>project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        </properties>
    
        <dependencies>
            <!--thymelea模板的包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <!--springboot前端的基础包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!--导入mysql包-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.12</version>
            </dependency>
            <!--导入mybatis包-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--导入jdbc包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <!--导入对象工具包-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <!--jpa包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!--将java对象转换成json类型数据的依赖包-->
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
            </dependency>
            <!--通过注解限制属性值-->
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
                <!-- <version>2.1.0.Final</version> -->
            </dependency>
            <!--对象转换工具包-->
            <dependency>
                <groupId>org.modelmapper</groupId>
                <artifactId>modelmapper</artifactId>
                <version>1.1.0</version>
            </dependency>
            <!--redis包-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <!--session信息存储到redis中包-->
            <dependency>
                <groupId>org.springframework.session</groupId>
                <artifactId>spring-session-data-redis</artifactId>
            </dependency>
    
    
            <dependency>
                <groupId>org.jetbrains</groupId>
                <artifactId>annotations</artifactId>
                <version>RELEASE</version>
                <scope>compile</scope>
            </dependency>
            <!--google工具包,简化字符串非空-->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>21.0</version>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring-boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.3.7.RELEASE</version>
                    <configuration>
                        <mainClass>com.kejizhentan.RenthouseprojectApplication</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <id>repackage</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
  3. 表结构

    CREATE TABLE city (
      cityId int(11) unsigned NOT NULL AUTO_INCREMENT,
      belongTo varchar(32) NOT NULL DEFAULT '0' COMMENT '上一级行政单位名',
      enName varchar(32) NOT NULL COMMENT '行政单位英文名缩写',
      cnName varchar(32) NOT NULL COMMENT '行政单位中文名',
      level varchar(16) NOT NULL COMMENT '行政级别 市-city 地区-region',
      baidu_map_lng  double NOT NULL COMMENT '百度地图经度',
      baidu_map_lat double NOT NULL COMMENT '百度地图纬度',
      PRIMARY KEY (cityId),
      UNIQUE KEY unique_name_belong (nName,level,belongTo) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8
    
    
    CREATE TABLE house (
      houseId int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'house唯一标识',
      title varchar(32) NOT NULL,
      price int(11) unsigned NOT NULL COMMENT '价格',
      area float unsigned NOT NULL COMMENT '面积',
      room int(11) unsigned NOT NULL COMMENT '卧室数量',
      floor int(11) unsigned NOT NULL COMMENT '楼层',
      totalFloor int(11) unsigned NOT NULL COMMENT '总楼层',
      watchTimes int(11) unsigned DEFAULT '0' COMMENT '被看次数',
      buildYear int(4) NOT NULL COMMENT '建立年限',
      status int(4) unsigned NOT NULL DEFAULT '0' COMMENT '房屋状态 0-未审核 1-审核通过 2-已出租 3-逻辑删除',
      createTime datetime DEFAULT NULL COMMENT '创建时间',
      lastUpdateTime datetime DEFAULT NULL COMMENT '最近数据更新时间',
      cityEnName varchar(32) NOT NULL COMMENT '城市标记缩写 如 北京bj',
      regionEnName varchar(255) NOT NULL COMMENT '地区英文简写 如昌平区 cpq',
      cover varchar(32) DEFAULT NULL COMMENT '封面',
      direction int(11) NOT NULL COMMENT '房屋朝向',
      distanceToSubway int(11) NOT NULL DEFAULT '-1' COMMENT '距地铁距离 默认-1 附近无地铁',
      parlour int(11) NOT NULL DEFAULT '0' COMMENT '客厅数量',
      district varchar(32) NOT NULL COMMENT '所在小区',
      adminId int(11) NOT NULL COMMENT '所属管理员id',
      bathroom int(11) NOT NULL DEFAULT '0',
      street varchar(32) NOT NULL COMMENT '街道',
      houseCode text COMMENT '房本(唯一认证标识)',
      PRIMARY KEY (houseId)
    ) ENGINE=InnoDB AUTO_INCREMENT=85 DEFAULT CHARSET=utf8 COMMENT='房屋信息表'
    
    
    CREATE TABLE house_detail (
      houseDetailId int(11) unsigned NOT NULL AUTO_INCREMENT,
      description varchar(255) DEFAULT NULL COMMENT '详细描述',
      layoutDesc varchar(255) DEFAULT NULL COMMENT '户型介绍',
      traffic varchar(255) DEFAULT NULL COMMENT '交通出行',
      roundService varchar(255) DEFAULT NULL COMMENT '周边配套',
      rentWay int(2) NOT NULL COMMENT '租赁方式',
      address varchar(32) NOT NULL COMMENT '详细地址 ',
      subwayId int(11) DEFAULT NULL COMMENT '附近地铁线id',
      subwayName varchar(32) DEFAULT NULL COMMENT '附近地铁线名称',
      subwayStationId int(11) DEFAULT NULL COMMENT '地铁站id',
      subwayStationName varchar(32) DEFAULT NULL COMMENT '地铁站名',
      houseId int(11) NOT NULL COMMENT '对应house的id',
      PRIMARY KEY (houseDetailId),
      UNIQUE KEY index_on_houseId (houseId) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=71 DEFAULT CHARSET=utf8
    
    
    CREATE TABLE house_picture (
      housePictureId int(10) unsigned NOT NULL AUTO_INCREMENT,
      houseId int(11) NOT NULL COMMENT '所属房屋id',
      cdnPrefix varchar(255) NOT NULL COMMENT '图片路径',
      width int(11) DEFAULT NULL COMMENT '宽',
      height int(11) DEFAULT NULL COMMENT '高',
      location varchar(32) DEFAULT NULL COMMENT '所属房屋位置',
      path varchar(255) NOT NULL COMMENT '文件名',
      PRIMARY KEY (housePictureId)
    ) ENGINE=InnoDB AUTO_INCREMENT=116 DEFAULT CHARSET=utf8 COMMENT='房屋图片信息
    
    
    CREATE TABLE house_subscribe (
      houseSubscribeId int(11) unsigned NOT NULL AUTO_INCREMENT,
      houseId int(11) NOT NULL COMMENT '房源id',
      userId int(11) NOT NULL COMMENT '用户id',
      desc varchar(255) DEFAULT NULL COMMENT '用户描述',
      status int(2) NOT NULL DEFAULT '0' COMMENT '预约状态 1-加入待看清单 2-已预约看房时间 3-看房完成',
      createTime datetime NOT NULL COMMENT '数据创建时间',
      lastUpdateTime datetime NOT NULL COMMENT '记录更新时间',
      orderTime datetime DEFAULT NULL COMMENT '预约时间',
      telephone varchar(11) DEFAULT NULL COMMENT '联系电话',
      adminId int(11) NOT NULL COMMENT '房源发布者id',
      PRIMARY KEY (houseSubscribeId)
    ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='预约看房信息表'
    
    
    CREATE TABLE house_tag (
      houseId int(11) NOT NULL COMMENT '房屋id',
      housetagId  int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '标签id',
      tagName varchar(32) NOT NULL,
      PRIMARY KEY (housetagId)
    ) ENGINE=InnoDB AUTO_INCREMENT=52 DEFAULT CHARSET=utf8 COMMENT='房屋标签映射关系表'
    
    
    CREATE TABLE subway (
      subwayId int(11) unsigned NOT NULL AUTO_INCREMENT,
      subwayName varchar(32) NOT NULL COMMENT '线路名',
      cityEnName varchar(32) NOT NULL COMMENT '所属城市英文名缩写',
      PRIMARY KEY (subwayId),
      KEY index_on_city (cityEnName)
    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8
    
    
    CREATE TABLE subway_station (
      subwayStationId int(11) unsigned NOT NULL AUTO_INCREMENT,
      subwayId int(11) NOT NULL COMMENT '所属地铁线id',
      subwayStationName varchar(32) NOT NULL COMMENT '站点名称',
      PRIMARY KEY (subwayStationId),
      UNIQUE KEY unique_station (subwayId,subwayStationName)
    ) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8
    
    
  4. 实体类

    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    /**
    * @Description:    城市的实体类
    * @Author:         kejizhentan
    * @CreateDate:     2021/2/12 21:30
    * @UpdateUser:     kejizhentan
    * @UpdateDate:     2021/2/12 21:30
    * @UpdateRemark:   无
    * @Version:        1.0
    */
    
    @Data
    public class City {
    
        private int cityId;//城市ID
        private String belongTo;//上一级行政单位名
        private String enName;//行政单位英文名缩写
        private String cnName;//行政单位中文名
        private String level;//行政级别 市-city 地区-region
        private double baidu_map_lng;//百度地图经度
        private double baidu_map_lat;//百度地图纬度
    
    }
    
    
    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    import java.util.Date;
    import java.util.List;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/5/21 17:34
     * @Description: 房屋信息
     */
    
    @Data
    public class House {
    
        private Long houseId;//房屋ID
    
        //NotNull:当前对象在数据封装的时候,当前带有此注解,则不能为空,如果为空,则提示message信息
        @NotNull(message = "大标题不允许为空!")
        //Size:字段长度限制
        @Size(min = 1, max = 30, message = "标题长度必须在1~30之间")
        private String title;//大标题
    
        @NotNull(message = "必须填写租赁价格")
        @Min(value = 1)
        private int price;//价格
    
        @NotNull(message = "必须填写面积")
        private float area;//面积
    
        @NotNull(message = "必须填写卧室数量")
        @Min(value = 1, message = "非法的卧室数量")
        private int room;//卧室数量
    
        @NotNull(message = "必须填写所属楼层")
        private int floor;//楼层
    
        @NotNull(message = "必须填写总楼层")
        private int totalFloor;//总楼层
        private int watchTimes;//被看次数
    
        @NotNull(message = "必须填写建筑起始时间")
        @Min(value = 1900, message = "非法的建筑起始时间")
        private int buildYear;//建立年限
        private int status;//房屋状态 0-未审核 1-审核通过 2-已出租 3-逻辑删除
        private Date createTime;//创建时间
        private Date lastUpdateTime;//最近数据更新时间
    
        @NotNull(message = "必须选中一个城市")
        @Size(min = 1, message = "非法的城市")
        private String cityEnName;//城市标记缩写 如:bj
    
        @NotNull(message = "必须选中一个地区")
        @Size(min = 1, message = "非法的地区")
        private String regionEnName;//地区英文简写 如:昌平区 cpq
        private String cover;//封面
    
        @NotNull(message = "必须填写房屋朝向")
        private int direction;//房屋朝向
        private int distanceToSubway;//距地铁距离 默认-1 附近无地铁
        private int parlour;//客厅数量
    
        @NotNull(message = "必须填写小区")
        private String district;//所在小区
        private String adminId;//所属管理员id
        private int bathroom;
    
        @NotNull(message = "必须填写街道")
        @Size(min = 1, message = "非法的街道")
        private String street;//街道
        private String houseCode;//房本(唯一认证标识)
    
    
        //接收前端传过来的房屋详细信息
        @Size(max = 255)
        private String description;//详细描述
        private String layoutDesc;//户型介绍
        private String traffic;//交通出行
        private String roundService;//周边配套
    
        @NotNull(message = "必须选中一个租赁方式")
        @Min(value = 0)
        @Max(value = 1)
        private int rentWay;//租赁方式
    
        @NotNull(message = "详细地址不允许为空!")
        @Size(min = 1, max = 30, message = "详细地址长度必须在1~30之间")
        private String address;//详细地址
        private int subwayId;//附近地铁线id
        private String subwayName;//附近地铁线名称
        private int subwayStationId;//地铁站id
        private String subwayStationName;//地铁站名
    
    
        private HouseDetail houseDetail;//多表查询用于映射
    
        private List<HousePicture> photos;//房屋图片
    
        private List<HouseTag> houseTags;//多表查询用于映射
    
        private List<String> tags;//房屋标签名称
    
    
        private int subscribeStatus;//预约状态 1-加入待看清单 2-已预约看房时间 3-看房完成
    
    
    
    }
    
    
    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/5/21 17:58
     * @Description: 房屋详细信息
     */
    @Data
    public class HouseDetail {
    
        private int houseDetailId;//房屋详细ID
        private String description;//详细描述
        private String layoutDesc;//户型介绍
        private String traffic;//交通出行
        private String roundService;//周边配套
        private int rentWay;//租赁方式
        private String address;//详细地址
        private int subwayId;//附近地铁线id
        private String subwayName;//附近地铁线名称
        private int subwayStationId;//地铁站id
        private String subwayStationName;//地铁站名
        private Long houseId;//对应house的id
    
    }
    
    
    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/5/21 18:02
     * @Description: 房屋图片
     */
    @Data
    public class HousePicture {
    
        private int housePictureId;//房屋图片ID
        private Long houseId;//所属房屋ID
        private String cdnPrefix;//图片路径
        private int width;//宽
        private int height;//高
        private String location;//所属房屋位置
        private String path;//文件名
    
    }
    
    
    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/5/22 11:40
     * @Description: 房屋标签
     */
    @Data
    public class HouseTag {
    
        private int housetagId;//标签id
        private Long houseId;//房屋id
        private String tagName;//标签名称
    
    
    }
    
    
    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    /**
     * @Author: likang
     * @Date: 2019/11/7 11:44
     * @Description: 地铁信息
     */
    @Data
    public class Subway {
    
        private int subwayId;//地铁ID
        private String subwayName;//线路名
        private String cityEnName;//所属城市英文名缩写
    
    
    }
    
    
    package com.kejizhentan.entity;
    
    import lombok.Data;
    
    /**
     * @Author: likang
     * @Date: 2019/11/7 11:45
     * @Description: 地铁站点信息
     */
    @Data
    public class SubwayStation {
    
        private int subwayStationId;//地铁站点ID
        private String subwayStationName;//站点名称
        private int subwayId;//所属地铁线id
    
    
    }
    
    
  5. 价格设置工具类

    package com.kejizhentan.utils;
    
    import com.google.common.collect.ImmutableMap;
    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/11/13 10:05
     * @Description: 租房--价格--面积区间设置
     */
    
    public class RentHouseBlock {
    
        @Getter
        @Setter
        private String key;
        @Getter
        @Setter
        private int min;
        @Getter
        @Setter
        private int max;
    
    
        public RentHouseBlock(String key, int min, int max) {
            this.key = key;
            this.min = min;
            this.max = max;
        }
    
        /**
         *定义个k-v对象--map
         * 对象不可修改、安全
         *
         */
    
        public static Map<String,RentHouseBlock> PRICE_BLOCK;//价格区间
        public static Map<String,RentHouseBlock> ARAE_BLOCK;//面积区间
        public static RentHouseBlock ALL = new RentHouseBlock("*", -1, -1);// 全部或者不存在的对象
    
        static {
            /**
             *ImmutableMap:google工具,是map的实现类
             * 只要是ImmutableMap初始化的map对象
             * 都是安全的,不可修改的,唯一的
             * 每次进行数据操作的时候,都会产生一个新的副本对象(备份)
             *  每次对象的调用,都是调用的副本
             *
             */
            PRICE_BLOCK = ImmutableMap.<String,RentHouseBlock>builder()
                    .put("0-1000", new RentHouseBlock("0-1000",0,1000))
                    .put("1000-3000", new RentHouseBlock("1000-3000",1000,3000))
                    .put("3000-*", new RentHouseBlock("3000-*",3000,-1))
                    .build();
            ARAE_BLOCK = ImmutableMap.<String,RentHouseBlock>builder()
                    .put("0-30", new RentHouseBlock("0-30",0,30))
                    .put("30-50", new RentHouseBlock("30-50",30,50))
                    .put("50-*", new RentHouseBlock("50-*",50,-1))
                    .build();
        }
    
    
        /**
        * @Description: 判断用户选择的priceBlock价格区间,是否在map中存在
         *
         * priceBlock:0-1000
         *
        * @Author: likang
        * @Date: 2019/11/13 10:19
        * @Param: [priceBlock]
        * @Return: com.xdl.utils.RentHouseBlock
        * @Exception:
        */
        public static RentHouseBlock matchPriceBlock(String priceBlock) {
    
            RentHouseBlock rentHouseBlock = PRICE_BLOCK.get(priceBlock);
            if(rentHouseBlock != null){
                return rentHouseBlock;
            }
            return ALL;
        }
    
        /**
        * @Description: 判断用户选择的areaBlock面积区间,是否在map中存在
        * @Author: likang
        * @Date: 2019/11/13 10:22
        * @Param: [areaBlock]
        * @Return: java.lang.Object
        * @Exception:
        */
        public static RentHouseBlock matchAreaBlock(String areaBlock) {
            RentHouseBlock rentHouseBlock = ARAE_BLOCK.get(areaBlock);
            if(rentHouseBlock != null){
                return rentHouseBlock;
            }
            return ALL;
        }
    }
    
    
  6. 控制器层Controller

    package com.kejizhentan.controller;
    
    import com.google.common.base.Strings;
    import com.kejizhentan.entity.City;
    import com.kejizhentan.entity.House;
    import com.kejizhentan.entity.RentHouseSearch;
    import com.kejizhentan.service.ICityService;
    import com.kejizhentan.service.IHouseService;
    import com.kejizhentan.utils.RentHouseBlock;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    import javax.servlet.http.HttpSession;
    import java.util.List;
    
    /**
     * @Author: likang
     * @Date: 2019/11/13 8:58
     * @Description: 租房页面控制器
     */
    @Controller
    public class RentHouseController {
    
    
        @Autowired
        ICityService cityService;
        @Autowired
        IHouseService houseService;
    
    
        /**
        * @Description: 跳转首页面
        * @Author: likang
        * @Date: 2019/11/13 9:17
        * @Param: []
        * @Return: java.lang.String
        * @Exception:
        */
        @GetMapping("/home")
        public String home(){
            return "index";
        }
    
    
        /**
        * @Description:
         * 1:跳转租房页面
         * 2:检查是否选择对应的城市
         *      a:没有选择城市,则需要在url中提示信息
         *      b: 选择对应城市,则需要查询对应城市下的房源信息列表
         *      c:再次点击【租房】,不需要校验是否有城市(从某个地方获取第一次选择的城市信息)
         *
         * 3:查询对应城市下的房源列表信息
         *
         *
         * A:筛选
         *
        * @Author: kejizhentan
        * @Date: 2019/11/13 8:59
        * @Param: []
        * @Return: java.lang.String
        * @Exception:
        */
        @GetMapping("/rent/toRentHousePage")
        public String rentHouse(Model model, RentHouseSearch rentHouseSearch, HttpSession session,
                                RedirectAttributes redirectAttributes){
    
            //1:从用户的筛选条件中获取
            if(Strings.isNullOrEmpty(rentHouseSearch.getCityEnName())){
                //2:从session中获取信息
                String cityEnName = (String) session.getAttribute("cityEnName");
                if(Strings.isNullOrEmpty(cityEnName)){
                    redirectAttributes.addAttribute("msg", "必须选择城市");
                    //重定向
                    return "redirect:/home";
                }else{
                    rentHouseSearch.setCityEnName(cityEnName);
                }
            }else{//用户自己选择了对应的城市
                session.setAttribute("cityEnName", rentHouseSearch.getCityEnName());
            }
    
    
    
            //筛选条件
            model.addAttribute("searchBody", rentHouseSearch);
    
    
            //城市信息
            City city = cityService.queryCityByenName(rentHouseSearch.getCityEnName());
            model.addAttribute("currentCity", city);
    
            //区县信息
            //设置区域背景色为*,则前端会设置对应的颜色
            List<City> regionList = cityService.queryRegionBycname(rentHouseSearch.getCityEnName());
            if(regionList != null && regionList.size() > 0){
                model.addAttribute("regions", regionList);
            }else{
                model.addAttribute("regions", "*");
            }
    
    
            //房源列表
            List<House> houseList = houseService.queryRentHouseList(rentHouseSearch);
            model.addAttribute("houses", houseList);
            //房屋总个数
            model.addAttribute("total", houseList.size());
    
    
            //价格区间
            //前端:0-1000 == key ---
            //安全:0-1000  1000-3000   3000-+
            //后台:min:0  max:1000
            model.addAttribute("priceBlocks", RentHouseBlock.PRICE_BLOCK);
            //面积区间
            model.addAttribute("areaBlocks", RentHouseBlock.ARAE_BLOCK);
            //用户选择的价格
            model.addAttribute("currentPriceBlock", RentHouseBlock.matchPriceBlock(rentHouseSearch.getPriceBlock()));
            //用户选择面积
            model.addAttribute("currentAreaBlock", RentHouseBlock.matchAreaBlock(rentHouseSearch.getAreaBlock()));
            return "rentList";
        }
    
    
    }
    
    
  7. Service层

    城市信息的service层实现类:
    package com.kejizhentan.service.impl;
    
    import com.kejizhentan.dao.CityDAO;
    import com.kejizhentan.entity.City;
    import com.kejizhentan.service.ICityService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    /**
    * @Description:    获取所有城市的服务层的实现类
    * @Author:         kejizhentan
    * @CreateDate:     2021/2/12 21:39
    * @UpdateUser:     kejizhentan
    * @UpdateDate:     2021/2/12 21:39
    * @UpdateRemark:   无
    * @Version:        1.0
    */
    
    @Service
    public class CityServiceImp implements ICityService {
        @Autowired
        CityDAO  cityDAO;
        @Override
        public List<City> getCity() {
            return cityDAO.getCity();
        }
        @Override
        public City queryCityByenName(String cityEnName) {
            return cityDAO.queryCityByenName(cityEnName);
        }
        @Override
        public List<City> queryRegionBycname(String city_name) {
            return cityDAO.queryRegionBycname(city_name);
        }
    }
    
    
    城市信息的service层:
    package com.kejizhentan.service;
    
    import com.kejizhentan.entity.City;
    import org.apache.catalina.startup.HomesUserDatabase;
    
    import java.util.List;
    
    /**
    * @Description:    获取城市信息的服务层接口
    * @Author:         kejizhentan
    * @CreateDate:     2021/2/12 21:25
    * @UpdateUser:     kejizhentan
    * @UpdateDate:     2021/2/12 21:25
    * @UpdateRemark:   无
    * @Version:        1.0
    */
    
    public interface ICityService {
        List<City> getCity();
        /**
         * @Description: 根据城市简称,查询城市信息
         * @Author: likang
         * @Date: 2019/11/13 9:26
         * @Param: [cityEnName]
         * @Return: com.xdl.entity.City
         * @Exception:
         */
        City queryCityByenName(String cityEnName);
        /**
         * @Description: 根据城市简称,查询城市下对应的区县
         * @Author: likang
         * @Date: 2019/11/7 15:21
         * @Param: [city_name]
         * @Return: java.util.List<com.xdl.entity.City>
         * @Exception:
         */
        List<City> queryRegionBycname(String city_name);
    
    }
    
    
    房屋信息的service层实现类:
    package com.kejizhentan.service.impl;
    
    
    import com.kejizhentan.dao.HouseDAO;
    import com.kejizhentan.entity.*;
    import com.kejizhentan.service.IHouseService;
    import com.kejizhentan.utils.RentHouseBlock;
    import com.kejizhentan.utils.ServiceResult;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import java.util.*;
    
    @Service
    public class HouseServiceImpl implements IHouseService {
    
        @Autowired
        HouseDAO houseDAO;
         @Override
        public List<House> queryRentHouseList(RentHouseSearch rentHouseSearch) {
    
    
            Map<String,Object> params = new HashMap<>();
            params.put("start", rentHouseSearch.getStart());
            params.put("size", rentHouseSearch.getSize());
            params.put("cityEnName", rentHouseSearch.getCityEnName());
            params.put("regionEnName", rentHouseSearch.getRegionEnName());
            params.put("room", rentHouseSearch.getRoom());
            params.put("direction", rentHouseSearch.getDirection());
            params.put("rentWay", rentHouseSearch.getRentWay());
            params.put("orderBy", rentHouseSearch.getOrderBy());
            params.put("orderDirection", rentHouseSearch.getOrderDirection());
    
            //价格区间--最大值和最小值
            RentHouseBlock priceBlock = RentHouseBlock.PRICE_BLOCK.get(rentHouseSearch.getPriceBlock());
            params.put("priceMix",priceBlock != null?priceBlock.getMin():null);
            params.put("priceMax", priceBlock != null?priceBlock.getMax():null);
            //面积区间--最大值和最小值
            RentHouseBlock araeBlock = RentHouseBlock.ARAE_BLOCK.get(rentHouseSearch.getAreaBlock());
            params.put("araeMix",araeBlock != null ? araeBlock.getMin():null);
            params.put("araeMax", araeBlock != null ? araeBlock.getMax():null);
    
            return houseDAO.queryRentHouseList(params);
        }
    }
    
    
    房屋信息service层:
    package com.kejizhentan.service;
    
    
    import com.kejizhentan.entity.DataTableSearch;
    import com.kejizhentan.entity.House;
    import com.kejizhentan.utils.ServiceResult;
    
    import java.util.List;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/11/8 10:51
     * @Description: 房屋信息接口---服务层
     */
    public interface IHouseService {
    /**
         * @Description: 根据用户的筛选条件,查询房源列表
         * @Author: likang
         * @Date: 2019/11/13 10:23
         * @Param: [rentHouseSearch]
         * @Return: java.util.List<com.xdl.entity.House>
         * @Exception:
         */
        List<House> queryRentHouseList(RentHouseSearch rentHouseSearch);
    }
    
    
  8. DAO层

    城市信息查询的DAO层:
    package com.kejizhentan.dao;
    
    import com.kejizhentan.entity.City;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    /**
    * @Description:    获取所有城市信息得DAO接口--持久化层
    * @Author:         kejizhentan
    * @CreateDate:     2021/2/12 21:34
    * @UpdateUser:     kejizhentan
    * @UpdateDate:     2021/2/12 21:34
    * @UpdateRemark:   无
    * @Version:        1.0
    */
    @Repository
    public interface CityDAO {
        /**
         * @author kejizhentan
         * @params 无
         * @return 城市的list集合
         * @date 2021/2/12 21:36
         * @Description 获取城市信息
        */
    
        List<City> getCity();
    
        /**
         * @Description: 根据城市简称,查询城市信息
         * @Author: likang
         * @Date: 2019/11/13 9:26
         * @Param: [cityEnName]
         * @Return: com.xdl.entity.City
         * @Exception:
         */
        City queryCityByenName(String cityEnName);
    
        /**
         * @Description: 根据城市简称,查询城市下对应的区县
         * @Author: likang
         * @Date: 2019/11/7 15:21
         * @Param: [city_name]
         * @Return: java.util.List<com.xdl.entity.City>
         * @Exception:
         */
        List<City> queryRegionBycname(String city_name);
    
    }
    
    
    房屋信息查询的DAO层:
    package com.kejizhentan.dao;
    
    
    import com.kejizhentan.entity.*;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Author: kejizhentan
     * @Date: 2019/11/8 11:04
     * @Description: 房屋信息---持久化层
     */
    public interface HouseDAO {
     /**
         * @Description: 根据用户筛选条件,查询房源列表
         * @Author: likang
         * @Date: 2019/11/13 10:29
         * @Param: [params]
         * @Return: java.util.List<com.xdl.entity.House>
         * @Exception:
         */
        List<House> queryRentHouseList(Map<String,Object> params);
    }
    
  9. Mapper.xml文件

    查询城市信息的Mapper文件
    <?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.kejizhentan.dao.CityDAO">
    
        <!--查询所有城市信息-->
        <select id="getCity"  resultType="com.kejizhentan.entity.City">
            SELECT cityId,belongTo,enName,cnName,LEVEL,baidu_map_lng,baidu_map_lat FROM city WHERE LEVEL = 'city'
        </select>
    
        <!--根据城市简称,查询城市下对应的区县-->
        <select id="queryRegionBycname" parameterType="java.lang.String" resultType="com.kejizhentan.entity.City" >
            select
              C.cityId,C.cnName,C.enName,C.level
            from city c where c.level = 'region' and c.belongTo = #{city_name}
    
        </select>
    
        <!--根据城市简称,查询城市信息-->
        <select id="queryCityByenName" parameterType="java.lang.String" resultType="com.kejizhentan.entity.City">
            select * from city where enName = #{cityEnName}
        </select>
    
    
    
    </mapper>
    
    查询房屋信息的mapper文件:
    <?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.kejizhentan.dao.HouseDAO">
     <resultMap id="houseMap" type="com.kejizhentan.entity.House">
            <id column="houseId" property="houseId"/>
            <result column="title" property="title"/>
            <result column="price" property="price"/>
            <result column="area" property="area"/>
            <result column="room" property="room"/>
            <result column="floor" property="floor"/>
            <result column="totalFloor" property="totalFloor"/>
            <result column="watchTimes" property="watchTimes"/>
            <result column="buildYear" property="buildYear"/>
            <result column="status" property="status"/>
            <result column="createTime" property="createTime"/>
            <result column="lastUpdateTime" property="lastUpdateTime"/>
            <result column="cityEnName" property="cityEnName"/>
            <result column="regionEnName" property="regionEnName"/>
            <result column="cover" property="cover"/>
            <result column="direction" property="direction"/>
            <result column="distanceToSubway" property="distanceToSubway"/>
            <result column="parlour" property="parlour"/>
            <result column="district" property="district"/>
            <result column="adminId" property="adminId"/>
            <result column="bathroom" property="bathroom"/>
            <result column="street" property="street"/>
            <result column="houseCode" property="houseCode"/>
    
            <!--1对1的查询-->
            <association property="houseDetail" column="houseId" select="queryHouseDetailList"></association>
    
            <!--查询标签信息1对多-->
            <collection property="houseTags"  column="houseId" select="queryHouseTagsList"></collection>
            <!--查询图片信息1对多-->
            <collection property="photos" column="houseId" select="queryHousePhotosList"></collection>
    
        </resultMap>
    
        <select id="queryHousePhotosList"  parameterType="java.lang.Long" resultType="com.kejizhentan.entity.HousePicture">
            select * from house_picture hp where hp.houseId = #{houseId}
        </select>
    
        <select id="queryHouseTagsList" parameterType="java.lang.Long" resultType="com.kejizhentan.entity.HouseTag">
            select * from house_tag ht where ht.houseId = #{houseId}
        </select>
    
        <select id="queryHouseDetailList" parameterType="java.lang.Long" resultType="com.kejizhentan.entity.HouseDetail">
            select * from house_detail hd where hd.houseId = #{houseId}
        </select>
    
    
        <!--根据用户筛选条件,查询房源列表(多表查询)-->
        <select id="queryRentHouseList" parameterType="java.util.Map" resultMap="houseMap">
            select *
            from house h
            where h.status = 1
            <if test="cityEnName != null and cityEnName != ''">
                and h.cityEnName=#{cityEnName}
            </if>
            <if test='regionEnName != null and regionEnName != "" and regionEnName != "*"'>
                and h.regionEnName=#{regionEnName}
            </if>
            <if test="priceMix != null and priceMix != '' and priceMix != '-1'">
                and h.price <![CDATA[ >= ]]> #{priceMix}
            </if>
            <if test="priceMax != null and priceMax != '' and priceMax != '-1'">
                and h.price <![CDATA[ <= ]]> #{priceMax}
            </if>
            <if test="araeMix != null and araeMix != '' and araeMix != '-1'">
                and h.area <![CDATA[ >= ]]> #{araeMix}
            </if>
            <if test="araeMax != null and araeMax != '' and araeMax != '-1'">
                and h.area <![CDATA[ <= ]]> #{araeMax}
            </if>
            <if test="room != null and room != '' and room != 0">
                and h.room = #{room}
            </if>
            <if test="direction != null and direction != '' and direction != 0">
                and h.direction = #{direction}
            </if>
    
            <if test="rentWay != null and rentWay != '' and rentWay != '-1'">
                and hd.rentWay = #{rentWay}
            </if>
    
            <if test='orderBy != null and orderBy != "" and orderBy != "*"'>
                order by ${orderBy} ${orderDirection}
            </if>
    
            limit #{start},#{size}
        </select>
    
    
    
    </mapper>
    
  10. 配置文件:

    #设置端口号
    server.port=9999
    
    #配置数据源
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/housedemo
    spring.datasource.username=root
    spring.datasource.password=123456
    
    #指定mybatis的数据文件xml目录
    mybatis.mapper-locations=classpath:mapper/*.xml
    #配置mybatis日志文件框架输出信息,打印到控制台
    mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    
    
  11. 项目启动类

    package com.kejizhentan;
    
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    
    @SpringBootApplication
    @MapperScan(basePackages = {"com.kejizhentan.dao"})
    public class RenthouseprojectApplication {
    
    
        public static void main(String[] args) {
    
            SpringApplication.run(RenthouseprojectApplication.class, args);
        }
    
        
        
    }
    
    

注意:
    ①google工具包的使用,简化字符串非空和提供无法修改数据Map的
    ②Model或者ModelAndView的使用场景:当Controller中的方法既需要传值有需要跳转页面的时候就得使用Model或者ModelAndView,通过Model或者ModelAndView存储和传递数据,通过return跳转页面
    ③springboot中请求转发和响应重定向的实现和区别
    请求转发的实现:
     @RequestMapping("/forwardStr.do")
     public String forwardStr(School school){

       //默认会使用转发
       //return “result”;
        //显式的使用转发
       return “forward:/jsp/result.jsp”;
     }
    响应重定向的实现:
    @RequestMapping("/redirectStr.do")
    public String redirectStr(School school, Model model){

     //这里的数据同样会放在url中,所以只能传递基本数据类型和String类型
     model.addAttribute(“schoolName”, school.getSchoolName());
     model.addAttribute(“address”, school.getAddress());

     return “redirect:/jsp/result.jsp”;
    }
详细内容请看☞☞☞点击查看详情


注意:文中使用的RedirectAttributes其实是继承了Model,实际上还是使用Model在传值

在这里插入图片描述
    ④重点是多表联查的使用

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值