JDBC-springboot注解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: -

错误

Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the 'serverTimezone' configuration property) to use a more specific time zone value if you want to utilize time zone support.] with root cause


数据库问题

mysql8.0必须设置时区url

spring:

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true

username: root

password: wj


500但是添加成功了


注解

Config

springboot项目中的mvc配置大概有两种写法,一种是基于实现接口WebMvcConfigurer,一种是基于继承WebMvcConfigurationSupport,这两种写法会冲突,最终spring容器会执行继承WebMvcConfigurationSupport类中的重写方法,而忽略实现接口WebMvcConfigurer所重写的方法。

因此,一个应用中,应只选择一种方法进行配置。


@Configuration

@Bean

DAO

注意update,delete,insert不要返回对象(也返回不了,会报错),全返回int或者boolean

@mapper:在接口上添加了这个注解表示这个接口是基于注解实现的CRUD(增删改查)

@Repository:将数据访问层(Dao层)的类标识为Spring Bean(Bean是被实例的,组装的及被Spring容器管理的Java对象,Spring容器会自动完成@bean对象的实例化),创建应用对象之间的协作关系的行为称为:装配(wiring)这就是依赖注入的本质。

Results:返回的map结果集,property表示User类的字段,column表示对应数据库的字段

Param:sql条件的字段

@Mapper

@Repository

@Insert

@Select

@Delete

@Update

@Param("id")

id必须和SQL语句的id一致

Service

@Service

Controller

model.addAttribute("a","123");

向前端传数据,类似于request.setAttribute("a","123")

@RestController

添加位置:Controller类上

用thymeleaf时还是用@Controller使用

作用:相当于@Controller+@ResponseBody两个注解的结合,告诉容器Controller,返回json数据;不需要在方法前面加@ResponseBody注解了

但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面

@RequestMapping("/user")

添加请求前缀

@Autowired

自动注入组件

@resource

两种情况:

name属性有值

  1. 按照name值去spring容器找bean,找不到报错

name属性无值

  1. 先判断该属性名字在spring容器是否存在bean对象,不存在执行下一步
  2. 根据属性类型去spring容器找bean对象,找到一个就注入

区别:

  • @Autowired注解由Spring提供@resource注解由J2EE提供
  • @Autowired默认按类型进行装配,存在多个类型则通过名称注入,也可以配合@Qualifier中指定bean的名字来注入bean@Resource默认按照名称进行装配,如名称无法找到则通过类型注入。

RESTFUL风格请求---------------

@GetMapping("/get")

@PostMapping("/add")

@DeleteMapping("/del")

@PutMapping("/update")

获取JSON数据-----------------

@RequestBody

可以封装json数据为java对象

单个pojo对象

{

   "id" : 5,

   "name" : "wuliuqi",

}

@PostMapping("/saveUser")

   public User saveUser(@RequestBody User user) {

   return userService.saveUser(user);

}

@PostMapping("/saveUser")

@ResponseBody

public Map<String,Object> getJsonVal(@RequestBody Map<String,Object> user) {

   System.out.println("id = " + user.get("id"));

   System.out.println("name = " + user.get("name"));

   return user;

}

集合--多个pojo对象

[{"id": 1, "name": "小明"},{"id": 2, "name": "小红"}]

@PostMapping("/getJson")

@ResponseBody

public List<User> getJsonVal(@RequestBody List<User> users) throws IOException {

   for(User user : users){

       System.out.println("user = " + user);

   }

   return users;

}

@RequestParam

接受json对象

{

   "id": 1,

   "name": "小明"

};

@PostMapping("/getJson")

@ResponseBody

public User getJsonVal(@RequestParam("id") String id,@RequestParam("name") String name) {

   User user = new User();

   user.setId(Integer.parseInt(id));

   user.setName(name);

   return user;

}

@PathVariable

看图

@DeleteMapping("/delUser/{id}")

public Integer DELETE(@PathVariable Integer id){

   return userService.DELETE(id);

};

Entity

@Data

get和set方法

@AllArgsConstructor

有参

@NoArgsConstructor

无参

案例

注解开发

application.yml

spring:

 datasource:

   driver-class-name: com.mysql.cj.jdbc.Driver

   url: jdbc:mysql://localhost:3306/springboot?serverTimezone=UTC

   username: root

   password: 123456


User

package com.curd.entity;



import lombok.AllArgsConstructor;

import lombok.Data;

import lombok.NoArgsConstructor;


/**

* 注释

*

* @author ss

* @date 2022-09-06 15:27

*/

@Data

@AllArgsConstructor

@NoArgsConstructor

public class User {


   /**

    * 主键ID

    */

   private Long id;


   /**

    * 姓名

    */

   private String name;


   /**

    * 年龄

    */

   private Integer age;


   /**

    * 邮箱

    */

   private String email;

}


UserMapper

package com.curd.mapper;


import org.apache.ibatis.annotations.*;

import com.curd.entity.User;

import org.springframework.stereotype.Repository;


import java.util.List;


/**

* 注释 Mapper

*

* @author ss

* @date 2022-09-06 15:27

*/

@Mapper

@Repository

public interface UserMapper {


   /**

    * 添加信息

    * @param user

    * @return

    */

   @Insert("insert into user(id,name,age,email) values(#{id},#{name},#{age},#{email})")

   public User saveUser(User user);


   /**

    * 返回所有用户

    * @return

    */

   @Select("select * from user")

   public List<User> listUser();


   @Delete("delete from user where id = #{id}")

   public Integer DELETE(Integer id);


   @Update("update user set name = #{name},age = #{age},email = #{email} where id = #{id}")

   public User updateUser(User user);

}


UserService

package com.curd.service;



import com.curd.entity.User;


import java.util.List;


/**

*  服务类接口

*

* @author ss

* @date 2022-09-06 15:27

*/

public interface UserService {


   public User saveUser(User user);


   public List<User> listUser();


   public Integer DELETE(Integer id);


   public User updateUser(User user);


}


UserServiceImpl

package com.curd.service.serviceImpl;


import com.curd.entity.User;

import com.curd.mapper.UserMapper;

import com.curd.service.UserService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;


import java.util.List;


/**

*  服务实现类

*

* @author ss

* @date 2022-09-06 15:27

*/

@Service

public class UserServiceImpl implements UserService {


   //注入属性

   @Autowired

   UserMapper userMapper;


   @Override

   public User saveUser(User user) {

       return userMapper.saveUser(user);

   }


   @Override

   public List<User> listUser() {

       List<User> users = userMapper.listUser();

       return users;

   }


   @Override

   public Integer DELETE(Integer id) {

       Integer delete = userMapper.DELETE(id);

       return delete;

   }


   @Override

   public User updateUser(User user) {

       return userMapper.updateUser(user);

   }

}


UserController

package com.curd.controller;


import com.curd.entity.User;

import com.curd.service.serviceImpl.UserServiceImpl;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;


import java.util.List;


/**

*  前端控制器

*

* @author ss

* @date 2022-09-06 15:27

*/

@RestController

@RequestMapping("/user")

public class UserController {

   @Autowired

   UserServiceImpl userService;



   @PostMapping("/saveUser")

   public User saveUser(@RequestBody User user) {

       return userService.saveUser(user);

   }


   @GetMapping("/list")

   public List<User> listUser() {

       return userService.listUser();

   }


   @DeleteMapping("/delUser/{id}")

   public Integer DELETE(@PathVariable Integer id){

       return userService.DELETE(id);

   }


   @PutMapping("/updateUser")

   public User updateUser(@RequestBody User user){

       return userService.updateUser(user);

   }

}

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
20天前
|
XML 安全 Java
使用 Spring 的 @Aspect 和 @Pointcut 注解简化面向方面的编程 (AOP)
面向方面编程(AOP)通过分离横切关注点,如日志、安全和事务,提升代码模块化与可维护性。Spring 提供了对 AOP 的强大支持,核心注解 `@Aspect` 和 `@Pointcut` 使得定义切面与切入点变得简洁直观。`@Aspect` 标记切面类,集中处理通用逻辑;`@Pointcut` 则通过表达式定义通知的应用位置,提高代码可读性与复用性。二者结合,使开发者能清晰划分业务逻辑与辅助功能,简化维护并提升系统灵活性。Spring AOP 借助代理机制实现运行时织入,与 Spring 容器无缝集成,支持依赖注入与声明式配置,是构建清晰、高内聚应用的理想选择。
252 0
|
25天前
|
Java 测试技术 API
将 Spring 的 @Embedded 和 @Embeddable 注解与 JPA 结合使用的指南
Spring的@Embedded和@Embeddable注解简化了JPA中复杂对象的管理,允许将对象直接嵌入实体,减少冗余表与连接操作,提升数据库设计效率。本文详解其用法、优势及适用场景。
201 126
|
1月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
6天前
|
XML Java 数据格式
常用SpringBoot注解汇总与用法说明
这些注解的使用和组合是Spring Boot快速开发和微服务实现的基础,通过它们,可以有效地指导Spring容器进行类发现、自动装配、配置、代理和管理等核心功能。开发者应当根据项目实际需求,运用这些注解来优化代码结构和服务逻辑。
87 12
|
19天前
|
Java 测试技术 数据库
使用Spring的@Retryable注解进行自动重试
在现代软件开发中,容错性和弹性至关重要。Spring框架提供的`@Retryable`注解为处理瞬时故障提供了一种声明式、可配置的重试机制,使开发者能够以简洁的方式增强应用的自我恢复能力。本文深入解析了`@Retryable`的使用方法及其参数配置,并结合`@Recover`实现失败回退策略,帮助构建更健壮、可靠的应用程序。
使用Spring的@Retryable注解进行自动重试
|
19天前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
探索Spring Boot的@Conditional注解的上下文配置
|
19天前
|
智能设计 Java 测试技术
Spring中最大化@Lazy注解,实现资源高效利用
本文深入探讨了 Spring 框架中的 `@Lazy` 注解,介绍了其在资源管理和性能优化中的作用。通过延迟初始化 Bean,`@Lazy` 可显著提升应用启动速度,合理利用系统资源,并增强对 Bean 生命周期的控制。文章还分析了 `@Lazy` 的工作机制、使用场景、最佳实践以及常见陷阱与解决方案,帮助开发者更高效地构建可扩展、高性能的 Spring 应用程序。
Spring中最大化@Lazy注解,实现资源高效利用
|
20天前
|
安全 IDE Java
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
本文介绍了如何在 Spring 应用程序中使用 Project Lombok 的 `@Data` 和 `@FieldDefaults` 注解来减少样板代码,提升代码可读性和可维护性,并探讨了其适用场景与限制。
Spring 的@FieldDefaults和@Data:Lombok 注解以实现更简洁的代码
|
20天前
|
缓存 监控 安全
Spring Boot 的执行器注解:@Endpoint、@ReadOperation 等
Spring Boot Actuator 提供多种生产就绪功能,帮助开发者监控和管理应用。通过注解如 `@Endpoint`、`@ReadOperation` 等,可轻松创建自定义端点,实现健康检查、指标收集、环境信息查看等功能,提升应用的可观测性与可管理性。
Spring Boot 的执行器注解:@Endpoint、@ReadOperation 等