好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Mybatis中@Param注解的作用说明

@Param注解的作用说明

1.关于@Param

@Param是MyBatis所提供的(org.apache.ibatis.annotations.Param),作为Dao层的注解,作用是用于传递参数,从而可以与SQL中的的字段名相对应,一般在2=<参数数<=5时使用最佳。

2.原始的方法

当只有一个参数时,没什么好说的,传进去一个值也只有一个参数可以匹配。当存在多个参数时,传进去的值就区分不开了,这时可以考虑用Map,例如接口

?

1

public List<Role> findRoleByMap(Map<String, Object> parameter);

?

1

2

3

4

5

< select id= "findRoleByMap" parameterType= "map" resultType= "role" >

    SELECT id, name FROM t_role

    WHERE roleName=#{roleName}

    AND note=#{note}

< select >

测试代码:

?

1

2

3

4

5

RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);

Map<String, Object> parameter = new HashMap<>();

parameter.put( "roleName" , "剑士" );

parameter.put( "note" , "决战紫禁之巅" );

List<Role> roles = roleMapper.findRolesByMap(parameter);

3.使用@Param

很明显上面的缺点就在于可读性差,每次必须阅读他的键,才能明白其中的作用,并且不能限定其传递的数据类型,下面是使用@Param的情况,需要将接口改为

?

1

public List<Role> findRoleByAnnotation( @Param ( "roleName" ) String roleName, @Param ( "note" ) String note);

这样我们就可以直接传入对应的值了。

当然也可以使用Java Bean来传递多个参数,定义一个POJO

?

1

2

3

4

5

public class RoleParam {

    private String roleName;

    private String note;

    /*getter和setter*/

}

此时接口就变为

?

1

public List<Role> findRoleByBean(RoleParam role);

这样对应的xml文件与1处的区别就在于id和parameterType发生了变化,id对应的方法和parameterType对应该类的权限定名。

而使用更多的场景可能是这样的,对应多个POJO

?

1

public List<Role> findRoleByMix( @Param ( "roleP" ) RoleParam role, @Param ( "permissionP" ) PermissionParam permission);

这样就可以进行如下映射:

?

1

2

3

4

5

6

< select id= "findRoleByMix" resultType= "role" >

    SELECT id, name FROM t_role

    WHERE roleName=#{roleP.roleName}

    AND note=#{rolep.note}

    AND level =#{permissionP. level }

< select >

注意此时并不需要写出parameterType属性,Mybatis会进行自动搜索。

小结一下: 最后也许会有小火办会问,那@Param和@RequestParam是什么关系呢?其实它们没有关系,就跟Java和JavaScript,雷锋和雷锋塔一样,拥有相似的外表,其实作用是不一样的,@Param是地处Dao层,是为了传递多个参数,解决的是可读性和直观性;而@RequestParam是位列Controller层,作用是为获取前端参数,解决的是前后端参数不一致的问题。所以它们没有关系!

@Param注解和参数使用

1.使用@Param注解

当以下面的方式进行写SQL语句时:

?

1

2

@ Select ( "select column from table where userid = #{userid} " )

public int selectColumn( int userid);

当你使用了使用@Param注解来声明参数时,如果使用 #{} 或 ${} 的方式都可以。

?

1

2

@ Select ( "select column from table where userid = ${userid} " )

public int selectColumn(@Param( "userid" ) int userid);

当你不使用@Param注解来声明参数时,必须使用使用 #{}方式。如果使用 ${} 的方式,会报错。

?

1

2

@ Select ( "select column from table where userid = ${userid} " )

public int selectColumn(@Param( "userid" ) int userid);

2.不使用@Param注解

不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。

?

1

2

3

// 这里id是 user 的属性

@ Select ( "SELECT * from Table where id = ${id}" )

Enchashment selectUserById( User user );

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

原文链接:https://blog.csdn.net/sl1990129/article/details/108477047

查看更多关于Mybatis中@Param注解的作用说明的详细内容...

  阅读:18次