select max(id) from 表名,这样应该可以实现你的需求,但是你得确保,你得到这个结果后没有新的数据插入,如果有新数据插入,它就不是最大的id了。
在mp的官方文档中,有说明哪些会存在sql注入的风险,例如:last,还有apply的一种只用方式。官方文档地址:https://mybatis.plus/guide/wrapper.html
多表联查可以既使用xml或@select注解的方式写sql,然后还能使用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),如果使用了条件构造器,条件构造器的字段名别忘了带别名。
同学,我自己试验了一下,我的正常。在父类中的属性,查询后,也会映射到对象中,我使用的MP版本是3.3.1.tmp。你使用的是什么版本?
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),如果使用了条件构造器,条件构造器的字段名别忘了带别名。
同学,经过我验证,开启二级缓存后,MP的baseMapper中提供的一系列Select方法不能命中二级缓存,只有自定义的方法才能命中二级缓存。
MP官方的建议是:“我们建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现。”