简介
MyBatis-Plus(简称 MP)是一个 MyBati的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
特性
框架结构
yml 配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql:///mybatis?characterEncoding=utf8
username: root
password: admin
# 在控制台显示 SQL
logging:
level:
com:
bh:
mybatis:
dao: debug
dao 接口 继承 BaseMapper<实体类> mp 封装好的 方法接口
有特殊需求 自己追加 方法
主启动类增加 MapperScan 扫描注解
pojo 对象 需要 指定 映射表 主键字段
@TableName(value = "t_user")// 匹配表名和实体类名不一致
public class User implements Serializable {
@TableId(type = IdType.AUTO)// 主键和主属性对应匹配 必须配置 mybatis是auto_increment,mp是 雪花算法
private Integer uid;
// @TableField // 非主键和非主属性匹配
private String uname;
private String upwd;
}
接近全 ORM 的实现
插入操作
// 插入操作 -- 获取id
@Test
void contextLoads() {
User user = new User(0,"炳汉","0022");
userDao.insert(user);
System.out.println(user.getUid());
}
删除操作
// 删除操作 -- 一组 id 删除
@Test
void delBtIds() {
// 方式一
// userDao.deleteBatchIds(Arrays.asList(20,19));
// 方式二
List<Integer> list = new ArrayList<>();
list.add(19);
list.add(20);
userDao.deleteBatchIds(list);
}
修改操作
// 修改操作 -- 主键修改
@Test
void updateByPrimaryKey() {
User user = new User(18,"卧龙先生","5577");
userDao.updateById(user);
}
查询操作
// 查询操作 -- 三大类 实体类对象封装、 统计个数、 Map 对象封装 (以及带分页,封装条件有Map 和 queryWrapper)
// 一组 id 查询
@Test
void selectByIds() {
List<User> users = userDao.selectBatchIds(Arrays.asList(16, 17, 18));
System.out.println(users);
}
// 使用 Map 封装查询条件 -- 精确查询 不支持模糊查询 =
@Test
void selectByMap() {
Map<String,Object> map = new HashMap<>();
map.put("uname","张三");
List<User> users = userDao.selectByMap(map);
System.out.println(users);
}
// 使用 queryWrapper 封装查询条件 -- 查询一个结果
@Test
void selectByWrapper() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("uid",18);
wrapper.eq("upwd","5577");
User user = userDao.selectOne(wrapper);
System.out.println(user);
}
// 查询 -- 统计个数\
@Test
void selectByCount() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 模糊查询
// 全模糊
// wrapper.like("uname","张");
// 右模糊
wrapper.likeRight("uname","张");
// 或者
wrapper.or();
wrapper.likeRight("uname","孙");
// 方法连用也支持 方法 返回值就是本类对象
// wrapper.likeRight("uname","张").or().likeRight("uname","孙");
Integer integer = userDao.selectCount(wrapper);
System.out.println(integer);
}
// 查询操作 -- 排序
@Test
void order() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("upwd","uname");
List<User> users = userDao.selectList(wrapper);
System.out.println(users);
}
// 向 Map 集合保存数据
@Test
void selectToMap() {
List<Map<String, Object>> maps = userDao.selectMaps(null);
System.out.println(maps);
}
不管是向Map还是对象封装数据对于前端来说格式都是通过字符串传输转回的对象,无本质区别,使用都是xx.xx
Page 分页
分页操作
// 分页测试
@Test
void Page() {
Page<User> page = new Page<>(1,5);// 页码 和 页容量
Page<User> userPage = userDao.selectPage(page, null);
System.out.println("当前页号"+userPage.getCurrent());
System.out.println("总页数"+userPage.getPages());
System.out.println("总行数"+userPage.getTotal());
System.out.println("当前页数据:");
List<User> records = userPage.getRecords();
System.out.println(records);
}
因为没有配置文件了 所以需要配置类
需要配置分页拦截器 MybatisPlusInterceptor
放到哪个位置都可以 只要IoC容器管理即可
// 分页拦截器
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
Object 接收数据
// 采用 Object 接收数据
@Test
void selectToObject() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("uname");
List<Object> objects = userDao.selectObjs(wrapper);
System.out.println(objects);
}
需要自定义的 增加即可 不影响
业务层 也通过继承封装好的实现了 npmp
接口:UserService
extends IService
public interface UserService extends IService<User> {
}
接口实现类:UserServiceImpl
extends ServiceImpl<userDao,User>
implement UserService
@Service
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
}
只针对单表 多表需要自己根据业务添加
测试
@SpringBootTest
public class ServiceTest {
@Autowired
private UserService userService;
// 测试增加操作
@Test
public void testSave() {
userService.save(new User(0,"天使","983"));
}
// 测试修改操作
@Test
public void testUpdate() {
userService.updateById(new User(21,"白天使","987"));
}
// 测试查询操作
@Test
public void testSelect() {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.likeRight("uname","张");
List<User> list = userService.list(wrapper);
System.out.println(list);
}
}
pom 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mp 的 pom 包米豆的 若只需要mp 则mybatis的启动器可以不用-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<!-- 代码生成器包-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 基于 Java 的模板引擎 velocity 可以实现彻底的前后端-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
全局配置 项目路径、作者
getSwagger 相当于浏览器请求测试(相当于Postman)
数据源配置
指定生成位置的路径
生成内容的策略配置
@Test
void contextLoads() {
// 代码生成
// 全局配置 项目路径、作者
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
// 项目路径
String projectPath = System.getProperty("user.dir");
// 生成内容全局路径
gc.setOutputDir(projectPath+"/src/main/java");
gc.setAuthor("lbh");// 设置作者
gc.setOpen(false);// 生成后是否打开资源管理器
gc.setFileOverride(false);// 重新生成文件是否覆盖
// 业务层接口名称 格式为去掉下划线改为大写
gc.setServiceName("%sService");
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
//数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setUrl("jdbc:mysql://localhost:3306/mybatis?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("admin");
//指定哪种数据库
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//指定生成内容的路径
// 包配置
PackageConfig pc = new PackageConfig();
pc.setModuleName(null);
pc.setParent("com.bh");
pc.setController("controller");
pc.setEntity("pojo");
pc.setService("service");
pc.setMapper("dao");
mpg.setPackageInfo(pc);
//生成内容的根据
//策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("t_user","t_user_base");//对那一张表生成代码
strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略 下换线2驼峰
strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作
strategy.setRestControllerStyle(true); //restful api风格控制器
strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符
mpg.setStrategy(strategy);
//执行生成操作
mpg.execute();
}
注意: 不要用 SpringBootTest 整合测试 单独运行