MyBatis select标签的使用示例

 更新时间:2023年10月07日 10:28:00   作者:小日子呀  
MyBatis中,select 标签是最常用也是功能最强大的 SQL 语言,用于执行查询操作,本文就来介绍了MyBatis select标签的使用示例,具有一定的参考价值,感兴趣的可以了解一下

MyBatis 中,select 标签是最常用也是功能最强大的 SQL 语言,用于执行查询操作,select 示例语句如下。

<select id="selectAllWebsite" resultType="net.cc.po.Website" parameterType="string">
    SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',#{name},'%')
</select>

以上是一个 id 为 selectAllWebsite 的映射语句,参数类型为 string,返回结果类型为 Website 

执行 SQL 语句时可以定义参数,参数可以是一个简单的参数类型,例如 int、float、String;也可以是一个复杂的参数类型,例如 JavaBean、Map 等。MyBatis 提供了强大的映射规则,执行 SQL 后,MyBatis 会将结果集自动映射到 JavaBean 中。

参数的传递使用#{参数名},相当于告诉 MyBatis 生成 PreparedStatement 参数。对于 JDBC,该参数会被标识为“?”。以上 SQL 语句可以使用 JDBC 实现,实现代码如下。

String sql = "SELECT id,NAME,url FROM website WHERE NAME LIKE CONCAT ('%',?,'%')";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1,userName);

​select标签常用属性

<select>标签的常用属性

属性名称描 述备注
id它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用如果命名空间+id不唯一,那么 MyBatis 抛出异常
parameterType表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数支持基本数据类型和 JavaBean、Map 等复杂数据类型
resultTypeSQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一-
resultMap它是映射集的引用,与 <resultMap> 元素一起使用,返回时可以使用 resultType 或 resultMap 之一是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等
flushCache用于设置在调用 SQL 语句后是否要求 MyBatis 清空之前查询的本地缓存和二级缓存默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存
useCache启动二级缓存的开关,默认值为 true,表示将査询结果存入二级缓存中-
timeout用于设置超时参数,单位是秒(s),超时将抛出异常-
fetchSize获取记录的总条数设定默认值是数据库厂商提供的 JDBC 驱动所设置的条数
statementType告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement)-
resultSetType这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新)-

传递多个参数

现在需要根据 id 和 name 来模糊查询网站信息,显然这涉及到了两个参数。给映射器传递多个参数分为以下三种方法。

  • 使用Map传递参数
  • 使用注解传递参数
  • 使用JavaBean传递参数

1. 使用Map传递参数

<!-- 根据name和url模糊查询 -->
<select id="selectWebsiteByMap" resultType="net.cc.po.Website" parameterType="map">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>

在 WebsiteMapper 接口中,方法如下。

public List<Website> selectWebsiteByMap(Map<String, String> params);

测试 

Map<String,String> paramsMap = new HashMap<String,String>();
paramsMap.put("name","编程");
paramsMap.put("url","cc");
websiteMapper.selectWebsiteByMap(paramsMap);

使用 Map 传递参数虽然简单易用,但是由于这样设置参数需要键值对应,业务关联性不强,开发人员需要深入到程序中看代码,造成可读性下降。

2. 使用注解传递参数

<select id="selectWebsiteByAn" resultType="net.cc.po.Website">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>

 接口方法:

public List<Website> selectWebsiteByAn(@Param("name") String name, @Param("url") String url);

当我们把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数,提高了参数可读性。但是如果这条 SQL 拥有 10 个参数的查询,就会造成可读性下降,增强了代码复杂性。

3. 使用JavaBean传递参数

通过 JavaBean 传递多个参数的方式。

<select id="selectWebsiteByAn" resultType="net.cc.po.Website">
    SELECT id,NAME,url FROM website
    WHERE name LIKE CONCAT ('%',#{name},'%')
    AND url LIKE CONCAT ('%',#{url},'%')
</select>
public List<Website> selectWebsiteByAn(Website website);

区别

以上 3 种方式的区别如下。

  • 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
  • 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
  • 当参数个数大于 5 个时,建议使用 JavaBean 方式。

到此这篇关于MyBatis select标签的使用示例的文章就介绍到这了,更多相关MyBatis select标签内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Springboot中整合knife4j接口文档的过程详解

    Springboot中整合knife4j接口文档的过程详解

    knife4j就swagger的升级版API文档的一个框架,但是用起来比swagger方便多了,UI更加丰富,这篇文章主要介绍了Springboot中整合knife4j接口文档,需要的朋友可以参考下
    2022-04-04
  • SpringBoot任务之定时任务相关知识总结

    SpringBoot任务之定时任务相关知识总结

    今天给大家整理的文章是SpringBoot定时任务的相关知识点,文中有非常详细的介绍及代码示例,对正在学习SpringBoot任务的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • Java中使用@CrossOrigin和Proxy解决跨域问题详解

    Java中使用@CrossOrigin和Proxy解决跨域问题详解

    这篇文章主要介绍了Java中使用@CrossOrigin和Proxy解决跨域问题详解,在Web开发中,如果前端页面和后端接口不在同一个域名下,就会发生跨域请求的问题,同源策略是浏览器的一种安全策略,它限制了来自不同源的客户端脚本在浏览器中运行时的交互,需要的朋友可以参考下
    2023-12-12
  • Spring源码解析之编程式事务

    Spring源码解析之编程式事务

    今天给大家带来的是关于Java Spring的相关知识,文章围绕着Spring编程式事务展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • java实现json字符串格式化处理的工具类

    java实现json字符串格式化处理的工具类

    这篇文章主要为大家详细介绍了如何使用java实现json字符串格式化处理的工具类,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • eclipse实现Schnorr数字签名

    eclipse实现Schnorr数字签名

    这篇文章主要为大家详细介绍了eclipse实现Schnorr数字签名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 使用SpringBoot设置虚拟路径映射绝对路径

    使用SpringBoot设置虚拟路径映射绝对路径

    这篇文章主要介绍了使用SpringBoot设置虚拟路径映射绝对路径的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • ArrayList和LinkedList的区别、扩容机制以及底层的实现方式

    ArrayList和LinkedList的区别、扩容机制以及底层的实现方式

    这篇文章主要介绍了ArrayList和LinkedList的区别、扩容机制以及底层的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java中关于文件路径读取问题的分析

    Java中关于文件路径读取问题的分析

    今天给大家带来的是关于Java的相关知识,文章围绕着Java中关于文件路径读取问题展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Java之SpringCloudAlibaba Sentinel组件案例讲解

    Java之SpringCloudAlibaba Sentinel组件案例讲解

    这篇文章主要介绍了Java之SpringCloudAlibaba Sentinel组件案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07

最新评论