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
原文中提到的大致有以下几点:
-
此注解会生成equals(Object other) 和 hashCode()方法。
-
它默认使用非静态,非瞬态的属性
-
可通过参数exclude排除一些属性
-
可通过参数of指定仅使用哪些属性
-
它默认仅使用该类中定义的属性且不调用父类的方法
-
可通过callSuper=true解决上一点问题。让其生成的方法中调用父类的方法。
另:@Data相当于@Getter @Setter @RequiredArgsConstructor @ToString @EqualsAndHashCode这5个注解的合集。
通过官方文档,可以得知,当使用@Data注解时,则有了@EqualsAndHashCode注解,那么就会在此类中存在equals(Object other) 和 hashCode()方法,且不会使用父类的属性,这就导致了可能的问题。
比如,有多个类有相同的部分属性,把它们定义到父类中,恰好id(数据库主键)也在父类中,那么就会存在部分对象在比较时,它们并不相等,却因为lombok自动生成的equals(Object other) 和 hashCode()方法判定为相等,从而导致出错。
修复此问题的方法很简单:
-
使用@Getter @Setter @ToString代替@Data并且自定义equals(Object other) 和 hashCode()方法,比如有些类只需要判断主键id是否相等即足矣。
-
或者使用在使用@Data时同时加上@EqualsAndHashCode(callSuper=true)注解。
- @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>
参考资料: