public interface MenuMapper {
@Results(
value={
@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(property="pid",column="pid"),//menu中的id是他的方法中的pid
@Result(property="children",many=@Many(select="selByPid"),column="{uid=uid,pid=id}"),
}
)
//把传过来的uid的值做常量列的值,并取名为UID
@Select("select *,#{uid} uid from menu where id in (select mid from users_menu where uid=#{uid}) and pid=#{pid}")
List<Menu> selByPid(Map<String,Object> map);
}
@Results:当数据库字段名和实体类所对应的属性名字不一致的时候,通过@Results将他们对应起来。其中column是数据库字段名,property是实体类的属性名。id表示是否是主键
public interface MenuMapper {
@Results(id="MenuMap"
value={
@Result(id=true,property="id",column="id"),
@Result(property="name",column="name"),
@Result(property="pid",column="pid"),//menu中的id是他的方法中的pid
@Result(property="children",many=@Many(select="selByPid"),column="{uid=uid,pid=id}"),//左侧是参数,右侧是数据库字段名
}
)
//把传过来的uid的值做常量列的值,并取名为UID
@Select("select *,#{uid} uid from menu where id in (select mid from users_menu where uid=#{uid}) and pid=#{pid}")
List<Menu> selByPid(Map<String,Object> map);
@Select("select *,#{uid} uid from menu")
@ResultMap(value="menuMap")
List<Menu> select();
@ResultMap表示,如果@Results复用率比较高的时候。可以使用@ResultMap来复用这段代码。
@Many:需要通过查询到的字段值作为参数(查询出的内容是1对多的
),然后执行另一个方法来查询关联的内容
@One相对@Many来讲,@One的查询结果是1对1的。
关于@Param的注解
@Select("select * from user where id = #{id}")
User selById(@Param("id")int id);
@Select("select * from user where id = ${id}")
User selById(@Param("id")int id);
@Select("select * from user where id = #{id}")
User selById(User user);
@Param:三种使用方法,使用@Param注解声明参数的时候,可是使用#{}和${}。如果不使用@Param注解,参数只能使用JavaBean。
#{}和${}之间的区别:
#{}:在预处理的时候会将参数部位转换成占位符?参数替换发生在DBMS中。
而${}不会,所以容易发生sql注入问题。参数替换发生在动态解析过程中。
所以优先使用#{}