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

posted @ 2017-10-08 22:28  呼呼呼呼呼65  阅读(1098)  评论(3编辑  收藏  举报