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对外接口就可以对数据库进行增删改查了