selectMapsPage方法参数好像跟视频里的不一致了,不知道是不是新包封装的新的方法
https://baomidou.com/pages/8f40ae/
这里是新的分页插件的配置方法,要确保分页插件的配置被spring正确加载
深层次的不懂,这个分页跟pagehelper一样都是先查询总条数,然后后面加上limit的处理方法,但是在本框架内就整合了分页肯定比MyBatis要另外引入pagehelper来的舒服
这查询用*是真的不好,不要学
你使用mp的高版本,使用新配置,已经好使了哈,没帮到你什么忙。
我没这样使用过,从MP的注释上可以看出,自定义sql不支持使用实体类为参数的条件构造器的构造方法创建出的条件构造器对象。
什么情况?
我用的是下面这个写法,有效果,是在他官方文档上提供的写法。 /** * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } @Bean public ConfigurationCustomizer configurationCustomizer() { return configuration -> configuration.setUseDeprecatedExecutor(false); }
我没遇到过这种问题,你不会配置了两个分页插件吧,还有你使用的是mp的什么版本?
MP自带的CRUD操作是针对单表操作的,如果要操作多表,可以写自定义sql。
给你举个使用条件构造器的多表sql例子,可以写在xml中或注解中,下面的是用xml的写法:
<select id="mySelectList" resultType="User"> select u.*,r.role_name from user u inner join role r on u.role_id = r.role_id ${ew.customSqlSegment} </select>
对应的Mapper接口中的方法定义:
List<User> mySelectList(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
返回值可以是VO。也可以是实体类,但要要记住,如果用实体类接返回值,实体中非该实体对应表的数据库字段的属性上要标注@TableField(exist = false),如果使用了条件构造器,条件构造器的字段名别忘了带别名。
应该可以使用原生的mybatis的方式和条件构造器混合使用,但要确保没有sql注入风险才可以,例如:
SELECT! ISNULL( uwl.user_id ) AS isLike,uw.id,uw.liked_num FROM user_wonderful uw LEFT JOIN user_wonderful_liked uwl ON uw.id = uwl.uw_id AND ${xxxx} ${ew.customSqlSegment}
我怀疑你没有配置分页插件导致的。分页插件的配置方法可以看我的视频或者官方文档,官方文档地址为:https://mybatis.plus/guide/page.html
我暂时是没发现有这个东东,JPA有他自己的分页。mybatis-plus也有分页插件。还有如果不用mybatis-plus只用mybatis,可以用国人写的pagehelper分页插件。你说的这种都适用的我目前是没发现。
我也不太明白你想要的东西是什么,自定义方法使用xml方式或者注解方式都可以。还是说,你想在service层,把mapper层的方法封装一下?
两个表连表查询的话,使用LambdaQueryWrapper可能会有问题,如果两个表中有同名字段,LambdaQueryWrapper是无法使用别名的。如果使用普通的QueryWrapper,你是可以指定别名的,例如:qw.eq("e.name","ww")
可以调用IPage接口中的一个默认方法实现,该默认方法MP已经给我们实现,如下:
/** * IPage 的泛型转换 * * @param mapper 转换函数 * @param <R> 转换后的泛型 * @return 转换泛型后的 IPage */ @SuppressWarnings("unchecked") default <R> IPage<R> convert(Function<? super T, ? extends R> mapper) { List<R> collect = this.getRecords().stream().map(mapper).collect(toList()); return ((IPage<R>) this).setRecords(collect); }
已经在下面回复中找到答案。原来上面的 page的定义 也需要
IPage<Map<String,Object>> page = new Page<>(1,2);
这样来处理
你的这个问题看MP源码:
/** * 根据 Wrapper 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 */ <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
E page,这个参数,Page的泛型不是实体,而是
<E extends IPage<Map<String, Object>>>
打印出来的sql日志,没有order by排序吗?正常应该好使啊。
MP的分页插件没有你说的那些功能,他有一个如果当前页码大于最大页码,这返回第一页的数据。
我试验了一下,使用selectMapsPage后确实是这样。你还有一个办法,你想要每页的记录是List泛型是Map的是吗?你可以使用selectPage方法,返回的对象是IPage类型的对象,你使用IPage接口的 default <R> IPage<R> convert(Function<? super T, ? extends R> mapper)这个方法转换一下。
有点不太明白,你这个sql语句用原生的mybatis就可以实现,关键字你写错,是like,不是liker。还有like你模糊查询不用通配符吗?不用通配符那是精确匹配啊。where 后面的1=1不用写,原生的<where>标签就可以解决这个问题。
如果用MP的条件构造器实现,大概是这样,我没加那个1=1,应为没有必要:
String param = "LiYANG"; QueryWrapper<User> query = Wrappers.<User>query(); //参数转小写,直接用java的String中的toLowerCase()方法即可,不是非得用数据库函数 query.apply("lower('user_name') like {0}", param.toLowerCase()); List<User> list = memberMapper.selectList(query);
怎么留言系统给我截断了,再发一遍,可以这样理解,springboot中推荐用配置类这种配置方式,就跟原来spring使用xml配置bean是一个效果。还有PaginationInterceptor本质上是mybatis过滤器,如果你想了解mybatis过滤器的相关内容,可以在网上查资料,很多的。
使用mp的分页插件实现分页,如果是单表查询,并且不是自定义的sql,用mp提供的方法,是不用写sql的,直接用就可以了。实现分页的话,一般是需要发出两条sql语句的,一条查询符合当前条件的总记录数,一条查询当前页的记录(List类型的),如果不用分页插件,你要写两条sql的。而且不同数据库的分页语法是不一样的,有的数据库的分页语法比较麻烦,例如oracle。
所以一般情况下,还是用mp的分页插件比较方便。
那是因为你没下载源代码,你在idea中看到的源码其实是class文件反编译后得到的,class文件中不能保存注释信息。
你可以点击你那张截图界面右上角的Download Sources下载源码。或者在Project视窗选择项目,右键->Maven->Download Sources下载所有依赖的源码。
理论上这么写是对的,不知道你那为何报这个错误。我印象中有个同学报这个错误是引入的依赖有问题。你pom.xml文件中的依赖都是什么,方便的话贴出来,我看看。
问题解决了就好,这个涉及到springboot启动类的机制,配置类和组件类默认需要在启动类所在包或其子包下才能扫描到,当然你也可以通过注解@ComponentScans或者@ComponentScan指定扫描的包。
正常应该可以呀,你要不更换一下mybatis-plus的版本,使用3.1.2或者3.2.0试试,还有分页插件你配置了吗?
正常的话,不应该出现这个问题呀,你调用selectPage方法,日志打印出的是一条select还是两条?正常应该是两条,一条没有limit查总记录数的,一条是有limit查记录的。