Mybatis-plus 下 查询操作 1.查询单个用户 @Test public void testSelectById () { User user = userMapper.selectById(1L ); System.out.println(user); }
2.查询多个用户
@Test public void testSelectById () { List<User> users = userMapper.selectBatchIds(Arrays.asList(1 , 2 , 3 )); users.forEach(System.out::println); }
3.条件查询 @Test public void testSelectById () { HashMap<String,Object> map = new HashMap<>(); map.put("name" ,"小张" ); map.put("age" ,18 ); List<User> users1 = userMapper.selectByMap(map); users1.forEach(System.out::println); }
分页查询 1.配置拦截器 @EnableTransactionManagement @Configuration @MapperScan("com.zc.mapper") public class MyBatisPlusConfig { @Bean public PaginationInterceptor paginationInterceptor () { return new PaginationInterceptor(); } }
2.书写方法 @Test public void Page () { Page<User> page = new Page<>(1 ,5 ); userMapper.selectPage(page,null ); page.getRecords().forEach(System.out::println); System.out.println(page.getTotal()); }
此时是 第1页,每页有5条数据
删除操作 1.删除单个用户 @Test public void DeleteById () { userMapper.deleteById(1374350451559940099L ); }
2.删除多个用户 @Test public void DeleteById () { userMapper.deleteBatchIds(Arrays.asList(4 ,5 )); }
3.按条件删除用户 @Test public void DeleteById () { HashMap<String,Object> map = new HashMap<>(); map.put("name" ,"小李" ); userMapper.deleteByMap(map); }
逻辑删除
物理删除:从数据库中直接移除 逻辑删除:再数据库中没有被移除,而是通过一个变量来让他失效!deleted =0=> deleted =1
步骤:
1.数据表中增加一个 deleted 字段
注意,不要添加成delete 字段,delete 为关键字,会出错
2.实体类加入字段、注解
@TableLogic private Integer deleted;
3.配置文件
mybatis-plus.global-config.db-config.logic-delete-field =deleted mybatis-plus.global-config.db-config.logic-delete-value =1 mybatis-plus.global-config.db-config.logic-not-delete-value =0
4.测试
删除操作:
@Test public void TableLogic () { userMapper.deleteById(1374350451559940101L ); }
虽然执行的是删除操作,但是实际上逻辑删除会更新deleted 字段,而不是直接删除
查询操作:
既然没有删除该语句,那可以查询到吗?
@Test public void TableLogic () { userMapper.selectById(1374350451559940101L ); }
上图可以看出,他会查询deleted字段为0为前提的数据,如果被逻辑删除过的数据,deleted字段为1,查询不到。
条件构造器 当前我的数据库数据为:
测试一 name不为空,邮箱不为空,年龄大于等于12 的用户
@Test void test1 () { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.isNotNull("name" ) .isNotNull("email" ) .ge("age" ,12 ); userMapper.selectList(wrapper); }
测试二 查询名字:小张
查询一个数据时,使用selectOne ,查询多个数据,可以使用List 或者Map
@Test void test2 () { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("name" ,"小张" ); User user = userMapper.selectOne(wrapper); System.out.println(user); }
测试三 查询年龄10-15之间的
selectCount 直接返回Integer类型,统计查到了的数据条数
@Test void test3 () { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.between("age" ,10 ,15 ); Integer integer = userMapper.selectCount(wrapper); System.out.println(integer); }
测试四 模糊查询
notLike():不包含
likeRight():效果与 x% 相同
likeLeft():效果与 %x 相同
@Test void test4 () { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.notLike("name" ,"邦" ) .likeRight("email" ,"t" ); List<Map<String, Object>> maps = userMapper.selectMaps(wrapper); maps.forEach(System.out::println); }
测试五 复杂查询
@Test void test5 () { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.inSql("id" ,"select id from user where id<3" ); List<Object> objects = userMapper.selectObjs(wrapper); objects.forEach(System.out::println); }
测试六
orderBy() :正序排序
orderByDesc() :倒序排序
@Test void test6 () { QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.orderByDesc("id" ); List<User> users = userMapper.selectList(wrapper); users.forEach(System.out::println); }
代码自动生成器 1.导入依赖 <dependency > <groupId > org.projectlombok</groupId > <artifactId > lombok</artifactId > </dependency > <dependency > <groupId > com.baomidou</groupId > <artifactId > mybatis-plus-boot-starter</artifactId > <version > 3.2.0</version > </dependency > <dependency > <groupId > com.baomidou</groupId > <artifactId > mybatis-plus-generator</artifactId > <version > 3.0-RC2</version > </dependency > <dependency > <groupId > org.apache.velocity</groupId > <artifactId > velocity-engine-core</artifactId > <version > 2.3</version > </dependency > <dependency > <groupId > io.springfox</groupId > <artifactId > springfox-swagger2</artifactId > <version > 2.9.2</version > </dependency >
2.配置自动生成代码 在Test文件夹中,创建一个新类:cccc
public class ZcCode { public static void main (String[] args) { AutoGenerator mpg = new AutoGenerator(); mpg.execute(); } }
全局配置 GlobalConfig gc = new GlobalConfig(); String projectPath = System.getProperty("user.dir" ); gc.setOutputDir(projectPath+"/src/main/java" ); gc.setAuthor("MoYu" ); gc.setOpen(false ); gc.setFileOverride(false ); gc.setServiceName("%sService" ); gc.setIdType(IdType.ID_WORKER); gc.setDateType(DateType.ONLY_DATE); gc.setSwagger2(true ); mpg.setGlobalConfig(gc);
包的配置 PackageConfig pc = new PackageConfig(); pc.setParent("com.zc" ); pc.setEntity("entity" ); pc.setMapper("mapper" ); pc.setService("service" ); pc.setController("controller" ); mpg.setPackageInfo(pc);
设置数据源 DataSourceConfig dsc = new DataSourceConfig(); dsc.setUrl("jdbc:mysql://localhost:3306/mybatis-plus? useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8" ); dsc.setDriverName("com.mysql.cj.jdbc.Driver" ); dsc.setUsername("root" ); dsc.setPassword("148729" ); dsc.setDbType(DbType.MYSQL); mpg.setDataSource(dsc);
策略配置 StrategyConfig strategy = new StrategyConfig(); strategy.setInclude("user" ); strategy.setNaming(NamingStrategy.underline_to_camel); strategy.setColumnNaming(NamingStrategy.underline_to_camel); strategy.setEntityLombokModel(true ); strategy.setLogicDeleteFieldName("deleted" ); TableFill gmtCreate = new TableFill("create_time" , FieldFill.INSERT); TableFill gmtModified = new TableFill("update_time" , FieldFill.INSERT_UPDATE); ArrayList<TableFill> tableFills = new ArrayList<>(); tableFills.add(gmtCreate); tableFills.add(gmtModified); strategy.setTableFillList(tableFills); strategy.setVersionFieldName("version" );strategy.setRestControllerStyle(true ); strategy.setControllerMappingHyphenStyle(true ); mpg.setStrategy(strategy);
运行 这是生成的架构文件夹:
生成之后的代码以及架构都是很规范的,大家可以自己测试一下