ssss什么是MyBatis-Plus?MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。(建议安装 MybatisX 插件)
ssssmybatis plus 官网:https://baomidou.com/
ssss引入插件:MybatisX,自动映射mapper的跳转,
快速入门(对应官网指南的快速入门)
ssss①、引入 mybatis-plus-boot-starter 依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
sdsddsdsdsdss
sss【注】:mybatis-plus-boot-starter帮我们引入了mybatis-spring-boot-starter和spring-boot-starterdata-jdbc两个场景,因此我们不需要单独引入这两个场景了
ssss②、添加 Druid 数据源
sdsdsssⅠ. 引入druid-starter
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
sdsdsssⅡ. 在SpringBoot配置文件中尽行配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
ssss③、在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:
@MapperScan("com.njupt.boot.mapper")
@SpringBootApplication
public class Boot07MybatisPlusApplication {
public static void main(String[] args) {
SpringApplication.run(Boot07MybatisPlusApplication.class, args);
}
}
测试模拟
ssss①、数据库中创建表
sdsdsdsdsdsdsssss
ssss②、编写实体类 User1.java
@Controller
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User1 {
/**
* 默认类中的所有属性都应该在数据库中
* 如果不存在需要用注解进行标注
*/
@TableField(exist = false)
private String userName;
@TableField(exist = false)
private String password;
// 以下是数据库的字段
private Long id;
private String name;
private Integer age;
private String email;
}
sss【注 】:实体类名必须要和要操作的表名一致,如果表名改变,需要使用 @TableName 注解其类对应的表。
ssss②、编写实体类 User1.java
/**
* 只需要我们的Mapper继承 BaseMapper 就可以拥有crud能力
*/
@Mapper
public interface UserMapper extends BaseMapper<User1> {
}
sdsdsdsdsdsdsdsdss
ssss③、测试:
@Slf4j
@SpringBootTest
class Boot05WebAdminApplicationTests {
@Autowired
UserMapper userMapper;
@Test
void testUserMapper(){
User1 user1 = userMapper.selectById(1L);
log.info("用户信息,{}",user1);
}
}
自动配置分析
sss
ssss①、MybatisPlusAutoConfiguration自动配置类,MybatisPlusProperties配置项绑定,前缀为mybatis-plus
sdsdsdsdsdsdsddsssss
ssss②、自动配置好了SqlSessionFactory。底层是容器中默认的数据源
sdssdsdsddssss
ssss③、自动配置好mapperLocations 。有默认值 classpath*:/mapper/**/*.xml
sdsdsdddsdsss
sdsdsdddsdsss
sss【注】:任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。建议以后sql映射文件,都放在mapper下。(在SqlSessionFactory中配置的)
ssss④、容器中也自动配置好了 SqlSessionTemplate
sdssss
ssss⑤、自动导入了AutoConfiguredMapperScannerRegistrar类 ==》@Mapper 标注的接口也会被自动扫描
sss【注 】:建议直接 @MapperScan(“com.atguigu.webadmin.mapper”) 批量扫描就行
完整的CRUD测试 - 分页显示数据
ssss①、创建User1Mapper、User1Service接口、UserServiceImpl
/**
*只需要我们的Mapper继承 BaseMapper 就可以拥有crud能力
*/
@Mapper
public interface User1Mapper extends BaseMapper<User1> {}
==============================================================================================================
public interface User1Service extends IService<User1> {} //IService里面包含各种方法,也可以不继承,直接写方法
=================================================================================================================
@Service
public class User1ServiceImpl extends ServiceImpl<User1Mapper,User1>implements User1Service{}
//extends ServiceImpl就避免了各种方法需要override();
ssss②、设置分页插件(固定写法,可查阅官方文档)
@Configuration
public class MyBatisConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 在最后一页点击下一页跳转到首页
paginationInnerInterceptor.setOverflow(true);
// 每页显示的最大记录数
paginationInnerInterceptor.setMaxLimit(2L);
interceptor.addInnerInterceptor(paginationInnerInterceptor);
return interceptor;
}
}
ssss③、编写Controller
@Controller
public class TableController {
@Autowired
User1Service user1Service; //注意:这是接口
@GetMapping("/dynamic_table") //这里之所以要传入参数pn,是因为我们要做到"点哪个页"就调到对应的页
public String dynamic_table(@RequestParam(value = "pn",defaultValue = "1") Integer pn, // 用于分页
Model model){
//从数据库中查出User表中的用户
List<User1> list = user1Service.list();
model.addAttribute("user1s",list);
Page<User1> userpage = new Page<>(pn, 2); //分页查询数据
Page<User1> page = user1Service.page(userpage, null); //返回分页后的数据
model.addAttribute("page",page);
return "table/dynamic_table";
}
ssss④、对页面的删除操作:
public class TableController {
@Autowired
User1Service user1Service;
@GetMapping("/user1/delete/{id}") //根据"id"删除
public String deleteUser(@PathVariable("id") Long id,
@RequestParam(value = "pn",defaultValue = "1") Integer pn,
RedirectAttributes ra){
user1Service.removeById(id);
ra.addAttribute("pn",pn);
return "redirect:/dynamic_table";
}
}
ssss⑤、对应页面显示: