Mybatis之使用注解拼装动态sql

方式一:使用脚本
下面是用<script>的方式把XML配置方式的动态SQL照搬过来,用注解来实现。适用于xml配置转换到注解配置

@Select("<script>select * from user <if test=\"id !=null \">where id = #{id} </if></script>")    
public List<User> findUserById(User user);  

方式二:使用相应的Provider注解

@Mapper
public interface ImageMapper {

    @Select("select * from image where isShow=0")
    List<Image> selectAllImage();

    @Insert("insert into image(id, title, remark, url, isShow) values(#{image.id},#{image.title},#{image.remark},#{image.url},#{image.isShow})")
    int insertImage(@Param("image") Image image);

    /**
     * 更新图片的isShow字段,0代表展示,1代表不展示,即删除
     * @param list
     * @return
     */
    @UpdateProvider(type = ImageProvider.class, method = "updateImageIsShow")
    int updateImageIsShow(List<String> list);

    class ImageProvider{
        // 注意:public String updateImageIsShow(List<String> list){
        public String updateImageIsShow(Map map){

            // 注意
            List<String > list = (List<String>) map.get("list");

            StringBuilder builder = new StringBuilder();
            builder.append("update image set isShow=1 where id in (");
            if (list != null && list.size() > 0){
                for (int i = 0; i < list.size(); i++) {
                    if(i+1 == list.size()){
                        builder.append("'"+list.get(i)+"'");
                    }else{
                        builder.append("'"+list.get(i)+"', ");
                    }
                }
                return builder.append(")").toString();
            }
            return null;
        }
    }
}

注意:这是一个最简单的list传参,但是在运行时会报传参错误。这是mybatis内部机制造成的,其参数需要是key/value结构,当遇到这里不是key/value结构的list时,mybatis会自己把它转换成key/value结构,key就是他的名字”list”,value就是他的值List,要正确传参需要使用key/value结构的map

猜你喜欢

转载自blog.csdn.net/Code_shadow/article/details/81267059