MyBatis select标签
select 示例语句如下。
select id= selectAllWebsite resultType= net.biancheng.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 中。
为了使数据库的查询结果和返回值类型中的属性能够自动匹配,通常会对 MySQL 数据库和 JavaBean 采用同一套命名规则,即 Java 命名驼峰规则,这样就不需要再做映射了(数据库表字段名和属性名不一致时需要手动映射)。
参数的传递使用 #{参数名},相当于告诉 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 标签中常用的属性。
表示传入 SQL 语句传入参数类型的全限定名或别名。它是一个可选属性,MyBatis 能推断出具体传入语句的参数 支持基本数据类型和 JavaBean、Map 等复杂数据类型
SQL 语句执行后返回的类型(全限定名或者别名)。如果是集合类型,返回的是集合元素的类型,返回时可以使用 resultType 或 resultMap 之一
它是映射集的引用,与 resultMap 元素一起使用,返回时可以使用 resultType 或 resultMap 之一 是 MyBatis 最复杂的元素,可以配置映射规则、级联、typeHandler 等
默认值为 false,如果设置为 true,则任何时候只要 SQL 语句被调用都将清空本地缓存和二级缓存
告诉 MyBatis 使用哪个 JDBC 的 Statement 工作,取值为 STATEMENT(Statement)、 PREPARED(PreparedStatement)、CALLABLE(CallableStatement)
这是针对 JDBC 的 ResultSet 接口而言,其值可设置为 FORWARD_ONLY(只允许向前访问)、SCROLL_SENSITIVE(双向滚动,但不及时更新)、SCROLLJNSENSITIVE(双向滚动,及时更新)
传递多个参数
现在需要根据 id 和 name 来模糊查询网站信息,显然这涉及到了两个参数。给映射器传递多个参数分为以下三种方法。
!-- 根据name和url模糊查询网站信息 -- select id= selectWebsiteByMap resultType= net.biancheng.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 , biancheng websiteMapper.selectWebsiteByMap(paramsMap);
使用 Map 传递参数虽然简单易用,但是由于这样设置参数需要键值对应,业务关联性不强,开发人员需要深入到程序中看代码,造成可读性下降。
2. 使用注解传递参数使用 MyBatis 的注解 @Param() 传递参数,如下所示。
!-- 根据name和url模糊查询网站信息 -- select id= selectWebsiteByAn resultType= net.biancheng.po.Website SELECT id,NAME,url FROM website WHERE name LIKE CONCAT ( % ,#{name}, % ) AND url LIKE CONCAT ( % ,#{url}, % ) /select
WebsiteMapper 接口中方法如下。
public List Website selectWebsiteByAn(@Param( name ) String name, @Param( url ) String url);
当我们把参数传递给后台时,MyBatis 通过 @Param 提供的名称就会知道 #{name} 代表 name 参数,提高了参数可读性。但是如果这条 SQL 拥有 10 个参数的查询,就会造成可读性下降,增强了代码复杂性。
3. 使用JavaBean传递参数在参数过多的情况下,MyBatis 允许组织一个 JavaBean,通过简单的 setter 和 getter 方法设置参数,提高可读性。如下所示。
!-- 根据name和url模糊查询网站信息 -- select id= selectWebsiteByAn resultType= net.biancheng.po.Website SELECT id,NAME,url FROM website WHERE name LIKE CONCAT ( % ,#{name}, % ) AND url LIKE CONCAT ( % ,#{url}, % ) /select
WebsiteMapper 接口中方法如下。
public List Website selectWebsiteByAn(Website website);
这就是通过 JavaBean 传递多个参数的方式。
以上 3 种方式的区别如下。
使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。 使用 @Param 注解传递参数会受到参数个数的影响。当 n 5 时,它是最佳的传参方式,因为它更加直观;当 n 5 时,多个参数将给调用带来困难。 当参数个数大于 5 个时,建议使用 JavaBean 方式。
相关文章
- MyBatis-Generator例子简介
- Mybatis实现Oracle 分页「建议收藏」
- mybatis的常用动态sql标签
- Spring+MyBatis实例详解「建议收藏」
- mybatis trim标签
- MyBatis Plus分页出现total为0的问题
- MyBatis框架:第二章:传统mybatis的hello world 示例
- MyBatis框架:第三章:传统方式mybatis的增,删,改,查实现
- MyBatis框架:第五章:源码解析及Mapper接口方式的mybatis的增,删,改,查实现
- MyBatis框架:第十一章:mybatis 逆向工程
- MyBatis框架:第十一章:mybatis 逆向工程
- MyBatis框架:第五章:源码解析及Mapper接口方式的mybatis的增,删,改,查实现
- MyBatis框架:第三章:传统方式mybatis的增,删,改,查实现
- mybatis if标签判断boolean等于true或者flase
- Mybatis-Plus中Mapper CRUD接口
- Mybatis是如何向Spring注册Mapper的?
- mybatis中sql标签、where标签、foreach标签用法详解数据库
- spring+mybatis 多数据源切换详解编程语言
- mybatis foreach报错It was either not specified and/or could not be found for the javaType Type handler详解编程语言
- spring boot集成mybatis 自动生成实体类和mapper文件、Dao层详解编程语言
- MyBatis中settings属性配置详解
- MyBatis choose、when和otherwise标签