SpringBoot项目开发------配置SpringBoot

SpringBoot整合mybatis-plus

1 导入依赖

持久层需要的依赖
<!--    持久层-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

<!--        mybatius-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

<!--        处理实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>


<!--        配置数据库,使用 Spring Boot JDBC 驱动连接来连接数据库-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

2 编写Mapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lin.manage.pojo.User;
import org.springframework.stereotype.Component;

@Component
public interface UserMapper extends BaseMapper<User> {
}

@Component换成@Mapper也行

3 使用IService

3.1 编写Service接口继承IService

import com.baomidou.mybatisplus.extension.service.IService;
import com.lin.manage.pojo.User;

public interface UserService extends IService<User> {
}

3.2 编写实现类UserServiceImpl

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.lin.manage.mapper.UserMapper;
import com.lin.manage.pojo.User;
import com.lin.manage.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

3.3 编写controller层,进行测试

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lin.manage.pojo.User;
import com.lin.manage.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/getUserInfoById")
    public User getUserInfoById(Integer userId){
        QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
        userQueryWrapper.eq("id", userId);
        User user = userService.getOne(userQueryWrapper);
        System.out.println(user);
        return user;
    }
}

4 测试

在这里插入图片描述

5 问题处理

5.1 找不到BaseMapper

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userLoginServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.lin.manage.mapper.UserMapper' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

在SpringBoot启动类中加上

@MapperScan(basePackages = "com.lin.manage.mapper")

5.2 没有在application.properties配置文件中配置连接数据库

1 没有配置连接数据库的驱动,会报错
在这里插入图片描述

解决方法:在application.properties中加入
在这里插入图片描述

springBoot与vue-element-admin的整合

1 建立相关的类

在这里插入图片描述

1.1 GlobalCORSConfig类的配置

@Component
public class GlobalCORSConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("POST","GET")
                .allowCredentials(false)
                .maxAge(30);
    }
}

1.2 VoUserInfo类的配置

public class VoUserInfo {

    private List<String> roles;

    private String introduction;

    private String name;

    private String avatar;

    public List<String> getRoles() {
        return roles;
    }

    public void setRoles(List<String> rolesList) {
        this.roles = rolesList;
    }

    public String getIntroduction() {
        return introduction;
    }

    public void setIntroduction(String introduction) {
        this.introduction = introduction;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAvatar() {
        return avatar;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }
}

1.3 ResponseVo类的配置

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.HashMap;
import java.util.Map;

public class ResponseVo {
    private static Map map = new HashMap();
    private final static Integer successCode = 20000;//成功
    private final static Integer failCode = 50000;//失败

    /**
     * 成功时返回
     * @param dataObj Object 成功返回的数据对象
     * @return json字符串
     * */
    public static String success(Object dataObj){
        map.put("code",successCode);
        map.put("message","成功");
        map.put("data",dataObj);
        return jsonString(map);
    }
    /**
     * 失败时返回
     * @param message String 失败返回的提示信息
     * @return json字符串
     * */
    public static String error(String message){
        map.put("code",failCode);
        map.put("message",message);
        map.put("data",null);
        return jsonString(map);
    }

    /**
     * 自定义返回数据
     * @param code Integer 返回码
     * @param message String 返回的提示信息
     * @param dataObj Object 返回的提示信息
     * @return json字符串
     * */
    public static String customResult(Integer code,String message,Object dataObj){
        map.put("code",code);
        map.put("message",message);
        map.put("data",dataObj);
        return jsonString(map);
    }
        private static String jsonString(Object object){
        return JSON.toJSONString(object, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteDateUseDateFormat);
    }
}

1.4 User类

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User {

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String username;

    private String password;

    private Integer age;

}
  • @Data注解是lombok.jar包下的注解,该注解通常用在实体bean上,不需要写出set和get方法,但是具备实体bean所具备的方法,简化编程提高变成速度。注意:项目中一定要引入lombok.jar!!
    @Data相当于
    @Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。

  • @EqualsAndHashCode(callSuper = false) 注解
    官方文档:@EqualsAndHashCode

原文中提到的大致有以下几点:

  1. 此注解会生成equals(Object other) 和 hashCode()方法。

  2. 它默认使用非静态,非瞬态的属性

  3. 可通过参数exclude排除一些属性

  4. 可通过参数of指定仅使用哪些属性

  5. 它默认仅使用该类中定义的属性且不调用父类的方法

  6. 可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。

另:@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。

通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。

比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。

修复此问题的方法很简单:

  1. 使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。

  2. 或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。

参考链接:@EqualsAndHashCode()注解详解

  • @Accessors

Accessor的中文含义是存取器;它是在lombok插件下使用的,使用前需下载lombok插件。
包含的属性:

fluent(布尔型)、chain(布尔型)、prefix(String型)

作用域:

既可以注解在类上也可以注解在属性上

作用:

用来配置lombok如何产生和显示getter和setter的方法。
1:fluent(布尔型)

默认为false,当设置为true时,表示生成的setter和getter方法没有前缀set和get,且setter方法返回的是当前对象。具体效果如下:

@Data
@Accessors(fluent = true)
public class Person {
private int id;
private String name;

// 生成的getter和setter方法如下,方法体略
public int id() {}
public Person id(int id) {}

public String name() {}
public Person name(String name) {}

}
如代码中所示,生成的getter方法不是getId(){},而是id(){};setter方法不是void setId(){},而是Person id(int id){}

2:chain(布尔型)

默认为false(注:但是当fluent为true时,其默认为true),生成的setter方法是void类型;如果设置为true生成的setter方法返回this(当前对象)。

@Data
@Accessors(chain = true)
public class Person {
private int id;
private String name;

// 生成的setter方法如下,方法体略
public Person setId(int id) {}
public Person setName(String name) {}

}

//这里加个举例说明,按如下调用后 就将person对象的id设置成1,姓名设置成 “知其然”。
Person person=new Person();
person.setId(1).setName(“知其然”);
而且我们在进行属性赋值的时候,由于set方法返回的是当前对象,所以可以进行连续调用set方法进行赋值,如上述代码所示。一般我们在进行属性赋值的时候,由于set方法返回值是void类型,所以需分开赋值person.setId(1);person.setName(“知其然”);

但是当设置chain为true的时候,set方法返回的是当前对象,则在进行属性赋值则可以连续进行,如:person.setId(1).setName(“知其然”);

  • @TableId注解
    @TableId注解是专门用在主键上的注解,如果数据库中的主键字段名和实体中的属性名,不一样且不是驼峰之类的对应关系,可以在实体中表示主键的属性上加@Tableid注解,并指定@Tableid注解的value属性值为表中主键的字段名既可以对应上。

比如数据中的表中的字段是vote_id,但是实体类是voteId。那么就需要在voteId上打上这个注解。

/** 主键 */
    @TableId("vote_id")
    @TableId(value = "vote_id")
    private Long voteId;

数据库自增 AUTO
开发者无需赋值,自己根据当前表中id最大值自增+1
手动赋值的话还是使用数据库id中最大值+1 的方式赋予id

public class VoteInfo extends MybatisPlusBaseEntity {
	@TableId(type = IdType.AUTO)
    private Long voteId;
}

参考链接:
SpringBoot注解学习之@Accessors
@TableId注解详细介绍

2 项目需要导入的全部依赖:

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


        <!--    持久层-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

<!--        mybatius-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.2</version>
        </dependency>

<!--        处理实体类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>


<!--        配置数据库,使用 Spring Boot JDBC 驱动连接来连接数据库-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</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-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

<!--        返回类和Json数据-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.25</version>
        </dependency>
    </dependencies>

参考资料:

  1. 彻底解决Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedded datasource
  2. springboot - vue-element-admin 整合,修改原有的登录退出
  3. Springboot使用Mybatisplus:BaseMapper与IService
  4. Spring Boot - 数据库处理
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值