当前位置: 首页 > news >正文

springboot中通过@Autowired依赖注入关联@RestControl@Service @Mapper @Data@TableName实现接口服务

springboot中通过@Autowired ,关联@RestControl @mapper @service @Data @Tablename @TableId @Reository 实现接口服务和数据库读写
1. 项目依赖 设置maven镜像:

<properties>
		<java.version>1.8</java.version>
		<mybatisplus-spring-boot-starter.version>1.0.5</mybatisplus-spring-boot-starter.version>
        <mybatisplus.version>2.3.1</mybatisplus.version>
        <poi.version>3.9</poi.version>
	</properties>
	<dependencies>

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

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<scope>runtime</scope>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<!-- 添加Servlet依赖模块 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
			<version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <!-- 添加JSTL标签库依赖模块 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
			<version>1.2</version>
        </dependency>

		 <!-- 使用JSP引擎,SpringBoot内置Tomcat没有此依赖 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
			<version>8.0.26</version>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.13</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>
         <!-- mybatis-plus begin -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatisplus-spring-boot-starter</artifactId>
            <version>${mybatisplus-spring-boot-starter.version}</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
            <version>${mybatisplus.version}</version>
        </dependency>
        <!-- mybatis-plus end -->

		 <!-- commons -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- log4j -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.10.0</version>
        </dependency>

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>

        <!-- 支付宝支付 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.33.10.ALL</version>
        </dependency>
        <!-- 微信支付 -->
        <dependency>
            <groupId>com.github.wechatpay-apiv3</groupId>
            <artifactId>wechatpay-apache-httpclient</artifactId>
            <version>0.4.8</version>
        </dependency>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-pay</artifactId>
            <version>4.3.8.B</version>
        </dependency>

		 <!-- hutool -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.5</version>
        </dependency>

        <!-- Redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!-- poi office -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>${poi.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${poi.version}</version>
        </dependency>

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>${poi.version}</version>
        </dependency>
	</dependencies>
	<repositories>
		<repository>
			<id>aliyun</id>
			<url>https://maven.aliyun.com/repository/public</url>
		</repository>
	</repositories>

2.创建实体类bean 并绑定到数据库,@Data 是自动生成get set tostring等方法的注解,@tablename 实体类写到数据库读取数据库输出时自动转为这个实体类,@tableid 绑定数据库主键,如果不绑定,每次insert(plan)后,这个plan对象的id不会被设置为数据库主键的值

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;

@Data
@TableName("plans")
public class Plan {
    @TableId(value = "id", type = IdType.AUTO)
    private long id;
    public int user_id;
    public String plan_name;
    public String plan_content;
    public int plan_time;
    public float plan_progress;
}

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;

@Data
@TableName("user_info")
public class UserInfo {
    @TableId(type = IdType.AUTO)
    public int id;
    public String name;
    public int age;
    public String email;
    public String phone;
    public String vip_end_time;
    public String password;
}

3.实现数据库操作的mapper @mapper注解表示这个类是mapper,继承basemapper 已经实现大部分的数据库常规增删改查,范型定位数据库对应的实体类,就是上面@tablename相互绑定

import java.util.List;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.example.demo.demo.entry.Plan;

@Mapper
public interface DemoMapper extends BaseMapper<Plan>{
    
    @Select("SELECT * FROM plans WHERE user_id = #{user_id}")
    public List<Plan> getPlanList(String user_id);

    @Delete("DELETE FROM plans WHERE id = #{plan_id}")
    public int deletePlanByPlanid(String plan_id);
}

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.example.demo.demo.entry.UserInfo;

@Mapper
public interface UserMapper extends BaseMapper<UserInfo>{
    @Select("SELECT * FROM user_info WHERE name = #{name}")
    UserInfo getUserInfoByName(String name);
}

4…创建service,实现control接口 @repository 标识成一个可使用@autowired引入的依赖,设置一个名字在需要引入的地方使用这个作为参数名即可

import com.example.demo.demo.entry.Plan;
import com.example.demo.demo.entry.UserInfo;
import com.example.demo.demo.response.Result;
public interface DemoService {
    Result getUserInfoByName(String name,String password);
    UserInfo addUser(UserInfo user);
    Result getPlan(String user_id);
    Result addPlan(Plan plan);
    Result deletePlan(String plan_id);
}

import java.util.List;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import com.example.demo.demo.dao.DemoMapper;
import com.example.demo.demo.dao.UserMapper;
import com.example.demo.demo.entry.Plan;
import com.example.demo.demo.entry.UserInfo;
import com.example.demo.demo.response.Result;
import com.example.demo.demo.response.ResultUtil;
import com.example.demo.demo.service.DemoService;

@Repository("demoService")
@Service
public class DemoServiceImpl implements DemoService {
    @Autowired
    UserMapper userMapper;
    @Autowired
    DemoMapper demoMapper;
    @Autowired
    Logger logger;

    @Override
    public Result getUserInfoByName(String name,String password) {
        UserInfo userInfoByName = userMapper.getUserInfoByName(name);
        logger.info("userInfoByName:" + userInfoByName);
         if (userInfoByName == null) {
            logger.info("用户不存在, 添加到用户表");
            UserInfo newUser = new UserInfo();
            newUser.setName(name);
            newUser.setPassword(password);
            userInfoByName = addUser(newUser);
            logger.info("添加用户结果" + userInfoByName);
            if (userInfoByName == null) {
                return ResultUtil.error("添加用户失败");
            } else {
                userInfoByName = userMapper.getUserInfoByName(name);
            }
        } else {
            logger.info("用户存在, 校验密码");
            if (userInfoByName.getPassword() != null && !userInfoByName.getPassword().equals(password)) {
                logger.info("密码错误");
                return ResultUtil.error("密码错误");
            } else {
                logger.info("密码正确");
            }
        }
       return ResultUtil.success(userInfoByName);
    }

    @Override
    public UserInfo addUser(UserInfo user) {
        Integer insert = userMapper.insert(user);
        logger.info("添加用户结果" + insert + user);
        if (insert == null || insert == 0) {
            return null;
        }
        return user;
    }

    @Override
    public Result addPlan(Plan plan) {
        Integer insert = demoMapper.insert(plan);
        logger.info("添加计划结果" + insert + plan.toString());
        if (insert == null || insert == 0) {
            return ResultUtil.error("添加计划失败");
        }
        return ResultUtil.success(plan);
    }

    @Override
    public Result deletePlan(String plan_id) {
        int delete = demoMapper.deletePlanByPlanid(plan_id);
        logger.info("删除计划结果" + delete);
        if (delete == 0) {
            return ResultUtil.error("删除计划失败");
        }
        return ResultUtil.success("删除计划成功");
    }

    @Override
    public Result getPlan(String user_id) {
        List<Plan> planList = demoMapper.getPlanList(user_id);
        logger.info("查询计划结果" + planList);
        return ResultUtil.success(planList);
    } 
}

5.restcontrol @restcontrol 标识为对外提供接口, @requestmapping(“api/”)映射http请求url路径,这里的api/ 会拼接到 applicaiton.yml里面server.servlet.context-path 路径的后面,注意/ 的重复,control中使用@autowired 注入 service,使用service方法返回接口数据,最好规范一下接口返回的数据结构

import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.demo.demo.entry.Plan;
import com.example.demo.demo.response.Result;
import com.example.demo.demo.response.ResultUtil;
import com.example.demo.demo.service.DemoService;

@RestController
@RequestMapping("api/")
public class DemoControl {
    @Autowired
    DemoService demoService;
    @Autowired
    Logger logger;

    @PostMapping("login")
    public Result login(@RequestBody Map<String,String> loginRequest) {
        logger.info("请求登录:" + loginRequest.toString());
        return demoService.getUserInfoByName(loginRequest.get("username"), loginRequest.get("password"));
    }

    @GetMapping("getPlan")
    public Result getPlan(String user_id) {
        logger.info("获取计划:" + user_id);
        return demoService.getPlan(user_id);
    }

    @PostMapping("addPlan")
    public Result addPlan(@RequestBody Plan plan) {
        logger.info("添加计划:" + plan.toString());
        return demoService.addPlan(plan);
    }

    @GetMapping("deletePlan")
    public Result deletePlan(String plan_id) {
        logger.info("删除计划:"+ plan_id);
        return demoService.deletePlan(plan_id);
    }

    @GetMapping("test")
    public Result testApi() {
        return ResultUtil.success("测试测试测试000111");
    }
}

附带result类:

import lombok.Data;
@Data
public class Result<T> {
    private Integer code;
    private String message;
    private T data;
}

public enum ResultEnum {
    ERROR(404, "error-----"),
    SUCCESS(200, "success-----"),
    ;
    private Integer code;
    private String message;
    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    public Integer getCode() {
        return code;
    }
    public String getMessage() {
        return message;
    }
}

public class ResultUtil {
    public static Result success(Object object) {
        Result result = new Result();
        result.setCode(ResultEnum.SUCCESS.getCode());
        result.setMessage(ResultEnum.SUCCESS.getMessage());
        result.setData(object);
        return result;
    }

    public static Result error(Object object) {
        Result result = new Result();
        result.setCode(ResultEnum.ERROR.getCode());
        result.setMessage(ResultEnum.ERROR.getMessage());
        result.setData(object);
        return result;
    }
}

logger全局配置:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LoggerConfig {
    @Bean
    public Logger logger() {
        return LogManager.getLogger(LoggerConfig.class);
    }
}

application.yml配置:

spring:
  application:
    name: demo
  datasource:
    url: jdbc:mysql://localhost:3306/my_database
    username: root
    password:
    driver-class-name: com.mysql.cj.jdbc.Driver
server:
  port: 8083
  servlet: 
    context-path: /

总结: 以control为起点,
1.@restcontrol标记control类,使用@autowired注入service, 字段名使用servicename更优
2.@service标记service类,@repository(“servicename”)标记注入时的字段名称,使用@autowired注入mapper,
3.@mapper标记mapper类,继承basemapper,范型T只想实体bean类
4.@data标记实体bean,@tablename绑定数据库表,@tableid绑定主键的更新
至此一个control对外接口就可以对数据库进行增删改查了

相关文章:

  • React - 组件之props属性
  • 《Python 中 JSON 的魔法秘籍:从入门到精通的进阶指南》
  • vue中使用lodash的debounce(防抖函数)
  • spring boot和spring cloud的关系
  • Django 操作表中的数据(增删改查)
  • 用python写一个聊天室程序
  • 【二分搜索 C/C++】洛谷P1024 一元三次方程求解
  • 【deepseek 部署中的常见问题及解决方案--亲测有效】
  • 机器视觉中的3d和2d的区别
  • Unity实现UI拖拽
  • 《深度LSTM vs 普通LSTM:训练与效果的深度剖析》
  • 在 UniApp 中封装并连接 WebSocket 及重连机制实现
  • AcWing 798. 差分矩阵
  • 华为小艺支持DeepSeek
  • Python教学-最常用的标准库之一——OS库
  • golang基础库
  • 【SpringBoot苍穹外卖】debugDay03.5
  • Java 设计模式之备忘录模式
  • 2.11学习
  • Unity 命令行设置运行在指定的显卡上
  • 第一集丨《亲爱的仇敌》和《姜颂》,都有耐人寻味的“她”
  • 美国再工业化进程需要中国的产业支持
  • 印度外交秘书:印巴军方将于12日再次对话
  • 庆祝上海总工会成立100周年暨市模范集体劳动模范和先进工作者表彰大会举行,陈吉宁寄予这些期待
  • 方正证券总裁何亚刚到龄退休,54岁副总裁姜志军接棒
  • 理财经理泄露客户信息案进展:湖南省检受理申诉,证监会交由地方监管局办理