1、框架及環境搭建

1、springboot環境搭建

基本步驟:File——》new——》Project——》spring Initialzr——選擇相關jar包配置——》選擇本地路徑——》OK

 

 

 

2、Spring Data JPA + Hibernate 集成

    首先新建文件夾存儲JPA相關配置。如下圖。

 

 pom.xml配置文件

<?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.houseSearch</groupId>
    <artifactId>house</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>house</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.7.RELEASE</version>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <!-- 使用自定義ES 版本 -->
        <elasticsearch.version>5.6.1</elasticsearch.version>

        <!-- thymeleaf 覆蓋parent 選擇自己的版本 -->
        <thymeleaf.version>3.0.3.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.1.1</thymeleaf-layout-dialect.version>
        <thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
    </properties>

    <dependencies>
        <!-- jpa相關依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- 前端模板 thymeleaf 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.thymeleaf/thymeleaf -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>${thymeleaf.version}</version>
        </dependency>

        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf-spring4</artifactId>
            <version>3.0.2.RELEASE</version>
        </dependency>

        <!-- SpringSecurity 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- Thymeleaf方言支持SpringSecurity 依賴-->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            <version>${thymeleaf-extras-springsecurity4.version}</version>
        </dependency>

        <!-- redis session依賴 -->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- SpringBoot自帶熱加載開發工具 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
        <dependency>
            <groupId>joda-time</groupId>
            <artifactId>joda-time</artifactId>
            <version>2.3</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.5.0</version>
        </dependency>

        <!-- 七牛依賴 -->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>[7.2.0, 7.2.99]</version>
        </dependency>

        <!-- ModelMapper Simple, Intelligent, Object Mapping. -->
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>1.1.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>

        <!-- ES -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>${elasticsearch.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.7</version>
        </dependency>

        <!-- Kafka -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

        <!-- mail -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <!-- 測試依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>3.2.3</version>
            <!--<scope>system</scope>-->
            <!--<systemPath>${project.basedir}/lib/aliyun-java-sdk-core-3.2.3.jar</systemPath>-->
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.0.0</version>
            <!--<scope>system</scope>-->
            <!--<systemPath>${project.basedir}/lib/aliyun-java-sdk-dysmsapi-1.0.0.jar</systemPath>-->
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

 JPA配置文件:

package com.housesearch.config;


import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

/** 加上Configuration成爲配置類 */
@Configuration
/** 能夠掃描到倉庫類,用於取代xml形式的配置文件 */
@EnableJpaRepositories(basePackages = "com.housesearch.repository")
/** 開啓事務支持 */
@EnableTransactionManagement
public class JPAConfig {

    //建立數據源
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    //實體類的管理工廠
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        //實例化jpa適配器,由於使用的是hibernate所以用hibernatejpavendor
        HibernateJpaVendorAdapter japVendor = new HibernateJpaVendorAdapter();
        //不生成sql,自己掌握sql控制權
        japVendor.setGenerateDdl(false);

        //實例化管理工廠
        LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactory.setDataSource(dataSource());//設置數據源
        entityManagerFactory.setJpaVendorAdapter(japVendor);//設置適配器
        //設置掃描包名
        entityManagerFactory.setPackagesToScan("com.housesearch.entity");
        return entityManagerFactory;
    }

    //事務管理
    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }
}

 application.properties配置文件

 #JPAConfig
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root123

#控制檯輸出sql
spring.jpa.show-sql=true
#hibernate啓動的時候只做sql表的格式驗證
spring.jpa.hibernate.ddl-auto=validate
#打印debug級別的日誌,因爲默認情況下,spring boot從控制檯打印出來的日誌級別只有ERROR, WARN 還有INFO
logging.level.org.hibernate.SQL=debug


# session會話存儲類型
spring.session.store-type=hash_map


# 關閉HTTP基本驗證
security.basic.enabled=false

  修改application文件驗證項目啓動是否成功

 

 最後在控制檯找到項目目錄,輸入mvn:spring-boot run或者idea直接啓動,在瀏覽器輸入如下成功啓動。

對於啓動方式有很多種,下面簡單介紹下啓動方式。

  1、idea控制檯輸入:mvn spring-boot:run 啓動項目 

 

   2、使用idea快捷方式啓動,如下圖 添加屬性  clean package spring-boot:run -Dmaven.test.skip=true

 

  

3、集成單元測試及H2

  首先需要單元測試和h2數據庫的依賴,上面pom.xml文件已經提供了,這裏不做敘述。

  一般單元測試都是直接和mysql數據庫進行交互的,這裏使用h2數據庫,集成測試步驟如下:

  新建實體類和 JPARepository,以及測試類UserRepositoryTest 如下圖:

 對應代碼如下:

實體類user:

package com.houseSearch.entity;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * Created by 小劭.
 */
@Entity
@Table(name = "user")
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String password;

    private String email;

    //@Column用來標識實體類中屬性與數據表中字段的對應關係
    @Column(name = "phone_number")
    private String phoneNumber;

    private int status;

    @Column(name = "create_time")
    private Date createTime;

    @Column(name = "last_login_time")
    private Date lastLoginTime;

    @Column(name = "last_update_time")
    private Date lastUpdateTime;

    private String avatar;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Transient
    private List<GrantedAuthority> authorityList;

    public List<GrantedAuthority> getAuthorityList() {
        return authorityList;
    }

    public void setAuthorityList(List<GrantedAuthority> authorityList) {
        this.authorityList = authorityList;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.authorityList;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return name;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getLastLoginTime() {
        return lastLoginTime;
    }

    public void setLastLoginTime(Date lastLoginTime) {
        this.lastLoginTime = lastLoginTime;
    }

    public Date getLastUpdateTime() {
        return lastUpdateTime;
    }

    public void setLastUpdateTime(Date lastUpdateTime) {
        this.lastUpdateTime = lastUpdateTime;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
}

UserRepository:

package com.houseSearch.repository;


import com.houseSearch.entity.User;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;

/**
 * Created by 小劭.
 */
public interface UserRepository extends CrudRepository<User, Long> {

    User findByName(String userName);

    User findUserByPhoneNumber(String telephone);

    @Modifying
    @Query("update User as user set user.name = :name where id = :id")
    void updateUsername(@Param(value = "id") Long id, @Param(value = "name") String name);

    @Modifying
    @Query("update User as user set user.email = :email where id = :id")
    void updateEmail(@Param(value = "id") Long id, @Param(value = "email") String email);

    @Modifying
    @Query("update User as user set user.password = :password where id = :id")
    void updatePassword(@Param(value = "id") Long id, @Param(value = "password") String password);
}

 UserRepositoryTest: 

package com.houseSearch.entity;


import com.houseSearch.ApplicationTests;
import com.houseSearch.repository.UserRepository;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * Created by 小劭.
 */
public class UserRepositoryTest extends ApplicationTests {
    @Autowired
    private UserRepository userRepository;

    @Test
    public void testFindOne() {
        User user = userRepository.findOne(1L);
        Assert.assertEquals("小劭", user.getName());
    }
}

 

這裏測試類都是和mysql數據庫交互的,還未創建h2數據庫,下面新建h2數據庫和修改一些配置文件的信息。其中把和mysql交互的配置信息放在application-dev.properties文件中,然後在application.properties文件上面加上  spring.profiles.active=dev,表示激活application-dev.properties配置文件。測試用例 ApplicationTests文件加上 @ActiveProfiles("test"),表示測試用例走的是 application-test.properties配置文件。

如下圖

ApplicationTests配置文件如下:

package com.houseSearch;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@Configuration

//測試用例走的是 application-test.properties配置文件
@ActiveProfiles("test")
public class ApplicationTests {
    @Test
    public void test() {

    }
}

application.properties配置文件如下

#激活application-dev.properties配置文件
spring.profiles.active=dev

 #JPAConfig
#控制檯輸出sql
spring.jpa.show-sql=true
#hibernate啓動的時候只做sql表的格式驗證
spring.jpa.hibernate.ddl-auto=validate
#打印debug級別的日誌,因爲默認情況下,spring boot從控制檯打印出來的日誌級別只有ERROR, WARN 還有INFO
logging.level.org.hibernate.SQL=debug


# session會話存儲類型
spring.session.store-type=hash_map


# 關閉HTTP基本驗證
security.basic.enabled=false

application-dev.properties配置文件如下

# Mysql 注意替換相應配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/house?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root123

 application-test.properties配置文件如下

spring.datasource.driver-class-name=org.h2.Driver
# 內存模式
spring.datasource.url=jdbc:h2:mem:test

spring.datasource.schema=classpath:db/schema.sql
spring.datasource.data=classpath:db/data.sql

h2數據庫語句如下:

schema.sql

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` INT(11) NOT NULL IDENTITY PRIMARY KEY ,
  `name` VARCHAR(32) NOT NULL UNIQUE ,
  `password` VARCHAR(32) NOT NULL ,
  `email` VARCHAR(32) NOT NULL UNIQUE ,
  `phone_number` VARCHAR(15) NOT NULL UNIQUE ,
  `status` INT(2) NOT NULL ,
  `avatar` VARCHAR(255),
  `create_time` DATETIME NOT NULL DEFAULT NOW(),
  `last_login_time` DATETIME NOT NULL ,
  `last_update_time` DATETIME NOT NULL DEFAULT NOW()
);

DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `id` INT(11) NOT NULL IDENTITY PRIMARY KEY ,
  `user_id` INT(11) NOT NULL,
  `name` VARCHAR(32) NOT NULL,
  UNIQUE (`user_id`, `name`)
);

CREATE INDEX ON `role`(`user_id`);

DROP TABLE IF EXISTS `support_address`;
CREATE TABLE `support_address` (
  `id` int(11) NOT NULL IDENTITY,
  `belong_to` VARCHAR(32) NOT NULL,
  `en_name` varchar(32) NOT NULL,
  `cn_name` varchar(32) NOT NULL,
  `level` varchar(16) NOT NULL,
  `baidu_map_lng` DOUBLE NOT NULL ,
  `baidu_map_lat` DOUBLE NOT NULL ,
  PRIMARY KEY (`id`)
);

CREATE INDEX ON `support_address` (`belong_to`,`en_name`,`level`);

DROP TABLE IF EXISTS `house`;
CREATE TABLE `house` (
  `id` int(11)  NOT NULL IDENTITY COMMENT 'house唯一標識',
  `title` varchar(32) NOT NULL,
  `price` int(11) NOT NULL COMMENT '價格',
  `area` int(11) NOT NULL COMMENT '面積',
  `room` int(11) NOT NULL COMMENT '臥室數量',
  `floor` int(11) NOT NULL COMMENT '樓層',
  `total_floor` int(11) NOT NULL COMMENT '總樓層',
  `watch_times` int(11) DEFAULT '0' COMMENT '被看次數',
  `build_year` int(4) NOT NULL COMMENT '建立年限',
  `status` int(4) NOT NULL DEFAULT '0' COMMENT '房屋狀態 0-未審覈 1-審覈通過 2-已出租 3-邏輯刪除',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `last_update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `city_en_name` varchar(32) NOT NULL COMMENT '城市標記縮寫 如 北京bj',
  `region_en_name` varchar(32) NOT NULL COMMENT '區域標記縮寫 如 朝陽區cyq',
  `cover` varchar(32) DEFAULT NULL COMMENT '封面',
  `direction` int(11) NOT NULL COMMENT '朝向',
  `distance_to_subway` int(11) NOT NULL DEFAULT '-1' COMMENT '距地鐵距離 默認-1 附近無地鐵',
  `parlour` int(11) NOT NULL DEFAULT '0' COMMENT '客廳數量',
  `district` varchar(32) NOT NULL COMMENT '所在小區',
  `admin_id` int(11) NOT NULL COMMENT '所屬管理員id',
  `bathroom` int(11) NOT NULL DEFAULT '0' COMMENT '衛生間數量',
  `street` varchar(32) NOT NULL COMMENT '街道',
  PRIMARY KEY (`id`)
);

DROP TABLE IF EXISTS `house_detail`;
CREATE TABLE `house_detail` (
  `id` int(11) NOT NULL IDENTITY,
  `description` varchar(255) DEFAULT NULL COMMENT '詳細描述',
  `layout_desc` varchar(255) DEFAULT NULL COMMENT '戶型介紹',
  `traffic` varchar(255) DEFAULT NULL COMMENT '交通出行',
  `round_service` varchar(255) DEFAULT NULL COMMENT '周邊配套',
  `rent_way` int(2) NOT NULL COMMENT '租賃方式',
  `address` varchar(32) NOT NULL COMMENT '詳細地址 ',
  `subway_line_id` int(11) DEFAULT NULL COMMENT '附近地鐵線id',
  `subway_line_name` varchar(32) DEFAULT NULL COMMENT '附近地鐵線名稱',
  `subway_station_id` int(11) DEFAULT NULL COMMENT '地鐵站id',
  `subway_station_name` varchar(32) DEFAULT NULL COMMENT '地鐵站名',
  `house_id` int(11) NOT NULL COMMENT '對應house的id',
  PRIMARY KEY (`id`)
);

DROP TABLE IF EXISTS `house_tag`;
CREATE TABLE `house_tag` (
  `house_id` int(11) NOT NULL COMMENT '房屋id',
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '標籤id',
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`id`)
);

 data.sql

INSERT INTO `user`(`id`, `name`, `email`, `phone_number`, `password`, `status`, `last_login_time`) VALUES (1, '小劭',
'[email protected]', '13888888888', 'wali', 1, NOW());
INSERT INTO `user`(`id`, `name`, `email`, `phone_number`, `password`, `status`, `last_login_time`) VALUES (2, 'admin',
'[email protected]', '13999999999', '55b3d0936a3fb63168d57a6bda0ddbbf', 1, NOW());

INSERT INTO `role`(`id`, `user_id`, `name`) VALUES (1, 1, 'USER');
INSERT INTO `role`(`id`, `user_id`, `name`) VALUES (2, 2, 'USER');
INSERT INTO `role`(`id`, `user_id`, `name`) VALUES (3, 3, 'ADMIN');

-- address data
INSERT INTO `support_address`(`id`, `belong_to`, `en_name`, `cn_name`, `level`, `baidu_map_lng`, `baidu_map_lat`)
  VALUES ('4', 'bj', 'bj', '北京', 'city', '116.395645','39.929986'),
      ('5', 'sh', 'sh', '上海', 'city', '121.487899', '31.249162'),
      ('6', 'hb', 'sjz', '石家莊', 'city', '114.522082', '38.048958'),
      ('7', 'hb', 'ts', '唐山', 'city', '118.183451', '39.650531'),
      ('8', 'hb', 'hd', '邯鄲', 'city', '114.482694', '36.609308'),
      ('9', 'bj', 'dcq', '東城區', 'region', '116.42188470126446', '39.93857401298612'),
      ('10', 'bj', 'xcq', '西城區', 'region', '116.37319010401802', '39.93428014370851'),
      ('12', 'bj', 'hdq', '海淀區', 'region', '116.23967780102151', '40.03316204507791'),
      ('13', 'bj', 'cpq', '昌平區', 'region', '116.21645635689414', '40.2217235498323'),
      ('14', 'sh', 'ptq', '普陀區', 'region', '121.39844294374956', '31.263742929075534'),
      ('15', 'sjz', 'caq', '長安區', 'region', '114.59262155387033', '38.07687479578663'),
      ('16', 'sjz', 'qdq', '橋東區', 'region', '114.51078430496142', '38.06338975380927'),
      ('17', 'sjz', 'qxq', '橋西區', 'region', '114.43813995531943', '38.033364550068136'),
      ('18', 'sjz', 'xhq', '新華區', 'region', '114.4535014286928', '38.117218640478164'),
      ('19', 'bj', 'cyq', '朝陽區', 'region', '116.52169489108084', '39.95895316640668');

-- house data
INSERT INTO `house`(`id`, `title`, `price`, `area`, `room`, `floor`, `total_floor`, `watch_times`, `build_year`,
                    `status`, `create_time`, `last_update_time`, `city_en_name`, `region_en_name`, `cover`,
                    `direction`, `distance_to_subway`, `parlour`, `district`, `admin_id`, `bathroom`, `street`)
  VALUES ('15', '富力城 國貿CBD 時尚休閒 商務辦公 超棒瓦力', '6200', '70', '2', '10', '20', '2', '2005', '1', '2017-09-06 18:56:14', '2017-09-15 00:26:59', 'bj', 'hdq', 'FmD3zKG-gUPOrNv0HwzZN7IbkAC_', '2', '10', '1', '融澤嘉園', '2', '0', '龍域西二路'),
  ('16', '富力城 國貿CBD 時尚休閒 商務辦公', '6300', '70', '2', '10', '20', '0', '2012', '1', '2017-09-06 19:53:35', '2017-09-11 00:35:13', 'bj', 'hdq', 'FmD3zKG-gUPOrNv0HwzZN7IbkAC_', '1', '-1', '1', '融澤嘉園', '2', '0', '龍域西二路'),
  ('17', '二環東直門地鐵站附近、王府井、天安門、國貿、三里屯、南鑼鼓巷', '3000', '35', '1', '5', '10', '0', '2013', '1', '2017-09-06 20:45:35', '2017-09-11 00:35:05', 'bj', 'hdq', 'FhVdDhzVDH1dLVVx4jOaVXOCfnea', '1', '200', '0', '融澤嘉園', '2', '0', '龍域西二路'),
  ('18', '華貿城 東向一居挑空loft 乾淨溫馨 隨時可以簽約', '5700', '52', '1', '7', '20', '0', '2012', '1', '2017-09-06 21:01:02', '2017-09-11 00:35:01', 'bj', 'hdq', 'FsxiS6rOTpSg5pK7tv41e8Zpnn_c', '2', '1085', '1', '融澤嘉園', '2', '0', '龍域西二路'),
  ('19', '望春園板樓三居室 自住精裝 南北通透 採光好視野棒!', '9200', '132', '3', '6', '14', '0', '2005', '1', '2017-09-06 22:44:25', '2017-09-11 00:34:55', 'bj', 'hdq', 'Fl1lNikhmMIecbTn-JTsurxugtFU', '2', '1108', '2', '融澤嘉園', '2', '0', '龍域西二路'),
  ('20', '高大上的整租兩居室 業主誠意出租', '5400', '56', '2', '12', '20', '0', '2012', '1', '2017-09-06 23:39:50', '2017-09-11 00:34:21', 'bj', 'hdq', 'FtNl9uPM6p5PjEs8z2FnOuViNtOM', '2', '-1', '1', '融澤嘉園', '2', '0', '龍域西二路'),
  ('21', '新康園 正規三居室 精裝修 家電傢俱齊全', '1900', '18', '1', '13', '25', '0', '2012', '1', '2017-09-07 00:52:47', '2017-09-11 00:34:13', 'bj', 'hdq', 'Fn9sHC3Wx7qpYCmSxt-z8FZluf0Z', '3', '1302', '0', '融澤嘉園', '2', '0', '龍域西二路'),
  ('24', '湖光壹號望京華府183-387㎡闊景大宅', '50000', '288', '5', '1', '1', '0', '2015', '1', '2017-09-07 11:42:20', '2017-09-18 20:14:14', 'bj', 'hdq', 'FvVqU8LneZZ5xaLBAOM1KXR2Pz1X', '5', '200', '3', '融澤嘉園', '2', '0', '龍域西二路');

-- house_detail data
INSERT INTO `house_detail` VALUES ('21', '國貿CBD商務區,近SOHO現代城,富頓中心,富力城商業街區,樂成中心,潘家園古玩城,八王墳長途客運站,北京遊樂園,經由三環路可直達首都機場。附近有雙井橋南,雙井橋北,雙井橋東雙井橋西等30多條公交站牌!\n《天安門,故宮,王府井,三里屯,前門,天壇,北海,頤和園,雍和宮,奧林匹克公園,水立方,西單,歡樂谷,燕莎商城等》知名購物區及旅遊名勝古蹟,是您休閒旅遊及商務下榻的理想選擇', '房間採光良好,落地窗外景色宜人', '房子處於北京的CBD商務中心區國貿雙井!緊鄰雙井地鐵站,步行5分鐘即到!這離國貿、中央電視臺、潘家園、三里屯、團結湖、日壇使館區、兒研所、大郊亭都很近', '房子鬧中取靜,地理位置優越,交通方便,緊鄰呼家樓地鐵站和東大橋地鐵站;去機場可乘坐東直門機場快軌,非常方便。購物中心有雙井購物中心、國貿購物中心和僑福芳草地購物中心、三里屯購物中心等,遠道而來的朋友可盡覽都市璀璨!', '0', '二號院7號樓', '4', '10號線', '58', '雙井', '15'), ('22', '國貿CBD商務區,近SOHO現代城,富頓中心,富力城商業街區,樂成中心,潘家園古玩城,八王墳長途客運站,北京遊樂園,經由三環路可直達首都機場。附近有雙井橋南,雙井橋北,雙井橋東雙井橋西等30多條公交站牌!\n《天安門,故宮,王府井,三里屯,前門,天壇,北海,頤和園,雍和宮,奧林匹克公園,水立方,西單,歡樂谷,燕莎商城等》知名購物區及旅遊名勝古蹟,是您休閒旅遊及商務下榻的理想選擇!', '房間採光良好,落地窗外景色宜人', '房子處於北京的CBD商務中心區國貿雙井!緊鄰雙井地鐵站,步行5分鐘即到', '這離國貿、中央電視臺、潘家園、三里屯、團結湖、日壇使館區、兒研所、大郊亭都很近。房子鬧中取靜,地理位置優越,交通方便,緊鄰呼家樓地鐵站和東大橋地鐵站;去機場可乘坐東直門機場快軌,非常方便。購物中心有雙井購物中心、國貿購物中心和僑福芳草地購物中心、三里屯購物中心等,遠道而來的朋友可盡覽都市璀璨!', '0', '1號院1號樓', null, null, null, null, '16'), ('24', '我和我女盆友當房東已經一年了,也是超讚房東,希望能爲大家提供舒適的住所~ 房間的大門和房門都是密碼門,小區有保安24小時值班,非常安全方便。 通常入住時間是下午三點,提前來的同學可以先寄存行李和洗澡哦~\n\n', '房間非常漂亮,空間很大,鵝黃色的牆壁看起來非常舒服', '位置距離地鐵站不遠', '距故宮、天安門、王府井、三里屯、簋街、南鑼鼓巷等景點均可地鐵半小時內到達,交通便利~', '0', '1號院2號樓', '1', '13號線', '16', '東直門', '17'), ('25', '這個經紀人很懶,沒寫核心賣點', '此房是一居室的格局,上下兩層,面寬,房間亮堂,進門右手廚房,正前方是25平米的客廳,樓上是臥室,帶洗手間! 喧鬧和安靜隔開,適合居住', '小區距離地鐵13號線北苑站500米的距離,交通出行便利....', '小區樓下就是華貿天地娛樂街,保利電影院,眉州東坡,中信銀行,麥當勞等娛樂休閒設施齊全', '0', '1號院3號樓', '1', '13號線', '11', '北苑', '18'), ('26', '這個經紀人很懶,沒寫核心賣點', '此房爲望春園小區板樓南北通透戶型,主臥客廳朝南,次臥朝北,兩個客廳雙衛,居住很舒適。', '距離地鐵5號線立水橋南站630米,有464,465,966,081,621等多條公交線路,交通出行四通八達。', '小區旁有大型購物商場易事達,物美超市,豐寧蔬菜基地,航空總醫院、安貞醫院北苑分院,中國銀行、中國農業銀行、中國工商銀行、中國交通銀行、中國建設銀行、招商銀行分佈。小區旁有天奧健身房,還有立水橋公園..', '0', '6號院1號樓', '1', '13號線', '10', '立水橋', '19'), ('27', '高大上的整租兩居室 業主誠意出租\n1、客廳挑高、寬敞舒適、陽光充足 2、臥室搭配的很新穎,使用之高 3、廚房帶陽臺,讓您和家人有足夠的空間展現私家廚藝', '客廳挑高、寬敞舒適、陽光充足 2、臥室搭配的很新穎,使用之高 3、廚房帶陽臺,讓您和家人有足夠的空間展現私家廚藝', '近地鐵13號線東直門站', '社區環境好,環境優美,適宜居住,人文素質高,物業管理完善; 2、屬於低密度社區 ,適宜居住 3、小區的林密樹多,讓您感受花園一樣的家', '0', '1號院5號樓', '1', '13號線', '16', '東直門', '20'), ('28', '房子是正規三室一廳一廚一衛,裝修保持的不錯,家電傢俱都齊全。\n', '房子客廳朝北面積比較大,主臥西南朝向,次臥朝北,另一個次臥朝西,兩個次臥面積差不多大。', '小區出南門到8號線育新地鐵站614米,交通便利,小區500米範圍內有物美,三旗百匯,龍旗廣場等幾個比較大的商場,生活購物便利,出小區北門朝東952米是地鐵霍營站,是8號線和 13號線的換乘站,同時還有個S2線,通往懷來。(數據來源百度地圖)', '小區西邊300米就是物美超市和三旗百匯市場(日常百貨、糧油米麪、瓜果蔬菜、生鮮海貨等等,日常生活很便利,消費成本低),北邊200米是龍旗購物廣場和永輝超市(保利影院,KFC,麥當勞等,輕鬆滿足娛樂消費)。小區裏還有商店,飯店,家政等。', '0', '2號院1號樓', '1', '13號線', '9', '霍營', '21'), ('31', '懶死了 不謝', '戶型介紹', '交通出行', '周邊配套', '0', '3號院1號樓', '1', '13號線', '12', '望京西', '24'), ('32', '房屋描述-編輯', '戶型介紹', '交通出行', '周邊配套-編輯', '0', '3號院2單元1003', '1', '13號線', '8', '回龍觀', '25');

-- house tag data
INSERT INTO `house_tag` VALUES ('15', '18', '獨立陽臺'), ('15', '17', '空調'), ('16', '16', '光照充足'), ('17', '15', '隨時看房'), ('17', '14', '集體供暖'), ('18', '13', '精裝修'), ('19', '12', '獨立衛生間'), ('19', '11', '獨立陽臺'), ('21', '19', '光照充足'), ('21', '20', '獨立衛生間'), ('24', '10', '光照充足'), ('24', '3', '精裝修'), ('24', '8', '集體供暖'), ('25', '21', '獨立陽臺');

  

4、前端集成

   1、集成 Thymeleaf 及基本用法

   2、集成Bootstrap

   3、集成jQuery

  首先Thymeleaf相關的jar包,已經在pom.xml文件中配置好了,可以向上查看相關配置。新建一個類WebMvcConfig,配置視圖解析器、靜態資源加載、模板資源解析器、Thymeleaf標準方言解釋器。具體代碼如下:

package com.houseSearch.config;

import org.modelmapper.ModelMapper;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.thymeleaf.extras.springsecurity4.dialect.SpringSecurityDialect;
import org.thymeleaf.spring4.SpringTemplateEngine;
import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring4.view.ThymeleafViewResolver;

/**
 * Created by 小劭.
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
    @Value("${spring.thymeleaf.cache}")
    private boolean thymeleafCacheEnable = true;

    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    /**
     * 靜態資源加載配置
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

    /**
     * 模板資源解析器
     * @return
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.thymeleaf")
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
        templateResolver.setApplicationContext(this.applicationContext);
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setCacheable(thymeleafCacheEnable);
        return templateResolver;
    }

    /**
     * Thymeleaf標準方言解釋器
     */
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(templateResolver());
        // 支持Spring EL表達式
        templateEngine.setEnableSpringELCompiler(true);

        // 支持SpringSecurity方言
        SpringSecurityDialect securityDialect = new SpringSecurityDialect();
        templateEngine.addDialect(securityDialect);
        return templateEngine;
    }

    /**
     * 視圖解析器
     */
    @Bean
    public ThymeleafViewResolver viewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine(templateEngine());
        return viewResolver;
    }

    /**
     * Bean Util
     * @return
     */
    @Bean
    public ModelMapper modelMapper() {
        return new ModelMapper();
    }
}

  修改配置文件application.properties,添加 spring.thymeleaf.mode=HTML       spring.thymeleaf.suffix=.html     spring.thymeleaf.prefix=classpath:/templates/

,表示使用HTML模版以及默認展示的路徑;修改application-dev.properties文件,添加spring.thymeleaf.cache=false,表示禁用緩存,修改前端頁面實時生效。

  在正常的開發流程中,JavaWeb項目會先編譯,再執行。我修改代碼後臺代碼後,會再編譯,再執行。那麼這個過程可能是要花很多時間,所以這裏推薦springboot自帶的熱加載工具spring-boot-devtools,在pom.xml文件中添加如下配置。

        <!-- SpringBoot自帶熱加載開發工具 -->
     <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency>

  然後在idea中需要如下修改,才能使 SpringBoot自帶熱加載開發工具生效。步驟:IntelliJ IDEA ——》Preferences——》Build,Execution,Deployment——》compiler——》勾選上Build project automatically。如下圖。

 

 新建controller文件夾和  HomeController類,在resouces——》templates——新建index.html,截圖如下。

 

 

 

 

 

 最後啓動項目,打開瀏覽器輸入http://localhost:8080/index,項目成功啓動。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章