MyBatis中的@Results

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注入问题。参数替换发生在动态解析过程中。
所以优先使用#{}


版权声明:本文为WriteDew原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。