MyBatis执行SQL的两种方式
Posted 花伤情犹在
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis执行SQL的两种方式相关的知识,希望对你有一定的参考价值。
前言
本文介绍MyBatis执行SQL语句的2种方式:SqlSession和Mapper接口以及它们的区别。
准备接口和Mapper配置文件:
定义UserMapper接口:
package cn.cvs.dao;
import cn.cvs.pojo.User;
import java.util.List;
public interface UserMapper {
//查找所有的用户信息
public List<User> findAll();
//查询用户的数量
public int selectCount();
}
定义UserMapper配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.cvs.dao.UserMapper">
<!-- 查找所有的用户信息-->
<select id="findAll" resultType="cn.cvs.pojo.User">
SELECT * FROM t_sys_user
</select>
<!-- 查询用户的数量-->
<select id="selectCount" resultType="int">
SELECT count(1) FROM t_sys_user
</select>
</mapper>
指定sqlMapConfig其mapper文件的位置:
在sqlMapConfig.xml文件里面添加<mappers>
成对标签,然后里加上成对的mapper
标签,使用mapper的resource属性指定mapper文件的路径,这个路径是从target/classes路径开启的。
- 使用注意:
resource=“mapper文件的路径,使用/
分割路径”,记住不是".
"
一个mapper resource 指定一个mapper文件
代码模板:
<mappers>
<mapper resource="mapper文件的路径"/>
</mappers>
使用SqlSession 发送 SQL
指定要执行的sql语句的 id:
sql的id = namespace+"."+ select|update|insert|delete标签的id属性值
例如:
namespace为cn.cvs.dao.UserMapper指定id为selectCount的sql语句
格式:命名空间(namespace)+点(.)+id属性值(id)
格式:cn.cvs.dao.UserMapper.selectCount
这样 MyBatis 就会找到对应的 SQL
通过SqlSession的方法,执行sql语句
List<User> list = sqlSession.selectList("cn.cvs.dao.UserMapper.findAll");
selectList 方法表示使用查询并且只返回一个List集合
如果在 MyBatis 中只有一个 id 为 selectCount 的 SQL,那么也可以简写为:
List<User> list = sqlSession.selectList("selectCount");
这是 MyBatis 前身 iBatis 所留下的方式。
使用 Mapper 接口发送 SQL
用 Mapper 接口发送SQL就是以动态代理的方式sqlsession.getMapper(dao.class)获取dao接口对象,执行对应方法即可。这样做不用我们再去写dao接口的实现类就可以直接执行对应sql语句,其实就是MyBatis以代理的方式帮我们创建了接口的实现类。
Mapper规范:
namespace要写dao接口的全限定名称,标签id要写接口方法名
通过 SqlSession 获取 Mapper 接口,通过 Mapper 接口发送 SQL :
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> list2=mapper.findAll();
通过 SqlSession 的 getMapper 方法来获取一个 Mapper 接口,就可以调用它的方法了。因为 XML文件或者接口注解定义的 SQL 都可以通过“类的全限定名+方法名”查找,所以 MyBatis 会启用对应的 SQL 进行运行,并返回结果。
比较两种发送 SQL 方式
-
用 SqlSession 接口发送 SQL :
无需定义dao接口,直接通过"命名空间+id
"调用对应的SQL
List list = sqlSession.selectList(“cn.cvs.dao.UserMapper.findAll”); -
用 Mapper 接口发送 SQL :
通过 SqlSession 获取 Mapper 接口
格式:接口类名 对象名 = sqlSession.getMapper(接口类名.class);
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
调用对应的SQL
List list2=mapper.findAll();
建议采用 SqlSession 获取 Mapper 接口的方式:
使用 Mapper 接口编程可以消除 SqlSession 带来的功能性代码,提高可读性,而 SqlSession 发送 SQL,需要一个> SQL id 去匹配 SQL,比较晦涩难懂。
以上是关于MyBatis执行SQL的两种方式的主要内容,如果未能解决你的问题,请参考以下文章
MyBatis学习笔记 —— MyBatis获取参数值的两种方式