通过@SelectProvider实现一个拼装sql的类,解决问题
(用标签现在不写xml的配置文件标签是什么,我看用@SelectProvider拼接sql
packagevo.mapper;importjava.util.List;importorg.apache.ibatis.annotations.Delete;importorg.apache.ibatis.annotations.Insert;importorg.apache.ibatis.annotations.Options;importorg.apache.ibatis.annotations.Param;importorg.apache.ibatis.annotations.Select;importvo.User;publicinterfaceUserMapper{@Insert("INSERTINTOuser(name,age,gender,experience)VALUES(
#{name},#{age},
#{gender},#{experience})")@Options(useGeneratedKeys=true,keyProperty="id")intcreateUser(Useruser);@Insert("INSERTINTOuser_interest(user_id,interest_id)VALUES(
#{userId},#{interestId})")intcreateUserInterest(@Param("userId")intuserId,@Param("interestId")intinterestId);@Delete("DELETEFROMuserWHEREid=#{id}")intdeleteUser(intid);@Delete("DELETEFROMuser_interestWHEREuser_id=#{userId}")intdeleteUserInterest(intuserId);//findUsers(String,int)的执行策略定义在UserMapper.xml中List<User>findUsers(@Param("name")Stringname,@Param("experience")intexperience);@Select("SELECTinterest_idFROMuser_interestWHEREuser_id=#{userId}ORDERBYid")List<Integer>findUserInterests(intuserId);//queryInterest(int,int)的执行策略定义在UserMapper.xml中List<User>queryInterest(@Param("gender")intgender,@Param("experience")intexperience);}
不要xml文件,通过@SelectProvider实现一个拼装sql的类,解决问题楼上的也没解决楼主的问题啊
更简单的方法是使用<script>标签直接包裹动态sql,用楼主的例子就是:
@Select("<script>select*fromuserwhere<iftest=\"username!=null\">username=#{username}</if><iftest=\"phone!=null\">phone=#{phone}</if><iftest=\"usermail!=null\">usermail=#{usermail}</if></script>")
这样定制性更大,实现起来也方便,记住这样做的话注解中的sql语句必须全都在<script>标签中
所以还是使用xml配置会更好维护一些这样做似乎还没直接写到xml里好维护呢~