Springboot整合Mybatis-Plus
- 创建SpringBoot项目,我这里创建一个纯Springboot项目,JDK1.8,
mybatis
打错了,创建完才注意,意外意外
点击下一步,next
,boot版本使用2.6.4,点击Finish执行
-
创建完成之后点开pom.xml,这个结构不多说了,如果不理解的可以看看
maven
,么么<!-- 这个是创建boot带的依赖 --> <dependencies> <!-- boot依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
连接mybatis-plus需要导入依赖,
<!-- 连接驱动 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- mysql驱动 5.X和8X的驱动不一样,所以要注意自己数据库的版本,这个boot有父模块,你也可以通过<version>覆盖掉原有版本,我这里是 8.X的版本--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency> <!-- 需要使用mybatis-plus,所以这个依赖也不可少 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
-
要连接MySQL,那么最基本的账号密码啥的要配置,所以在resources下面会有一个
application.properties
,配置即可,如果要用yml
,也可以更换为yml
,这里使用properties
,账号密码驱动改成自己的spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true spring.datasource.username=root spring.datasource.password=123
-
启动boot项目,应该正常启动了,接下来对数据库进行基础CRUD,这里使用Test模板测试
-
数据库非常简单,就三个字段
User表:
id主键自增, username varchar(50) password varchar(50)
-
创建实体类
entity
包// 省略Getter,Setter,toString等方法...,因为主键自增,所以有参构造器创建一个username,password的方便后期插入使用 @TableName("user") //可以加上做一个标识,代表跟数据库user表映射 public class User { private static final long serialVersionUID = 1L; /** * 主键ID,主键自增后期插入不需要调整Id */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 登录账号 */ private String username; /** * 登录密码 */ private String password;
-
创建操作数据库的mapper接口,这里不用xml文件了,如果需要跟mybatis是一样的使用方式,我这里直接用plus封装好的方法进行操作,
mapper包
@Mapper public interface UserMapper extends BaseMapper<User> {}
ps:@Mapper注解
作用:指定要变成实现类的接口所在的包,然后包下面的所有接口在编译之后都会生成相应的实现类 添加位置:如果接口少那么可以直接打@Mapper注解,后期类似的接口肯定会很多,可以在Springboot启动类添加注解@MapperScan("包路径")即可
-
数据存储类,直接继承ServiceImpl即可,
basic包
@Component //交给IOC容器管理,方便后期注入 public class UserDatastore extends ServiceImpl<UserMapper, User> { }
-
万事俱备,只差东风,我这里因为是直接操作数据,所以没有controller层,直接使用service层即可,
service
包@Service public class UserService { @Autowired private UserDatastore userDatastore; /** * 通过ID查询用户信息 * @param id id * @return 返回用户信息 */ public User queryById(Integer id) { return userDatastore.getById(id); } /** * 通过ID删除用户信息 * @param id id * @return 返回删除结果 */ public boolean deleteById(Integer id) { return userDatastore.removeById(id); } /** * 插入信息 * @param username 插入账号 * @param password 插入密码 * @return 返回是否插入成功 */ public boolean insertUser(String username, String password) { return userDatastore.save(new User(username, password)); } /** * 修改信息 */ public boolean updateUser(Integer id,String username) { UpdateWrapper updateWrapper = new UpdateWrapper(); updateWrapper.eq("id",id); updateWrapper.set("username",username); return userDatastore.update(updateWrapper); }
-
测试类测试方法,直接自动生成,点到Generate,有一个Test,我就不一步一步截图了
-
-
生成之后把Service注入进来 代码如下
@SpringBootTest // 自己添加 class UserServiceTest { @Autowired // 自己添加 private UserService userService; @Test void queryById() { System.out.println(userService.queryById(3)); } @Test void deleteById() { System.out.println(userService.deleteById(3)); } @Test void insertUser() { userService.insertUser("loveYou-Mybatis-plus","123"); } @Test void updateUser() { userService.updateUser(1,"loveYou-Mybatis-plus"); } }
-
运行之后,整体效果还是很哇塞的,下面说说可能遇见的问题
-
运行之后发现
空指针异常
,通过debug得知注入Userservice为空,这种情况,原因是虽然通过@Service注解注入到IOC容器了,但是对于测试类来说是拿不到的,这个问题如果心细的在Spring就已经注意到了,我们需要借助到注解@RunWith(SpringRunner.class)
,其实在Springboot已经优化了,只是给大家做一个补充,SpringbootTest注解里面就已经解决了这个问题了,所以不是这里的原因报错的原因可能是因为用到了UserMapper接口,但是没有实现类,所以需要在UserMapper接口中添加@Mapper注解,这个注解的解释在创建UserMapper的时候已经给大家解释过,大家可以看看
-
运行后发现Id对照出现问题,如果细心的小伙伴可能已经发现,我这里插入的时候并没有插入Id,因为Id设置为主键自增,但是大家会报错就类似于插入的类型不对,所以需要在User实体类上加入
@TableId(value = "id", type = IdType.AUTO) private Integer id;
-
-
最后大家如果遇到问题,欢迎留言~