SpringBoot02: 初涉2

一、导引

1、特点
  1. 化繁为简,简化配置
  2. 备受关注,是下一代框架
  3. 微服务的入门级微框架
2、打包
  • 空项目结构
    在这里插入图片描述

  • 打包项目 mvn clean package
    在这里插入图片描述
    打包完成会生成 target 目录。

  • 启动 java -jar xxx.jar

    上一步打包完成后,可直接在命令行进行启动。
    在这里插入图片描述

二、配置

1、properties方式

​ resources/application.properties

# 端口
server.port=8081
# 项目上下文路径
server.servlet.context-path=/luckymoney
2、YML方式

​ resources/application.yml

server:
  port: 800
  servlet:
    context-path: /luckymoney

# 单个配置
minMoney: 1
description: 最少${limit.minMoney}# 配置中可以使用配置

# 配置类
limit:
  minMoney: 1
  maxMoney: 9999
  description: 最少${limit.minMoney}元,最多${limit.maxMoney}
  • 单个配置注入
@Value("${minMoney}")    // 配置属性注入
private BigDecimal minMoney;

@Value("${description}")
private String description;
  • 配置类注入
@Component
@ConfigurationProperties(prefix = "limit")   // 自动注入 limit 项的所有数据
public class LimitConfig {
    private BigDecimal minMoney;
    private BigDecimal maxMoney;
    private String description;
    
    // get、set方法
}
  • 环境配置

    开发环境和生成环境的配置

  1. application.yml 环境选择
spring:
  profiles:
    active: dev
  1. application-dev.yml 开发环境
server:
  port: 800
  servlet:
    context-path: /luckymoney

limit:
  minMoney: 0.01
  maxMoney: 9999
  description: 最少${limit.minMoney}元,最多${limit.maxMoney}
  1. application-prod.yml 生产环境
server:
  port: 800

  servlet:
    context-path: /luckymoney

limit:
  minMoney: 1
  maxMoney: 9999
  description: 最少${limit.minMoney}元,最多${limit.maxMoney}
  1. 启动时选择环境

    也可在启动时选择配置文件

    java -jar -Dspring.profiles.active=prod target/luckymoney_xxx.jar

三、Controller的使用

1、请求
注解说明
@Controller处理http请求
@RestControllerSpring4之后新加的注解,原来返回 json需要@ResponseBody配合@Controller
@RequestMapping配置url映射
  1. @RestController = @Controller + @ResponseBody

  2. @GetMapping({"/hello", “hi”}) // get请求, 同时绑定多个地址

  3. @RequestMapping("/hello") // 同时支持get和post请求 ,可用在类上和方法上

  4. @PostMapping("/say") // post请求

2、参数获取
注解说明
@PathVariable获取url中的数据
@RequestParam获取请求参数的值
// 获取url上的数据
//  url形式: http://localhost:800/luckymoney/hello/says/100
public String says(@PathVariable("id") Integer id) {
        return "id: " + id;
}

// 获取url上键值对形式的数据  
// url形式: http://localhost:800/luckymoney/hello/sayss?id=100
// 同时也能获取 post 方式提交的参数
public String sayss(@RequestParam("id") Integer myid) {
        return "id: " + myid;
}

// url不提交参数时,赋予默认值
public String sayss(@RequestParam(value = "id", 
       required = false, defaultValue = "0") Integer myid) {  // id的默认为0
        return "id: " + myid;
}

四、数据库

1、JPA

JPA – Java Persistence APl 定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。

2、RESTful API设计
请求类型请求路径功能
GET/luckymoneys获取红包列表
POST/luckymoneys创建一个红包
GET/luckymoneys/id通过id查询红包
PUT/luckymoneys/id通过id更新红包
3、pom依赖
<!-- 添加 Jpa 和 mysql 的依赖  -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
4、yml配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/luckymoney?serverTimezone=GMT
    username: root
    password: 102
  jpa:
    hibernate:
      ddl-auto: create   # update
    show-sql: true       # 日志显示 sql执行语句
6、创建库、实体

​ 创建数据库,数据表在 ddl-auto 属性设置为 create 时,可根据实体类自动生成,注意在创建好后需要将 create 改为 update。

  • 实体类注解
@Entity          // 该类为实体类 
@DynamicUpdate   // 该注解启用自动更新, Mysql上设置的自动更新的字段
@Data            // lombok 自动补充 get/set方法,toString()方法
public class Girl {

    @Id
    // 注意:主键策略,否则引发异常:java.sql.SQLSyntaxErrorException: 
    // Table 'sell.hibernate_sequence' doesn't exist
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    // javax.validation 包下的字段校验注解
    @NotBlank(message = "这个字段必传")
    private String size;

    @Min(value = 18, message = "未成年禁止")
	//    @NotNull 
	//    @Max()
	//    @Length()
    private Integer age;

    @NotNull(message = "金额必传")
    private Double money;

    public Girl() { }
}
  • 启动后,自动创建数据表,注意后面要 改为 update .
    在这里插入图片描述
6、CUDR
  • 新建接口继承JpaRepository 获取配置好的操作方法
public interface LuckymoneyRepository 
    extends JpaRepository<Luckymoney, Integer> {
}
  • 控制层直接使用
@RestController
public class LuckymoneyController {
    @Autowired
    private LuckymoneyRepository repository;  // 注入查询资源库

    // 查询所有
    @GetMapping("/luckymoneys")
    public List<Luckymoney> list() {
        return repository.findAll();
    }

	// 保存单条数据
    @PostMapping("/luckymoneys")
    public Luckymoney create(@RequestParam("producer") String producer,
                             @RequestParam("money") BigDecimal money) {
        Luckymoney luckymoney = new Luckymoney();
        luckymoney.setProducer(producer);
        luckymoney.setMoney(money);
        return repository.save(luckymoney);
    }

    // 根据Id字段查询
    @GetMapping("/luckymoneys/{id}")
    public Luckymoney findById(@PathVariable("id") Integer id) {
        return repository.findById(id).orElse(null);  // Optional对象
    }

	// save时,如果传入主键则为更新
    @PutMapping("/luckymoneys/{id}")
    public Luckymoney update(@PathVariable("id") Integer id,
                             @RequestParam("consumer") String consumer) {
        // 要先查询再更新,否则为set的数据都会被更新为null
        Optional<Luckymoney> optional = repository.findById(id);
        if (optional.isPresent()) {
            Luckymoney luckymoney = optional.get();
            luckymoney.setId(id);
            luckymoney.setConsumer(consumer);
            // 依据主键更新数据
            return repository.save(luckymoney);
        }
        return null;
    }
}
  • JpaRepository 解析方法规则

    规则:find+全局修饰+By+实体的属性名称+限定词+连接词+ …(其它实体属性)+OrderBy+排序属性+排序方向

关键词: IsNull, IsNotNull, Like, NotLike, Containing, In, NotIn …
排序方向: Asc, Desc
连接词: And, Or,Between,LessThan,isNull …
如: findBySalaryLessThan(int max); findByUsernameLike(String user); …

7、mysql 时区出错
// 如下错误
java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one timezone.
....

安装mysql的时候时区设置的不正确 mysql默认的是美国的时区,而中国大陆要比他们迟8小时,采用+8:00格式

  • 解决

    在jdbc连接的url后面加上serverTimezone=GMT即可解决问题

url: jdbc:mysql://127.0.0.1:3306/luckymoney?serverTimezone=GMT

五、事务

​ 数据库事务,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

​ 注解实现事务(数据库提供支持)。

1、Service层
@Service
public class LuckymoneyService {

    @Autowired
    private LuckymoneyRepository repository;

    // 事务  指数据库的事务  (需要InnoDB的引擎支持)
    @Transactional
    public void createTwo() {
        // 两次插入数据要么都成功,要么都失败
        Luckymoney luckymoney1 = new Luckymoney();
        luckymoney1.setProducer("青雀");
        luckymoney1.setMoney(new BigDecimal("120"));
        repository.save(luckymoney1);

        Luckymoney luckymoney2 = new Luckymoney();
        luckymoney2.setProducer("青雀");
        luckymoney2.setMoney(new BigDecimal("1120"));
        repository.save(luckymoney2);
    }
}
2、Controller层
@Autowired
private LuckymoneyService service;

@PostMapping("/luckymoneys/two")
public void createTwo() {
    service.createTwo();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值