MyBatis执行SQL语句的两种方式

简介: MyBatis执行SQL语句的两种方式

SqlSession.mapper和SqlSession.selectXXX对比

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


通过SqlSession发送SQL语句,


例如:sqlSession.slectone()的形式。


通过SqlSession获取Mapper接口,通过Mapper接口发送SQL语句,


例如:sqlSession.getMapper()的形式。


封装工具类

封装一个类SqlSession工具类,用于生产SqlSession对象,下面的例子为了节省代码将会使用我们封装的SqlSessionUtil工具类。

public class SqlSessionUtil {
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = null;
        try {
            // 获取核心配置文件的输入流
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            // 获取SqlSessionFactoryBuilder
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            // 获取SqlSessionFactory
            SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
            // 获取SqlSession对象
            sqlSession = sqlSessionFactory.openSession(true);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return sqlSession;
    }
}

创建Mapper映射文件

<mapper namespace="com.jingchao.mybatis.mapper.UserMapper">
  <select id="selectUserById" resultType="User">
    select * from t_user where id = #{id}
  </select>
</mapper>

创建Mapper接口

public interface UserMapper{
  User selectUserById(@Param("id") Integer id);
}

SqlSession发送SQL语句

selectOne方法表示查询一条语句,通过String类型的命名空间加上Sql语句标签的id来精准定位一条SQL语句。从而实现SQL语句的发送。

SqlSession sqlSession = SqlSessionUtil.getSqlSession();
User user = sqlSession.selectOne("com.jingchao.mybatis.mapper.UserMapper.selectUserById", 1);

Mapper接口发送SQL语句

通过Mapper接口发送SQL是通过动态代理的方式(sqlSession.getMapper(UserMapper.class))获取mapper接口对象,通过调用mapper中的方法,实现发送SQL语句,这样完全避免了通过实现Mapper接口的方式来直接执行对应的SQL语句。


总结:通过Mapper接口发送SQL语句的方式就是MyBatis以代理的方式帮我们创建了接口的实现类

SqlSession sqlSession = SqlSessionUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);

两种方式的对比

通过SqlSession发送SQL语句


不用定义mapper(dao)接口,可以直接通过“ 命名空间 + id ”的方式发送SQL语句


通过SqlSession获取Mapper接口,再通过Mapper接口发送SQL语句


需要定义mapper接口,并在接口中定义抽象方法,通过获取mapper接口对象,再调用方法的形式发送SQL语句。


说明:建议使用Mapper接口发送SQL语句的方式,理由如下:


使用Mapper接口编程可以消除SqlSession带来的功能性代码,提高代码可读性

使用Mapper接口,是完全体现面向对象的语言,更加体现业务的逻辑

使用Mapper接口的方式,可以提前进行代码的错误提示和检验,而直接使用SqlSession的方式,只有在代码运行时才会知道是否产生错误


相关文章
|
3月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
88 0
|
30天前
|
SQL 存储 Kubernetes
Seata常见问题之mybatisplus的批量插入方法报SQL错误如何解决
Seata 是一个开源的分布式事务解决方案,旨在提供高效且简单的事务协调机制,以解决微服务架构下跨服务调用(分布式场景)的一致性问题。以下是Seata常见问题的一个合集
26 0
|
1月前
|
SQL Java 关系型数据库
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法
18 0
|
1月前
|
SQL Java 关系型数据库
MyBatis中的9种常用动态sql标签精妙用法
MyBatis中的9种常用动态sql标签精妙用法
59 0
|
1月前
|
SQL Java 数据库连接
Mybatis拦截器实现带参数SQL语句打印
Mybatis拦截器实现带参数SQL语句打印
|
1月前
|
SQL druid Java
【MyBatis】2、MyBatis 的动态 SQL 和增删改操作
【MyBatis】2、MyBatis 的动态 SQL 和增删改操作
29 0
|
2月前
|
SQL XML Java
【JavaEE进阶】 MyBatis之动态SQL
【JavaEE进阶】 MyBatis之动态SQL
|
2月前
|
存储 SQL 数据安全/隐私保护
Mybatis-Plus 拦截SQL语句实现加解密存储
Mybatis-Plus 拦截SQL语句实现加解密存储
36 0
|
3月前
|
SQL 缓存 Java
JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
64 0
JAVAEE框架技术之8-myBatis ORM框架技术参数和动态SQL语句
|
3月前
|
SQL XML Java
【MyBatis】动态SQL
【MyBatis】动态SQL