• SpringBoot初体验


    1.elipse中创建Springboot项目并启动

    具体创建步骤请参考:Eclipse中创建新的Spring Boot项目

    2.项目的属性配置

    a.首先我们在项目的resources目录下application.yml中添加以下内容:

    server:
      port: 8080
      #set a prefix on our URLRequestMapping
      #context-path: /boot
    
    str1: hello
    str2: world
    content: "str1: ${str1}, str2:${str2}"
    gril: 
      name: Hanmeimei
      age: 21
    boy: 
      name: Lilei
      age: 22

    谈谈数据绑定

    b.@Value,我们在我们创建的Controller中加入

    @ComponentScan(basePackages="com.huhu")
    @RestController
    public class HelloController {
        
        @Value("${str1}")
        private String str1;
        @Value("${str2}")
        private String str2;
        @Value("${content}")
        private String content; 
        
        
        @RequestMapping(value ="/hello",method=RequestMethod.GET)
        public String say() {
            
            return str1+" "+str2+" "+content;
        }
    }

    启动结果:

    c.@Component和@ConfigurationProperties的结合使用创建bean

    boy.java

    //把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
    @Component
    @ConfigurationProperties(prefix="boy")
    public class Boy {
     
        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;
        }
        
    }

    gril.java

    //把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
    @Component
    //实现该类的属性与application.yml中的以gril为前缀的数据匹配
    @ConfigurationProperties(prefix="gril")
    public class Gril {
     
        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;
        }
        
        
        
    }

    HelloController.java

    @ComponentScan(basePackages="com.huhu")
    @RestController
    public class HelloController {
        
        @Autowired
        private Gril gril;
        
        @Autowired
        private Boy boy;
        
        @RequestMapping(value ="/hello",method=RequestMethod.GET)
        public String say() {
            
            
            return gril.getName()+" "+boy.getName();
        }
    }

    启动结果:

    这里有一个问题,为什么它们都能把我们application.yml我们设置属性怎么就显示到网页上了?

    原因:当你没有声明ViewResolver时,spring会给你注册一个默认的ViewResolver,其是JstlView的实例。

    d.改变ViewResolver

    首先我们在pom.xml中添加依赖:

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

    然后在resources/templates/中添加huhu.xml

    <!DOCTYPE html>
    <html>
    <head>
    <title>Insert title here</title>
    </head>
    <body>
    <h1>hello SpringBoot!</h1>
    </body>
    </html>

    改变HelloController.java

    @ComponentScan(basePackages="com.huhu")
    @Controller
    public class HelloController {
    
        
        @RequestMapping(value ="/hello",method=RequestMethod.GET)
        public String say() {
            
            return "huhu";
        }
    }

    启动结果:

    细心的你是否发现了我上面用的是@Controller,上面都用的是@RestController,我们来看一下区别吧,官方文档里这样说:@RestController is a stereotype annotation that combines @ResponseBody and @Controller.很显然它包括了@ResponseBody and @Controller,上面我们改变了ViewResolver,当然要用@Controller了,json,xml也是类似的做法。

    你也可以把上面的HelloController.java改成:

    @ComponentScan(basePackages="com.huhu")
    @RestController
    public class HelloController {
    @RequestMapping(value ="/hello",method=RequestMethod.GET)
    public String say() {
    return "huhu";
    }
    }

    启动结果:

    3.SpringBoot杂谈

    a.SpringBoot的三种启动

    1.elipse或者idea一键启动
    2.mvn spring-boot:run
    3.mvn install    cd /target   java -jar ***.jar
    既然可以有多种启动方法,我们可不可以启动两个,满足我们线上和线下的开发需求呢?答案是可以:
    b.分环境启动SpringBoot
    先设置我们resources中application.yml,我们复制两个,分别起名为
    application-dev.yml
    server:
      port: 8081
      #set a prefix on our URLRequestMapping
      #context-path: /boot
    
    str1: hello
    str2: world
    content: "str1: ${str1}, str2:${str2}"
    gril: 
      name: Hanmeimei
      age: 21
    boy: 
      name: Lilei
      age: 22

    application-pro.yml

    server:
      port: 8080
      #set a prefix on our URLRequestMapping
      #context-path: /boot
    
    str1: hello
    str2: world
    content: "str1: ${str1}, str2:${str2}"
    gril: 
      name: Hanmeimei
      age: 21
    boy: 
      name: Lilei
      age: 22

    修改application.yml

    spring:
      profiles:
        active: dev

    我们分别启动,一个用elipse,一个用第三种方法cmd

    启动结果:

    有人会说,这无非就是开启了两个不同端口的tomcat么?这能做什么啊?

    对的,我想到了可以用它配合nginx做负载均衡啊,大家可以看看这个:Nginx+Tomcat 实现负载均衡(Windows单机测试),是不是SpringBoot让一些东西变简单了。

     4.Spring操作mysql数据库

     a.pom.xml引入两个依赖

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

    b.在application.yml中写入配置

      datasource:
        driver-class-name: com.mysql.jdbc.Driver 
        url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false
        username: root
        password: taizi1203
        
      jpa:
        hibernate:
          ddl-auto: create
        show-sql: true

    c.创建你要在数据库中写的表的Bean

    Dril.java

    //数据持久化
    @Entity
    public class Dril {
        
        @Id
        @GeneratedValue
        private Integer id;
        
        private String name;
        
        private Integer age;
    
        public Dril() {
    
        }
    
        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;
        }
        
        
        
    }

    d.启动结果:

    当看到这个,代表你成功了,数据库中已经生成这个表。看到其他,请核对前面的配置

    箭头所指的体现了我们在application.yml中的,如果是create,每次都会删掉原来的表,update只会更新,其他自己看。

     e.编写Controller和DrilService

    DrilController.java

    @RestController
    public class DrilController {
        
        @Autowired
        private DrilService drilService;
        
        @RequestMapping(value="/dril",method=RequestMethod.GET)
        public List<Dril> getDrils(){
            
            List<Dril> drils =drilService.findAll();
            return drils;
        }
    
    }

    DrilService.java

    //第一个参数是我们要返回的对象,第二个是ID extends Serializable,即我们在生成数据库的时候指定的Id的类型
    public interface DrilService extends JpaRepository<Dril,Integer>{
    
    }

    f.启动结果

    有FE助手的出现json

    IE结果图:

    纳闷了,页面返回的数据怎么json了,看了一下IE中的结果,还好没有说错(spring默认注册ViewResolver是JstlView)。其他操作,我就不具体做了。

     JPA好像为我们做了好多事,但是他的方法才有几个,总有点他不能干的的,如我们不通过ID来的操作数据库,这时候我们扩展一下他:

    DrilJPA.java

    public interface DrilJPA extends JpaRepository<Dril,Integer>{
        
        //通过name来查询数据库,findByXxxx不能乱写
        public List<Dril> findByName(String name);
    }

    添加Controller:

    @RequestMapping(value="/drils/{name}",method=RequestMethod.GET)
        public List<Dril> getDrilName(@PathVariable("name")String name){
            
            List<Dril> drils =drilService.findByName(name);
            return drils;
        }

    启动结果:

    5.事务管理

    事务:一系列操作,要么全部成功,要么全部不成功。Spring事务管理,大家参考:Spring事务管理

     DrilService.java

     
    @Service
    public class DrilService {
        
        @Autowired
        private DrilJPA drilJPA;
        
        public void addTwo(){
            Dril dril1=new Dril();
            dril1.setId(3);
            dril1.setAge(20);
            dril1.setName("xiaosan");
            drilJPA.save(dril1);
            
            Dril dril2=new Dril();
            dril1.setId(4);
            dril1.setAge(24);
            dril1.setName("xiaosi");
            drilJPA.save(dril2);
        }
        
    }

    添加Controller

        @Autowired
        private DrilService drilService2;
    
        @RequestMapping(value="/drils/addTwo",method=RequestMethod.GET)
        public void getDrilName(){
            
            drilService2.addTwo();;
        }

      如果运行结果成这样,这是事务管理不想看到的,xiaosi跑路了?

    SpringBoot有个解决办法:

    给Service层方法上添加@Transactional就可以解决。

        @Transactional
        public void addTwo(){
            Dril dril1=new Dril();
            dril1.setId(3);
            dril1.setAge(20);
            dril1.setName("xiaosan");
            drilJPA.save(dril1);
            
            Dril dril2=new Dril();
            dril1.setId(4);
            dril1.setAge(24);
            dril1.setName("xiaosi");
            drilJPA.save(dril2);
        }

    好了,就分享到这里吧,后面还会更新。

    谢谢大家的阅读,博客不易,请转载注明地址:http://www.cnblogs.com/huhu1203/p/7638054.html

  • 相关阅读:
    win7连接l2tp报错789“L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误”
    Django内置Admin
    python-django(day19)
    常用模块-day06
    生成器、内置函数、模块与包的使用、正则表达式-day05
    Python 函数对象、 名称空间与作用域、闭包、装饰器、迭代器
    python字符编码、文件处理、函数
    2018-06-19——考试周肝完的我又回来了
    2018-06-11——pthyon类型整理
    2018-06-10——python基础整理
  • 原文地址:https://www.cnblogs.com/huhu1203/p/7638054.html
Copyright © 2020-2023  润新知