MyBatis执行SQL的两种方式

MyBatis 有两种执行 SQL 语句的方式,如下:

  1. 通过 SqlSession 发送 SQL
  2. 通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL

SqlSession发送SQL

有映射器之后就可以通过 SqlSession 发送 SQL 了。我们以 getWebsite 这条 SQL 为例看看如何发送 SQL。

java 复制代码
Website website = (Website)sqlSession.selectOne("net.biancheng.mapper.WebsiteMapper.getWebsite",1);

MyBatis 常用的查询方法有 2 种,分别为 selectOne 和 selectList。

1)selectOne

selectOne 方法表示使用查询并且只返回一个对象,必须指定查询条件。只能查询 0 或 1 条记录,大于 1 条记录则运行错误。常用格式如下(也有其它重载方法,根据需要选择)。

java 复制代码
sqlSession.selectOne(String arg0, Object arg1)
2)selectList

selectList 方法表示使用查询并且返回一个列表。可以查询 0 或 N 条记录。常用格式如下。

java 复制代码
sqlSession.selectOne(String arg0)

也可指定参数

java 复制代码
sqlSession.selectList(String arg0, Object arg1)

以上语法格式中,String 对象由一个命名空间加 SQL id 组合而成,它完全定位了一条 SQL,这样 MyBatis 就会找到对应的 SQL。Object 对象为需要传递的参数,也就是查询条件。

selectOne 实现的 selectList 都可以实现,即 list 中只有一个对象。但 selectList 能实现的,selectOne 不一定能实现。

Mapper接口发送 SQL

SqlSession 还可以获取 Mapper 接口,通过 Mapper 接口发送 SQL

java 复制代码
WebsiteMapper websiteMapper = sqlSession.getMapper(WebsiteMapper.class);
Website website = websiteMapper.getWebsite(1);

通过 SqlSession 的 getMapper 方法获取一个 Mapper 接口,然后就可以调用它的方法了。因为 XML 文件或者接口注解定义的 SQL 都可以通过"类的全限定名+方法名"查找,所以 MyBatis 会启用对应的 SQL 运行,并返回结果。

区别

上面分别讲解了 MyBatis 两种发送 SQL 的方式,一种用 SqlSession 直接发送,另外一种通过 SqlSession 获取 Mapper 接口再发送。笔者建议采用 Mapper 接口发送 SQL 的方式,理由如下:

  • 使用 Mapper 接口编程可以消除 SqlSession 带来的功能性代码,提高可读性,而 SqlSession 发送 SQL,需要一个 SQL id 去匹配 SQL,比较晦涩难懂。
  • 使用 Mapper 接口,类似 websiteMapper.getWebsite(1) 则是完全面向对象的语言,更能体现业务的逻辑。
  • 使用 websiteMapper.getWebsite(1) 方式,IDE 会提示错误和校验,而使用 sqlSession.selectOne("getWebsite",1L) 语法,只有在运行中才能知道是否会产生错误。

目前使用 Mapper 接口编程已成为主流,尤其在 Spring 中运用 MyBatis 时,Mapper 接口的使用就更为简单

相关推荐
Java致死33 分钟前
设计模式Java
java·开发语言·设计模式
源码方舟36 分钟前
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
java·spring boot·后端
2401_cf4 小时前
为什么hadoop不用Java的序列化?
java·hadoop·eclipse
帮帮志4 小时前
idea整合maven环境配置
java·maven·intellij-idea
LuckyTHP4 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
无声旅者7 小时前
深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南
java·ide·ai·intellij-idea·ai编程·continue·openapi
不知几秋7 小时前
sqlilab-Less-18
sql
Ryan-Joee7 小时前
Spring Boot三层架构设计模式
java·spring boot
Hygge-star7 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
dkmilk7 小时前
Tomcat发布websocket
java·websocket·tomcat