0


Mapper层注解讲解

文章目录

1 Mapper层注解

Mapper

层注解

@Reponsitory

@Mapper

经常使用但是不知道区别,就学习记录下

1.1 @Repository

@Repository

@Repository

的作用与

@Controller

@Service

的作用都是把对象交给

Spring

管理。

@Repository

是标注在

Dao

层接口上,作用是将接口的一个实现类交给

Spring

管理。

注意

  • 使用这个注解的前提是必须在启动类上添加@MapperScan("Mapper接口层路径") 注解

这个

@Repository

完全可以省略不写,也完全可以实现自动注入,但是在

IDEA

中会存在一个红色的波浪线。原因如下:

  • Spring配置文件中配置了MapperScannerConfiguer这个Bean,它会扫描持久层接口创建实现类并交给Spring管理。
  • SpringBoot的启动类上标注了@MapperScanner,它的作用和上面的MapperScannerConfiguer作用一样

1.2 @Mapper

@Mapper

: 这个注解一般使用在

Dao

层接口上,相当于一个

mapper.xml

文件,它的作用就是将接口生成一个动态代理类。加入了

@Mapper

注解,目的就是为了不再写

mapper

映射文件。这个注解就是用来映射

mapper.xml

文件的。

使用

@mapper

后,不需要在

spring

配置中设置扫描地址,通过

mapper.xml

里面的

namespace

属性对应相关的

mapper

类,

spring

将动态的生成

Bean

后注入到

ServiceImpl

注意


Dao

层不要存在相同名字的接口,也就是在

Dao

不要写重载。因为

mapper

文件是通过

id

与接口进行对应的,如果写了两个同名的接口,就会导致

mapper

文件映射出错。

1.3 @Mapper和@MapperScan区别

@Mapper

注解写在每个

Dao

接口层的接口类上,

@MapperScan

注解写在

SpringBoot

的启动类上。

当我们的一个项目中存在多个

Dao

层接口的时候,此时我们需要对每个接口类都写上

@Mapper

注解,非常的麻烦,此时可以使用

@MapperScan

注解来解决这个问题。让这个接口进行一次性的注入,不需要在写

@Mapper

注解

@SpringBootApplication@MapperScan("cn.gyyx.mapper")// 这个注解可以扫描 cn.gyyx.mapper 这个包下面的所有接口类,可以把这个接口类全部的进行动态代理。publicclassWardenApplication{publicstaticvoidmain(String[] args){SpringApplication.run(WardenApplication.class,args);}}
@Mapper

注解相当于是

@Reponsitory

注解和

@MapperScan

注解的和,会自动的进行配置加载。

@MapperScan

注解多个包,

@Mapper

只能把当前接口类进行动态代理。

在实际开发中,如何使用

@Mapper、@MapperSacn、@Repository

注解

  • SpringBoot的启动类上给定@MapperSacn注解。此时Dao层可以省略@Mapper注解,当让@Repository注解可写可不写,最好还是写上。 当使用@Mapper注解的时候,可以省略@MapperSacn以及@Repository

建议:

  • 以后在使用的时候,在启动类上给定@MapperScan("Dao层接口所在的包路径")。在Dao层上不写@Mapper注解,写上@Repository即可

1.4 @Select

1.4.1 基本用法

@Select

:该注解的目的是为了取代

mapper.xml

中的

select

标签,只作用于方法上面。此时就不要在写

mapper.xml

文件了。

@Select

注解的源码

@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public@interfaceSelect{String[]value();}

从上述可以看到两点信息:

@Select

注解只能修饰方法。

@Select

注解的值是字符数组。

所以,

@Select

注解的用法是这样的:

@Select({"select * from xxx","select * from yyy"})PersonselectPersonById(Integer id);

虽然

@Select

注解的值是字符数组,但是真正生效的应该是最后那条SQL语句

1.4.2 @Select注解动态SQL拼写

普通的字符串值,只能实现变量的替换功能,实现简单的

SQL

语句,如下所示

@Select("select * from t_person where id = #{id}")PersonselectPersonById(Integer id);

如果要想实现复杂的逻辑判断,则需要使用标签 ,如下所示:

@Select("<script> select * from t_person where id = #{id}<when test='address !=null'> and address = #{address}</when></script>")PersonselectPersonById(Integer id);

其实,标签 注解专用的,其他的注解,例如@Insert、@Update、@Delete等等,都可以使用的。

1.5 @Param

接口绑定解决多参数的传递,一般使用

@Param
@Param

: 动态代理接口向映射文件中传递参数的时候,会使用

@Param

注解,并且如果动态代理接口使用了

@Param

这个注解,那么映射文件中的标签中可以不用写

parameterType

属性,可以直接接收

@Param

中传递来的参数值

1.5.1 @Param注解基本类型的参数

mapper中的方法:

publicUserselectUser(@Param("userName")String name,@Param("password")String pwd);

映射到

xml

中的标签

<selectid="selectUser"resultMap="User">     
    select * from user where user_name = #{userName} and user_password=#{password} 
</select>

其中

where user_name = #{userName} and user_password = #{password}

中的

userName

password

都是从注解

@Param()

里面取出来的,取出来的值就是方法中形式参数

String name

String pwd

的值。

重点:当只存在一个参数的时候,此时可以省略这个

@Param

注解,但是两个参数必须使用这个注解。

1.5.2 @Param注解JavaBean对象

SQL

语句通过

@Param

注解中的别名把对象中的属性取出来然后复制

mapper

中的方法:

publicList<User>getAllUser(@Param("user")User u);

映射到

xml

中的标签

<selectid="getAllUser"parameterType="com.vo.User"resultMap="userMapper">  
        select   
        from user t where 1=1  
             and   t.user_name = #{user.userName}  
              and   t.user_age = #{user.userAge}  
    </select>

注意:
当使用了

@Param

注解来声明参数的时候,

SQL

语句取值使用

#{}

${}

取值都可以。
当不使用

@Param

注解声明参数的时候,必须使用的是

#{}

来取参数。使用

${}

方式取值会报错。
不使用

@Param

注解时,参数只能有一个,可以是一个基本的数据也可以是一个

JavaBean

1.5.3 不使用@Param

接口绑定解决多参数的传递,如果不使用

@Param

,则使用数字的方式取出,从

0

开始
接口中定义方法

UserselByUP(String username,String password

映射文件中提供对应的标签
此时,

SQL

语句中获取方式有两种, 通过

#{index}

#{param+数字}

的方式

<selectid="selByUP"resultType="user">
    select * from t_user where username=#{0} and password=#{1}
</select>

或者

<selectid="selByUP"resultType="user">
    select * from t_user where username=#{param1} and password=#{param2}
</select>

本文转载自: https://blog.csdn.net/u012060033/article/details/128040322
版权归原作者 爱吃牛肉的大老虎 所有, 如有侵权,请联系我们删除。

“Mapper层注解讲解”的评论:

还没有评论