首页 > 其他分享 >SpringBoot中Server层以及Mapper层常用注解

SpringBoot中Server层以及Mapper层常用注解

时间:2022-10-14 15:14:34浏览次数:90  
标签:Mapper SpringBoot Dao Param Server 接口 注解 Select

4. Service层注解

@Service注解一般写在业务层的接口实现类上,而不是接口上。

4.1 @Service

@Service : @Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容中。

@Service
public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{
        ...    
}

@Service("courseDAOImpl") :这个表示给类命名一个别名,方便注入到其他类中。不加这个参数值的话,默认别名就是当前类名,但是首字母小写。

在实际开发中,我们一般都直接使用 @Sevice

4.2 @Scope

@Scope :Spring IOC 容器中的一个作用域,在 Spring IOC容器中,他用来配置Bean实例的作用域对象。

@Scope的几种作用域:

  • singleton 单实例的(单例)(默认)   ----全局有且仅有一个实例。
  • prototype 多实例的(多例)   ---- 每次获取Bean的时候会有一个新的实例。
  • reqeust   同一次请求 ----request:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效。
  • session   同一个会话级别 ---- session:每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效。

默认的作用域是:singleton(单实例)

5. Mapper层注解

5.1 @Reponsitory

@Reponsitory :@Reponsitory的作用与@Controller,@Service的作用都是把对象交给Spring管理。@Reponsitory是标注在Dao层接口上,作用是将接口的一个实现类交给Spring管理。

注意:

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

这个 @Repository 完全可以省略不写,也完全可以实现自动注入,但是在IDEA中会存在一个红色的波浪线。原因如下:

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

5.2 @Mapper

@Mapper : 这个注解一般使用在Dao层接口上,相当于一个mapper.xml文件,它的作用就是将接口生成一个动态代理类。加入了@Mapper注解,目的就是为了不再写mapper映射文件。这个注解就是用来映射mapper.xml文件的。

@Mapper使用的原理:

  • Mybatis 会有一个拦截器,会自动的把 @Mapper 注解的接口生成动态代理类。前提是,映射器(Mapper.xml)必须满足动态代理的条件:
    1. namespace声明的命名空间必须和Dao层接口的全限定类型一致。否者Mapper.xml这个映射器映射不到Dao层的接口类。
    2. Mapper.xml文件中sql语句的id名必须和接口的方法名一致。否则该sql语句对应不上指定的接口。

注意:

  • 在Dao层不要存在相同名字的接口,也就是在Dao不要写重载。因为mapper文件是通过id与接口进行对应的,如果写了两个同名的接口,就会导致mapper文件映射出错。

5.2.1 @Mapper注解和@MapperScan注解的区别

  • @Mapper注解写在每个Dao接口层的接口类上,@MapperScan注解写在SpringBoot的启动类上。
  • 当我们的一个项目中存在多个Dao层接口的时候,此时我们需要对每个接口类都写上@Mapper注解,非常的麻烦,此时可以使用@MapperScan注解来解决这个问题。让这个接口进行一次性的注入,不需要在写@Mapper注解 @SpringBootApplication @MapperScan("cn.gyyx.mapper") // 这个注解可以扫描 cn.gyyx.mapper 这个包下面的所有接口类,可以把这个接口类全部的进行动态代理。 public class WardenApplication { public static void main(String[] args) { SpringApplication.run(WardenApplication.class,args); } }
  • @Mapper注解相当于是@Reponsitory注解和@MapperScan注解的和,会自动的进行配置加载。
  • @MapperScan注解多个包,@Mapper只能把当前接口类进行动态代理。

在实际开发中,如何使用@Mapper、@MapperSacn、@Reponsitory注解???

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

建议:

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

5.3 @Select、@Insert、@Delete、@Update

5.3.1 基本用法

@Select :该注解的目的是为了取代mapper.xml中的select标签,只作用于方法上面。此时就不要在写mapper.xml文件了。

@Select注解的源码

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

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

  • @Select注解只能修饰方法。
  • @Select注解的值是字符数组。

所以,@Select注解的用法是这样的:

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

虽然@Select注解的值是字符数组,但是真正生效的应该是最后那条SQL语句。这一点请大家要留意一下。

5.3.2 @Select注解动态SQL拼写(重点)

普通的字符串值,只能实现变量的替换功能,实现简单的SQL语句,如下所示,

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

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

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

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

5.4 @Param

@Param : 动态代理接口向映射文件中传递参数的时候,会使用@Param注解,并且如果动态代理接口使用了@Param这个注解,那么映射文件中的标签中可以不用写parameterType属性,可以直接接收@Param中传递来的参数值。

先来看一下动态代理接口中是怎样写的,如下图:

再来看一下与动态代理接口对应的映射文件中是怎样接收参数的,如下图:

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

mapper中的方法:

public User selectUser(@Param("userName") String name,@Param("password") String pwd);

映射到xml中的标签 <select id="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注解,但是两个参数必须使用这个注解。 5.4.2 @Param注解JavaBean对象 SQL语句通过@Param注解中的别名把对象中的属性取出来然后复制 mapper中的方法: public List<User> getAllUser(@Param("user") User u); 映射到xml中的标签

<select id="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。如果是JavaBean最好还是声明一个@Param注解。

标签:Mapper,SpringBoot,Dao,Param,Server,接口,注解,Select
From: https://www.cnblogs.com/lgee/p/16791613.html

相关文章

  • SQLSERVER如何正确修改主机名和IP地址
    一、 服务器改ip1.改hosts文件C:\Windows\System32\Drivers\etc\hosts修改对应ip2.注意是否为原ip指定了端口监听若未使用可不用修改start>MicrosoftSQLServe......
  • springboot+resttemplat+请求拦截器
    参考:https://www.cnblogs.com/kaibindirver/p/15527052.html   创建配置文件来注册拦截器MyMvcConfig1packagecom.config;23importcom.controle.lanj......
  • Springboot整合MQTT
    业务场景硬件采集的数据传入EMQX平台(采用MQTT协议),java通过代码连接MQTT服务器,进行采集数据接收、解析、业务处理、存储入库、数据展示。MQTT是基于发布(Publish)/订......
  • springboot+swagger
    参考:https://www.cnblogs.com/kaibindirver/p/14948036.html目录结构 maven依赖,在pom.xml添加配置1<dependency>2<groupId>io.springfox</group......
  • SQL Server 2016 安装
    数据库安装选择全新安装模式继续安装输入产品秘钥:这里使用演示秘钥进行接受许可规则检测可以后期再开放防火墙对外端口选择需要安装的功能,想省事可以选择【全选......
  • SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务
    1、Slf4j+logback日志SpringBoot框架的默认日志实现:slf4j+logback;默认日志级别:info,对应了实际生产环境日志级别;1.1日志级别#常见的日志框架中,日志级别都包含五种,......
  • CVPR2022 | MLP模拟tone-mapper或成主流? HDR-NeRF自监督重建高动态神经辐射场
    大家好,我是阿潘~今天跟大家分享一个来自CVPR2022的工作,效果太过惊艳啦。​更多CVPR2022工作整理:​​https://github.com/DWCTOD/CVPR2022-Papers-with-Code-Demo​​​​htt......
  • SpringBoot 2.x 集成kaptcha生成图形验证码
    Kaptcha框架介绍谷歌开源的一个可高度配置的实用验证码生成工具验证码的字体/大小/颜色验证码内容的范围(数字,字母,中文汉字!)验证码图片的大小,边框,边框粗细,边框颜色......
  • 初识SpringBoot
    什么是SpringSpring是一个开源框架,2003年兴起的轻量级的Java开发框架。作者:RodJohnsonSpring是为解决企业级应用开发的复杂性而创建的,简化开发。Spring如何简化Java......
  • IIS 绿盟检测到HOST头攻击漏洞的解决: web应用使用SERVER_NAME而非host header。
    https://blog.csdn.net/fightingintherain/article/details/1256648851、漏洞描述2、修复方案(IIS服务端) 1)下载安装url重写工具(官网URLRewrite:TheOfficialMic......