mybatis @Select注解中如何拼写动态sql
@Mapper public interface DemandCommentMapper extends BaseMapper<DemandComment>{ @Select("SELECT " + "a.id as 'id',a.create_date as 'createDate',a.content as 'content'," + "a.parent_id as 'parentId',a.first_comment_id as 'firstCommentId'," + "b.id as 'fromUser.id',b.realname as 'fromUser.realname',b.avatar as 'fromUser.avatar'," + "c.id as 'toUser.id',c.realname as 'toUser.realname',c.avatar as 'toUser.avatar' " + "FROM t_demand_comment a " + "LEFT JOIN t_user b ON b.id = a.from_uid " + "LEFT JOIN t_user c ON c.id = a.to_uid " + "WHERE a.demand_id = #{demandId} " + "ORDER BY a.create_date ASC" + "LIMIT #{startNo},#{pageSize}") public List<DemandComment> listDemandComment(@Param("demandId") Long demandId,
@Param("startNo") Integer pageNo,
@Param("pageSize") Integer pageSize);
这样整个语句是写死的,如果我想根据pageNo与pageSize是否为空来判断是否需要分页,该怎么做呢?
如果使用xml来配置的话可以用
<when test='startNo!=null and pageSize != null '>
LIMIT #{startNo},#{pageSize}
</when>
如果是用@Select 这种该如何做呢?
方法:用script标签包围,然后像xml语法一样书写
@Mapper public interface DemandCommentMapper extends BaseMapper<DemandComment>{ @Select("<script>" + "SELECT " + "a.id as 'id',a.create_date as 'createDate',a.content as 'content'," + "a.parent_id as 'parentId',a.first_comment_id as 'firstCommentId'," + "b.id as 'fromUser.id',b.realname as 'fromUser.realname',b.avatar as 'fromUser.avatar'," + "c.id as 'toUser.id',c.realname as 'toUser.realname',c.avatar as 'toUser.avatar' " + "FROM t_demand_comment a " + "LEFT JOIN t_user b ON b.id = a.from_uid " + "LEFT JOIN t_user c ON c.id = a.to_uid " + "WHERE a.demand_id = #{demandId} " + "ORDER BY a.create_date ASC " + "<if test='startNo!=null and pageSize != null '>" + "LIMIT #{startNo},#{pageSize}" + "</if>" + "</script>") public List<DemandComment> listDemandComment(@Param("demandId") Long demandId,
@Param("startNo") Integer pageNo,
@Param("pageSize") Integer pageSize);
项目实例
@Select("<script>"
+"select * from mi_taobao where 1=1"
+"<if test='status != null'>"
+"and status = #{status}"
+"</if>"
+"</script>")
public List<Taobao> getTaobao(@Param("status") Integer status);
在这里还碰到一个问题就是报错:Caused by: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'status' in 'class java.lang.Interger'
出现原因:这里出现的问题是在DAO方法中定义的参数 与 实体中定义的属性不一致 导致的。
解决方案:dao层加@Param("userId")注解即可(实例中就是加上@Param("status"))
public List<DictItem> selectKeyByUserId(@Param("userId") long userId);
尽量在 xml 里写咯,很简单的 sql 可以在这写,长的复杂的 sql 在 xml 里写可读性更好,这种动态写法只是做下了解,并不推荐使用
分类:
MyBatis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2017-06-28 浅析promise捕获错误方式、用try catch可以捕获promise错误吗、try catch和promise的catch有什么区别、try catch为什么不能捕获异步错误
2017-06-28 浅析编译原理基础科普:编译是什么、高级语言低级语言是什么、如何转换、为什么需要ast、编译器转译器解释器如何处理ast