文章目录
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>
版权归原作者 爱吃牛肉的大老虎 所有, 如有侵权,请联系我们删除。