MyBatis 有两种执行 SQL 语句的方式,如下:
- 通过 SqlSession 发送 SQL
- 通过 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 接口的使用就更为简单