• 利用IDEA构建springboot应用--controller例子


    微服务

    微服务是一个新兴的软件架构,就是把一个大型的单个应用程序和服务拆分为数十个的支持微服务。一个微服务的策略可以让工作变得更为简便,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。

      

    第一个SpringBoot程序

    这里使用的开发软件是IntelliJ Idea,和Eclipse差不太多,界面更炫酷,功能更强大;Android Studio就是基于IntelliJ 开发的,我之前使用过Android Studio,它俩界面几乎一样。

    maven配置的中央仓库阿里云镜像

    setting.xml

    <mirrors>
        <mirror>
          <id>alimaven</id>
          <name>aliyun maven</name>
          <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
          <mirrorOf>central</mirrorOf>        
        </mirror>
      </mirrors>

    使用IDEA创建SpringBoot项目

    删除三个不必要的文件

    项目结构为:

    项目默认的 maven pom.xml文件

     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>com.newer</groupId>
        <artifactId>springboot</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>springboot</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    
    </project>

    运行SpirngbootdemoApplication的main方法,就能开始运行

    控制台输出: 

    "C:Program FilesJavajdk1.8.0_91injava" ....
    
      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v1.4.2.RELEASE)
     2016-12-16 14:56:52.083  INFO 15872 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
    2016-12-16 14:56:52.215  INFO 15872 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
    2016-12-16 14:56:52.255  INFO 15872 --- [           main] com.jxust.SpirngbootdemoApplication      : Started SpirngbootdemoApplication in 7.795 seconds (JVM running for 9.177)

    创建一个HelloController,位于controller包下

     

    HelloController.java

    @RestController
    public class HelloController {
    
        @RequestMapping("/hello")
        public String say(){
            return "Hello SpringBoot!";
        }
    }
    
    @RestController Spring4 之后新加的注解,原来返回json需要@ResponseBody配合@Controller,现在一个顶俩
    

    在浏览器中输入http://localhost:8080/hello就能输出Hello SpringBoot!这句话。  

    自定义属性配置

    用到的是application.properties这个文件

    配置端口号和访问前缀

    application.properties

    server.port=8086
    server.servlet.context-path=/springboot
    

    除了使用.properties格式的文件,还可以使用.yml格式的配置文件(推荐),更加简便 
    application.yml 

    把原来的application.properties文件删除 
    注意格式,空格不能少

    获取配置文件中的属性值

    我们也可以在配置文件中,配置数据,在 Controller 中获取,比如: 
    application.yml

     

    HelloController 获取配置文件中的值

    HelloController.java

    @RestController
    public class HelloController {
    
        @Value("${name}")
        private String name;
    
        @RequestMapping(value = "/hello" ,method = RequestMethod.GET)
        public String getName(){
            return name;
        }
    }
    

      

     返回的为name的值

    配置文件中值配置方式的多样化
    配置文件的值可以是多个,也可以是组合,如:

    application.yml

    name: 小胖
    age: 22

    或者

    application.yml

    name: 小胖
    age: 22
    content: "name: ${name},age: ${age}"

    或者

    application.yml

    server:
      port: 8081
      context-path: /springboot
    person:
      name: 小胖
      age: 22
    

    前两种配置获取值的方式都是一样的,但是对于这种方式,person 有相应的两个属性,需要这样处理

    PersonProperties.java

    package com.newer.springboot.dao;

    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;

    /**
    * @author:Mr.Tan
    * @Create:2018-10-26-17-07
    **/
    @Component//(把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)
    @ConfigurationProperties(prefix="person")
    public class PersonProperties {
    private String name;
    private Integer age;

    public String getName() {
    return name;
    }

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

    public Integer getAge() {
    return age;
    }

    public void setAge(Integer age) {
    this.age = age;
    }
    }
    @Component//(把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)

     

    Alt+insert快捷键提示生成 Getter and Setter

    pom.xml需要加入下面的依赖,处理警告

    <!--处理警告-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    

    HelloController.java  

     

    @RestController
    public class HelloController {
    
        @Autowired
        private PersonProperties personProperties;
    
    
        @RequestMapping(value = "/hello",method = RequestMethod.GET)
        public String say(){
            return personProperties.getName()+personProperties.getAge();
        }
    
    }
    

    关于配置文件application.yml的多套配置

    类似 il8n 文件国际化的配置方式i18n_en_US.properties和i18n_zh_CN.properties 
    这样能解决,需要频繁修改配置的尴尬
    

    application.yml配置文件决定使用那套配置文件。

    application.yml

    application-a.yml

     application-b.yml

    SpringBoot增删改查实例

    完整的项目结构

     

    Controller的使用

     

    @Controller 处理http请求
    
    @RestController Spring4 之后新加的注解,原来返回json需要@ResponseBody配合@Controller
    
    @RequestMapping 配置url映射
    

     对于 REST 风格的请求  

    对于 Controller 中的方法上的注解

    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    @RequestMapping(value = "/hello",method = RequestMethod.POST)
    @RequestMapping(value = "/hello",method = RequestMethod.DELETE)
    @RequestMapping(value = "/hello",method = RequestMethod.PUT)
    

    SpringBoot 对上面的注解进行了简化  

    @GetMapping(value = "/girls")
    @PostMapping(value = "/girls")
    @PutMapping(value = "/girls/{id}")
    @DeleteMapping(value = "/girls/{id}")
    

    浏览器需要发送不同方式的请求,可以采用postman  

      

    spring-data-jpa

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

    利用JPA创建MySQL数据库

    pom.xml加入JPAMySQL的依赖

     

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>
    

    配置JPA和数据库

    application.yml

     

    spring:
      profiles:
        active: a
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url:  jdbc:mysql://127.0.0.1:3306/test
        username:  root
        password:  password
    
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
    
    格式很重要 
    需要自己手动去创建 db_person 数据库  

    创建与数据表对应的实体类Person

    Person.java

    package com.newer.springboot.pojo;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    /**
     * @author:Mr.Tan
     * @Create:2018-10-27-04-05
     **/
    
    @Entity
    public class Person {
        @Id
        @GeneratedValue
        private  Integer id;
        private String name;
        private Integer age;
    
        //必须要有构造函数
        public Person() {
        }
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    

    运行项目后,查看数据库,会自动创建表 person  

     接下来就可以进行person表的增删改查了

    创建控制器PersonController.java

    首先创建一个接口PersonRepository,位于dao包下,PersonController调用该接口继承自JpaRepository的方法,来实现和数据库交互

     

    这个PersonRepository接口的功能,与SSM框架中 dao 层接口功能有异曲同工之妙;在SSM框架中,Service层通过该接口,间接执行Mybatis数据库映射文件(.xml)里的相应sql语句,执行数据库增删改查的操作。(Mapper自动实现DAO接口)
    

    PersonRepository.java  

    import com.newer.springboot.pojo.Person;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    
    /**
     * @author:Mr.Tan
     * @Create:2018-10-26-17-07
     **/
    public interface PersonProperties extends JpaRepository<Person, Integer> {
    
    }
    

     PersonController.java

    package com.newer.springboot.Controller;
    
    import com.newer.springboot.dao.PersonProperties;
    import com.newer.springboot.pojo.Person;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    /**
     * @author:Mr.Tan
     * @Create:2018-10-27-04-09
     **/
    @RestController
    public class PersonController {
    
        @Autowired
        private PersonProperties personProperties;
    
        @GetMapping("/person")
        private List<Person> personList(){
           return personProperties.findAll();
        }
    }
    

    在数据库中添加两条数据  

    启动项目执行请求http://localhost:8086/springboot/person

    其他增删改查的方法

    PersonController.java

    package com.newer.springboot.Controller;
    
    import com.newer.springboot.dao.PersonProperties;
    import com.newer.springboot.pojo.Person;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    /**
     * @author:Mr.Tan
     * @Create:2018-10-27-04-09
     **/
    @RestController
    public class PersonController {
    
        @Autowired
        private PersonProperties personProperties;
    
        @GetMapping("/person")
        private List<Person> personList(){
           return personProperties.findAll();
        }
    
       /*  
       新增一个人员*/
         
        @PostMapping(value = "/personadd")
        private  Person add(@RequestParam ("name")String name,@RequestParam("age")Integer age){
          Person person =new Person();
          person.setName(name);
          person.setAge(age);
          return personProperties.save(person);
        }
    
        /**
         * 根据id查找一个人员
         */
    
        @GetMapping(value = "/person/{id}")
        public Person personFindOne(@PathVariable("id") Integer id) {
            return personProperties.findById(id).get();
        }
    
        /**
         * 删除一个员工
         */
        @DeleteMapping(value = "/person/{id}")
        public  void deletep(@PathVariable("id") Integer id){
            personProperties.deleteById(id);
        }
    
        /**
         * 更新一个员工
         */
        @PutMapping(value = "/per/{id}")
        public Person put(@PathVariable("id") Integer id,
                          @RequestParam ("name") String name,
                          @RequestParam ("age") Integer age){
           Person person=new Person();
           person.setName(name);
           person.setAge(age);
          return  personProperties.save(person);
        }
    }



     获取所有人员

    增加一个人员

    根据id查找一个员工

     

    删除一个员工

    更新一个员工

    根据年龄查询

    Personpository增加一个方法findByAge(Integer age)

    public interface PersonProperties extends JpaRepository<Person, Integer> {
         //通过年龄来查询
        public List<Person>  findbyage( Integer age);
    }
    

    PersonController中加入相应的查询方法  

       /**
         * 根据年龄来查找
          * @param age
         * @return
         */
        @GetMapping(value = "/person/age/{age}")
        public List<Person>  personListByAge(@PathVariable("age") Integer age){
           return personProperties.findByage(age);
        }
    

      

    事务管理

    两条 sql 语句同时在一个方法中执行,为了防止一个 sql 语句执行成功而另一个 sql 语句执行失败,引入了事务管理,需要在方法上加 @Transactional事务注解

     PersonService.java

    package com.newer.springboot.service;
    
    import com.newer.springboot.dao.PersonProperties;
    import com.newer.springboot.pojo.Person;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import javax.transaction.Transactional;
    
    /**
     * @author:Mr.Tan
     * @Create:2018-10-27-23-04
     **/
    @Service
    public class PersonService {
        @Autowired
        private PersonProperties personProperties;
    
        /**
         * 事务管理测试
         * 两条数据同时成功,或者同时不成功
         * 保证数据库数据的完整性和一致性
         */
        @Transactional
        public void insertTwo(){
            Person personA = new Person();
            personA.setName("秋雅");
            personA.setAge(19);
            personProperties.save(personA);
    
            System.out.print(1/0);
    
            Person personB = new Person();
            personB.setName("梦特娇");
            personB.setAge(25);
            personProperties.save(personB);
    
        }
    }

    PersonController中测试

     ...
        @Autowired
        private PersonService personService;
        ...
         /**
         * 事务测试
         */
        @PostMapping("/person/two")
        public void personTwo(){
            personService.insertTwo();
        }

    重新运行项目,执行请求 post方式http://localhost:8081/springboot/person/two 
    数据库并没有添加第一条数据,说明存在事务管理

     

      

  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/tanlei-sxs/p/9855071.html
Copyright © 2020-2023  润新知