zoukankan      html  css  js  c++  java
  • SpringBoot02 Controller的使用、数据库操作、事物管理、修改banner

    1 Controller的使用

      特点:编程技巧和SpringMVC几乎完全一样

      注意:@RestController = @Controller + @ResponseBody

      注意:读取路径参数和请求参数是利用的不通的注解实现,其中请求参数是可以设定默认值的

    package cn.xinagxu.girl02.controller;
    
    import cn.xinagxu.girl02.entity.Student;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @Controller
    @ResponseBody
    public class HelloController {
    
        @Value("${character}")
        private String character;
        @Value("${age}")
        private Integer age;
        @Value("${content}")
        private String content;
    
        @Autowired
        private Student student;
    
        @RequestMapping(value = "/")
        public String hello() {
    //        return "Hello World!" + "性格:" + character + " 年龄:" + age + " 详细信息为:" + content;
            return student.toString();
        }
    
        /**
         * GET请求
         * @return
         */
        @GetMapping(value = "/param")
        public String param02() {
            return "测试GET请求,@GetMapping是GET请求的专属";
        }
    
        /**
         * POST请求
         * @return
         */
        @PostMapping(value = "/param")
        public String param03() {
            return "测试POST请求,@PostMapping是POST请求的专属";
        }
    
        /**
         * 获取GET请求路径中的参数
         * @param id
         * @return
         */
        @GetMapping(value = "/param/{id}")
        public String param04(@PathVariable("id") Integer id) {
            return "获取到的ID数据为:" + id;
        }
    
        /**
         * 获取GET请求路径的参数
         * @param id
         * @return
         */
        @GetMapping(value = "/{id}/param")
        public String param05(@PathVariable("id") Integer id) {
            return "获取到的ID数据为:" + id;
        }
    
        /**
         * 获取POST路径中的参数
         * @param id
         * @return
         */
        @PostMapping(value = "/param/{id}")
        public String param06(@PathVariable("id") Integer id) {
            return "从POST路径中获取到的ID数据为:" + id;
        }
    
    
        /**
         * 获取GET请求的请求参数(这种写法必须写上参数,参数可以为空)
         * @param id
         * @return
         */
        @GetMapping(value = "/requestParam")
        public String param07(@RequestParam("id") Integer id) {
            return "从GET请求中获取到的请求参数为:" + id;
    
        }
    
        /**
         * 获取GET请求参数(这种写法支持默认值)
         * @param id
         * @return
         */
        @GetMapping(value = "/requestParam/2")
        public String param08(@RequestParam(value = "id", required = false, defaultValue = "0") Integer id) {
            return "从GET请求中获取到的参数为(支持默认参数): " + id;
        }
    //    注意:POST请求的请求参数和GET请求的请求参数的获取方式完全一样,在这里就不在做演示
    
    
    
    }
    HelloController

    2 数据库操作

      2.1 前提准备

        安装好MySQL数据库

        在pom文件中引入MySQL的驱动包    

    <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
            </dependency>

        在pom文件中引入jpa

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

      2.2 创建一个实体类

        利用@Entity标注这个类是一个实体类

        利用@Id标注这个字段是主键

        利用@GeneratedValue标注这个字段是自增的

    package cn.xiangxu.cloud.springCloud01.entity;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import java.io.Serializable;
    
    /**
     * 学生实体类
     */
    @Entity
    public class Student {
        @Id
        @GeneratedValue
        private Integer id;
        private String name;
        private String address;
        private String subject;
        private String description;
    
        public String getDescription() {
            return description;
        }
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getSubject() {
            return subject;
        }
    
        public void setSubject(String subject) {
            this.subject = subject;
        }
    
        public Student() {
        }
    
        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 String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    View Code

        注意:实体的属性名不能和数据库的某些关键字冲突,如:不能用desc作为属性名

      3.3 创建一个与实体类对应的持久层接口

        该接口必须继承于JpaRepository,其中JpaRepository的第一个参数是对应的实体类名,第二个参数是对应的实体类标有@Id注解的那个属性

    package cn.xiangxu.cloud.springCloud01.repository;
    
    import cn.xiangxu.cloud.springCloud01.entity.Student;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    //public interface StudentRepository extends JpaRepository<Student, Integer> {
    //}
    public interface StudentRepository extends JpaRepository<Student, Integer> {
    
    }
    View Code

      3.4 数据库配置文件

        

    server:
      context-path: /student
      port: 8888
    
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/springboot
        username: dev
        password: 182838
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
    View Code

      3.4 测试一下

        完成上述步骤后就可以启动项目,如果在数据库中创建了一个与实体类名一直的表,就说明数据库环境搭建成功

        注意:如果实体类名采用的是驼峰命名法,那么创建的表明会将大写字母转化成下划线,但是首字母会转化成小写字母

      3.5 在控制层调用持久层

        注意:应该在服务层调用控制层,因为这里的例子太简单了,所以直接跳过服务层在控制层调用持久层

        

    package cn.xiangxu.cloud.springCloud01.controller;
    
    import cn.xiangxu.cloud.springCloud01.entity.Student;
    import cn.xiangxu.cloud.springCloud01.repository.StudentRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class StudentController {
        @Autowired
        private StudentRepository studentRepository;
    
        @GetMapping(value = "/{id}")
        public Student findById(@PathVariable("id") Integer id) {
            return studentRepository.findOne(id);
        }
    }
    View Code

      3.6 在控制层实现数据的增删改查

        注意:虽然我们在持久层接口中没有定义任何方法,但是我们的接口继承了JpaRepository,所以我们可以用持久层接口来依赖注入一个对象,从而用一些默认的方法来实现数据库操作,例如:save(持久层对象)    delete(主键字段)   findAll()  findOne(主键字段)  

        注意:save方法可以实现插入和修改操作

        注意:PUT请求时的特别设定

        注意:我采用的是postMan工具进行测试

        

    package cn.xiangxu.cloud.springCloud01.controller;
    
    import cn.xiangxu.cloud.springCloud01.entity.Student;
    import cn.xiangxu.cloud.springCloud01.repository.StudentRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.*;
    
    import java.util.List;
    
    @RestController
    public class StudentController {
        @Autowired
        private StudentRepository studentRepository;
    
        @PostMapping(value = "/insertOne")
        public Student inserOne(@RequestParam("name") String name,
                             @RequestParam("address") String address,
                             @RequestParam("subject") String subject,
                             @RequestParam("description") String description) {
    //        从前端获取到的数据应该先做一下三个检查
    //        检查变量类型
    //        检查变量长度
    //        检查变量格式
            Student student = new Student();
            student.setName(name);
            student.setAddress(address);
            student.setSubject(subject);
            student.setDescription(description);
    
            return studentRepository.save(student);
    
        }
    
    
        /**
         * 根据ID删除指定的记录
         * @param id
         */
        @DeleteMapping(value = "/deleteById/{id}")
        public void deleteById(@PathVariable("id") Integer id) {
            studentRepository.delete(id);
        }
    
        /**
         * 根据ID修改制定学生的信息
         * @param id
         * @param name
         * @param address
         * @param subject
         * @param description
         * @return
         */
        @PutMapping(value = "updateById/{id}")
        public Student updateById(@PathVariable("id") Integer id,
                               @RequestParam("name") String name,
                               @RequestParam(value = "address", required = false, defaultValue = "重庆市大足区") String address,
                               @RequestParam(value = "subject", required = false, defaultValue = "Java") String subject,
                               @RequestParam(value = "description", required = false, defaultValue = "大足是个好地方") String description) {
            Student student = new Student();
            student.setId(id);
            student.setName(name);
            student.setAddress(address);
            student.setSubject(subject);
            student.setDescription(description);
    
            return studentRepository.save(student);
        }
    //    注意:put请求时body中设定:x-www-form-urlencoded
    
        /**
         * 查询所有的学生信息
         * @return
         */
        @GetMapping(value = "/findAll")
        public List<Student> findAllStudent() {
            return studentRepository.findAll();
        }
    
        /**
         * 根据学生ID查询单个的学生信息
         * @param id
         * @return
         */
        @GetMapping(value = "/findById/{id}")
        public Student findById(@PathVariable("id") Integer id) {
            return studentRepository.findOne(id);
        }
    }
    View Code

      3.7 自定义查询函数

        字需要在持久层接口中定义好函数就行啦

        注意:函数的名字使用规则的,比如你要按照name字段查询,那么函数名就必须是findByName

          

      3.8 在除查询意外的操作都应该有事物管理

        只需在相应的方法前添加@Transactional注解就行啦

          

    源代码:点击前往

        

    4 修改banner

      4.1 在springboot项目的resources下创建一个banner.txt文件

      4.2 打开连接:点击前往

         

      4.3 将生成的字符复制到banner.txt中,重启项目即可

        

  • 相关阅读:
    关于STM32F405的GPIO中断问题
    No section matches selector
    碳元科技估计要炸
    FreeRTOS 时间片,外部中断,任务优先级的一个疑问
    STM32之HAL库、标准外设库、LL库
    suggest braces around empty body in an 'if' statement
    快速搭建Redis缓存数据库
    Docker Centos安装Openssh
    vmdk虚拟机转换为OVF模板,导入esxi
    Redis安装及主从配置
  • 原文地址:https://www.cnblogs.com/NeverCtrl-C/p/7690108.html
Copyright © 2011-2022 走看看