• Springcloud入门父工程创建&订单模块&支付模块开发


      开始学习springcloud,用到的主要是Spingboot+MabatisPlus + SpringdataJPA(这个是为了建表方便)。

    1.父工程创建

    1. 创建工程

    创建maven骨架,类型选择:maven-archetype-site,JDK版本选择1.8。

     2.设置文件编码、注解生效以及过滤的文件

    字符编码设置:

    注解允许:

     JDK编译选择8:

     选择过滤文件:(过滤掉不必要的文件)

     3. 父工程pom文件编写

    可以删除src目录,之后编写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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cn.qz.cloud</groupId>
        <artifactId>cloud</artifactId>
        <version>1.0-SNAPSHOT</version>
        <packaging>pom</packaging>
    
        <!-- 统一管理jar包版本 -->
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <junit.version>4.12</junit.version>
            <log4j.version>1.2.17</log4j.version>
            <lombok.version>1.16.18</lombok.version>
            <mybatispuls.spring.boot.version>2.3</mybatispuls.spring.boot.version>
            <jpa.version>2.3.1.RELEASE</jpa.version>
            <mysql.version>5.1.47</mysql.version>
            <druid.version>1.1.16</druid.version>
        </properties>
    
        <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
        <dependencyManagement>
            <dependencies>
                <!--spring boot 2.2.2-->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>2.2.2.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <!--spring cloud Hoxton.SR1-->
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Hoxton.SR1</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <!--spring cloud alibaba 2.1.0.RELEASE-->
                <dependency>
                    <groupId>com.alibaba.cloud</groupId>
                    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                    <version>2.1.0.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>${mysql.version}</version>
                </dependency>
                <dependency>
                    <groupId>com.alibaba</groupId>
                    <artifactId>druid</artifactId>
                    <version>${druid.version}</version>
                </dependency>
                <!-- spring-boot整合mybatis-plus -->
                <dependency>
                    <groupId>com.baomidou</groupId>
                    <artifactId>mybatis-plus-boot-starter</artifactId>
                    <version>${mybatispuls.spring.boot.version}</version>
                </dependency>
                <dependency>
                    <groupId>junit</groupId>
                    <artifactId>junit</artifactId>
                    <version>${junit.version}</version>
                </dependency>
                <dependency>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                    <version>${log4j.version}</version>
                </dependency>
                <!-- springdata jpa依赖 -->
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-data-jpa</artifactId>
                    <version>${jpa.version}</version>
                </dependency>
                <dependency>
                    <groupId>org.projectlombok</groupId>
                    <artifactId>lombok</artifactId>
                    <version>${lombok.version}</version>
                    <optional>true</optional>
                </dependency>
            </dependencies>
        </dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <fork>true</fork>
                        <addResources>true</addResources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>

    这里需要注意:

    (1)父工程的packagin是pom,用于父工程聚合。

    (2)dependencyManagement和dependencies的区别:

    dependencyManagement 通常用于项目最顶层的父pom文件。能让所有子项目引用一个依赖而不用显示的列出版本号。

    maven子项目如果写了版本号和scope会用自己的,如果没写,会沿着父子层向上走,直到找到拥有一个dependencyManagement元素的项目,然后使用此项目的version和scope。

    这样做的好处是版本便于管理,比如想要升级个jar包只需要在父类统一升级即可。

    另外,dependencyManagement只是声明依赖,不实现引入,因此子项目需要显示的声明所用的依赖。

    2. 支付模块构建

      支付模块使用8081端口。

    1.新建moudle

    选择父工程之后新建moudle,GroupId和Version采用继承的即可,如下:

    (1) 新建完成之后查看父pom.xml文件会多了modules配置并引入新建的moudle。

    (2)新的payment模块的pom文件只有artifactId,没有G和A,会采用父类的G和A。

    2.修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud</artifactId>
            <groupId>cn.qz.cloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-provider-payment8081</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- spring-boot整合mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!--mysql-connector-java-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!--jdbc-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <!-- springdata jpa依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    
    </project>

    3.修改application.yml

    server:
      port: 8081
    
    spring:
      application:
        name: cloud-payment-service
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
        driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
        url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
      jpa:
        showSql: true
        hibernate.ddlAuto: update
        database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
    
    mybatis-plus:
      mapperLocations: classpath:mapper/*.xml
      type-aliases-package: cn.qz.cloud.bean    # 所有Entity别名类所在包

    这里需要注意到mysql数据库建立对应的database。

    4. 编写启动类

    package cn.qz.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 22:24 2020/9/24
     */
    @SpringBootApplication
    public class PaymentMain8081 {
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8081.class, args);
        }
    }

    5.编写业务代码

    (0)一个简单的返回JSON的工具类

    package cn.qz.cloud.utils;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class JSONResultUtil<T> implements Serializable {
    
        private static final long serialVersionUID = 3637122497350396679L;
    
        private boolean success;
    
        private String code;
    
        private String msg;
    
        private T data;
    
        public static <T> JSONResultUtil<T> success() {
            return new JSONResultUtil<>(true, "200", "", null);
        }
    
        public static <T> JSONResultUtil<T> successWithData(T data) {
            return new JSONResultUtil<>(true, "200", "", data);
        }
    
        public static <T> JSONResultUtil<T> error(String codeOrMsg) {
            return errorWithData(codeOrMsg, null);
        }
    
        public static <T> JSONResultUtil<T> errorWithMsg(String errorCode, String msg) {
            return new JSONResultUtil<T>(false, errorCode, msg, null);
        }
    
        public static <T> JSONResultUtil<T> errorWithData(String codeOrMsg, T data) {
            return new JSONResultUtil<T>(false, codeOrMsg, codeOrMsg, data);
        }
    }

    (1)bean对象:

    package cn.qz.cloud.bean;
    
    import com.baomidou.mybatisplus.annotations.TableField;
    import com.baomidou.mybatisplus.annotations.TableId;
    import com.baomidou.mybatisplus.enums.IdType;
    import lombok.Getter;
    import lombok.Setter;
    import org.hibernate.annotations.Index;
    
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.MappedSuperclass;
    import java.util.Date;
    
    /**
     * 所有实体类中相同的部分(自增ID类型的)
     *
     * @author Administrator
     */
    @MappedSuperclass
    @Getter
    @Setter
    public abstract class AbstractSequenceEntity {
    
        private static final long serialVersionUID = -674790161451253326L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @TableId(type = IdType.AUTO) // 增加该注解,mybatis plus insert之后会给bean设上Id
        protected Long id;
    
        /**
         * 创建时间
         */
        @Index(name = "createtime")
        @TableField(update = "%s") // 增加该注解,MP修改的时候不会修改该值
        protected Date createtime;
    
        public AbstractSequenceEntity() {
            this.createtime = new Date();
        }
    }

    payment类:

    package cn.qz.cloud.bean;
    
    import lombok.EqualsAndHashCode;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    import javax.persistence.Entity;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 22:37 2020/9/24
     */
    @EqualsAndHashCode(callSuper = true)
    @ToString(callSuper = true)
    @Getter
    @Setter
    @Entity
    public class Payment extends AbstractSequenceEntity {
    
        private String serial;
    }

    (2)mapper-继承MP的BaseMapper

    package cn.qz.cloud.mapper;
    
    import cn.qz.cloud.bean.Payment;
    import com.baomidou.mybatisplus.mapper.BaseMapper;
    import org.apache.ibatis.annotations.Mapper;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 14:30 2020/9/25
     */
    @Mapper
    public interface PaymentMapper extends BaseMapper<Payment> {
    }

    (3)service

    接口继承MP的IService:

    package cn.qz.cloud.service;
    
    import cn.qz.cloud.bean.Payment;
    import com.baomidou.mybatisplus.service.IService;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 14:31 2020/9/25
     */
    public interface PaymentService extends IService<Payment>{
    }

    实现类继承MP的serviceImpl

    package cn.qz.cloud.service;
    
    import cn.qz.cloud.bean.Payment;
    import cn.qz.cloud.mapper.PaymentMapper;
    import com.baomidou.mybatisplus.service.impl.ServiceImpl;
    import org.springframework.stereotype.Service;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 14:31 2020/9/25
     */
    @Service
    public class PaymentServiceImpl extends ServiceImpl<PaymentMapper, Payment> implements PaymentService {
    }

    (4)controller

    抽象类:

    package cn.qz.cloud.controller;
    
    import cn.qz.cloud.utils.JSONResultUtil;
    import com.baomidou.mybatisplus.service.IService;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.*;
    
    import java.io.Serializable;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @param <T>
     * @param <E>
     */
    @RestController
    @Slf4j
    public abstract class AbstractController<T, E extends Serializable> {
    
        public abstract IService<T> getBaseService();
    
        @PostMapping("/save")
        public JSONResultUtil<Object> save(@RequestBody T bean) {
            boolean insert = getBaseService().insert(bean);
            if (insert) {
                return JSONResultUtil.successWithData(bean);
            }
    
            return JSONResultUtil.error("添加失败");
        }
    
        @PostMapping("/delete/{id}")
        public JSONResultUtil<Object> delete(@PathVariable() E id) {
            boolean result = getBaseService().deleteById(id);
            if (result) {
                return JSONResultUtil.success();
            }
    
            return JSONResultUtil.error("删除失败");
        }
    
        @GetMapping("/listAll")
        public JSONResultUtil<List<Map<String, Object>>> listAll() {
            List<Map<String, Object>> datas = getBaseService().selectMaps(null);
            return JSONResultUtil.successWithData(datas);
        }
    }

    PaymentController:

    package cn.qz.cloud.controller;
    
    import cn.qz.cloud.bean.Payment;
    import cn.qz.cloud.service.PaymentService;
    import com.baomidou.mybatisplus.service.IService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 14:49 2020/9/25
     */
    @RestController
    @RequestMapping("/pay")
    public class PaymentController extends AbstractController<Payment, Long> {
    
        @Autowired
        private PaymentService service;
    
        @Override
        public IService<Payment> getBaseService() {
            return service;
        }
    }

    6.启动后用postman测试 

    (1)测试创建:

    返回结果:

    {
      "success": true,
      "code": "200",
      "msg": "",
      "data": {
        "id": 2,
        "createtime": "2020-09-25T07:06:09.754+0000",
        "serial": "测试"
      }
    }

    (2)测试查询所有:

    3. 订单模块完成 

      步骤同上面的支付模块类似。使用80端口。主要使用RestTemplate调用支付模块。

    1.新建moudle

    (1) 新建完成之后查看父pom.xml文件会多一个moudle。

    (2)新的order模块的pom文件只有artifactId,没有G和A,会采用父类的G和A。

    2.修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud</artifactId>
            <groupId>cn.qz.cloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-consumer-order80</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!-- spring-boot整合mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!--mysql-connector-java-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
            <!--jdbc-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <!-- springdata jpa依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
    </project>

    3.修改application.yml

    server:
      port: 80

    4. 编写启动类

    package cn.qz.cloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * 启动类
     */
    @SpringBootApplication
    public class OrderConsumerMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderConsulMain80.class, args);
        }
    }

    5. 业务类

    (0)JSON工具类

    package cn.qz.cloud.utils;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.io.Serializable;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class JSONResultUtil<T> implements Serializable {
    
        private static final long serialVersionUID = 3637122497350396679L;
    
        private boolean success;
    
        private String code;
    
        private String msg;
    
        private T data;
    
        public static <T> JSONResultUtil<T> success() {
            return new JSONResultUtil<>(true, "200", "", null);
        }
    
        public static <T> JSONResultUtil<T> successWithData(T data) {
            return new JSONResultUtil<>(true, "200", "", data);
        }
    
        public static <T> JSONResultUtil<T> error(String codeOrMsg) {
            return errorWithData(codeOrMsg, null);
        }
    
        public static <T> JSONResultUtil<T> errorWithMsg(String errorCode, String msg) {
            return new JSONResultUtil<T>(false, errorCode, msg, null);
        }
    
        public static <T> JSONResultUtil<T> errorWithData(String codeOrMsg, T data) {
            return new JSONResultUtil<T>(false, codeOrMsg, codeOrMsg, data);
        }
    }

    (1)bean

    package cn.qz.cloud.bean;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import java.util.Date;
    
    @Getter
    @Setter
    public abstract class AbstractSequenceEntity {
    
        private static final long serialVersionUID = -674790161451253326L;
    
        protected Long id;
    
        protected Date createtime;
    
        public AbstractSequenceEntity() {
            this.createtime = new Date();
        }
    }

    Payment:

    package cn.qz.cloud.bean;
    
    import lombok.EqualsAndHashCode;
    import lombok.Getter;
    import lombok.Setter;
    import lombok.ToString;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 22:37 2020/9/24
     */
    @EqualsAndHashCode(callSuper = true)
    @ToString(callSuper = true)
    @Getter
    @Setter
    public class Payment extends AbstractSequenceEntity {
    
        private String serial;
    }

    (2)配置类:注入RestTemplate

    package cn.qz.cloud.config;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * 注入一个bean
     */
    @Configuration
    public class ApplicationContextConfig {
        @Bean
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }

    (3)Controller类

    package cn.qz.cloud.controller;
    
    import cn.qz.cloud.bean.Payment;
    import cn.qz.cloud.utils.JSONResultUtil;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.web.client.RestTemplate;
    
    import javax.annotation.Resource;
    import java.util.List;
    import java.util.Map;
    
    /**
     * @Author: qlq
     * @Description
     * @Date: 22:09 2020/9/25
     */
    @RestController
    @RequestMapping("/consumer")
    public class OrderController {
    
        private static final String PAYMENT_URL = "http://localhost:8081";
    
        @Resource
        private RestTemplate restTemplate;
    
        @PostMapping("/pay/save")
        public JSONResultUtil<Payment> save(@RequestBody Payment payment) {
            return restTemplate.postForObject(PAYMENT_URL + "/pay/save", payment, JSONResultUtil.class);
        }
    
        @GetMapping("/pay/listAll")
        public JSONResultUtil<List<Map<String, Object>>> listAll() {
            return restTemplate.getForObject(PAYMENT_URL + "/pay/listAll", JSONResultUtil.class);
        }
    }

      接下来测试即可。

    4. 工程重构

      发现上面两个工程有许多重复的地方,因此决定抽取公共模块。

    1.新建工程

     2. 修改pom.xml

      抽取了公共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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>cloud</artifactId>
            <groupId>cn.qz.cloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>cloud-api-commons</artifactId>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.1.0</version>
            </dependency>
        </dependencies>
    
    </project>

    3.抽取代码

      主要是抽取bean和抽取utils到新工程中。

     4. 发布工程

      执行 mvn clean install发布到本地仓库。

    5.修改支付模块和订单模块的pom,加入下面配置

            <!--引入自己抽取的工具包-->
            <dependency>
                <groupId>cn.qz.cloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>

      测试即可。

    补充:关于mapper层注解@Mapper、@Repository、@MapperScan的区别 

      @Mapper 是 Mybatis 的注解,和 Spring 没有关系, @Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。在 Spring 程序中,Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,实现数据库查询功能,所以我们需要在接口上添加 @Mapper 注解。

      @Repository 是 Spring 的注解,用于声明一个 Bean,需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中。

      @MapperScan是配置扫描Mapper包的配置,可以在启动类上添加该注解,自动扫描包路径下的所有接口,使用这种方法接口上不用添加任何注解。

      一个Mapper接口中,其注解满足如下规则:@Mapper 一定要有,否则 Mybatis 找不到 mapper。@Repository 可有可无,可以消去依赖注入的报错信息。@MapperScan 可以替代 @Mapper(配置了MapperScan不需要每个Mapper接口都写@Mapper注解)。

    补充:一个IDEA热部署的工具

       在settings/plugins搜索Jrebel。安装之后以Jrebel启动项目即可,改完某个类会热加载。

    补充:IDEA开启RunDashboard

    .idea文件夹下面workspace.xml搜索RunDashboard,之后加入:

      <option name="configurationTypes">
        <set>
          <option value="SpringBootApplicationConfigurationType" />
        </set>
      </option>

     最终的代码如下:

      <component name="RunDashboard">
        <option name="ruleStates">
          <list>
            <RuleState>
              <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
            </RuleState>
            <RuleState>
              <option name="name" value="StatusDashboardGroupingRule" />
            </RuleState>
          </list>
        </option>
        <option name="configurationTypes">
              <set>
                <option value="SpringBootApplicationConfigurationType" />
              </set>
        </option>    
      </component>
  • 相关阅读:
    python爬取动态网页数据,详解
    几行代码轻松搞定python的sqlite3的存取
    14、Iterator跟ListIterator的区别
    13、Java菜单条、菜单、菜单项
    12、借助Jacob实现Java打印报表(Excel、Word)
    11、借助POI实现Java生成并打印excel报表(2)
    10、借助POI实现Java生成并打印excel报表(1)
    9、JcomboBox下拉框事件监听
    8、单选按钮(JRadioButton)和复选框(JCheckBox)
    java swing 添加 jcheckbox复选框
  • 原文地址:https://www.cnblogs.com/qlqwjy/p/13727272.html
Copyright © 2020-2023  润新知