浅谈MyBatis执行SQL的两种方式

目录
  • 前言
  • 准备接口和Mapper配置文件:
  • 使用SqlSession 发送 SQL
  • 使用 Mapper 接口发送 SQL
  • 比较两种发送 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执行SQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis执行动态SQL的方法

    大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

  • MyBatis 执行动态 SQL语句详解

    大家基本上都知道如何使用 MyBatis 执行任意 SQL,使用方法很简单,例如在一个 XXMapper.xml 中: <select id="executeSql" resultType="map"> ${_parameter} </select> 你可以如下调用: sqlSession.selectList("executeSql", "select * from sysuser where enabled

  • MyBatis一次执行多条SQL语句的操作

    有个常见的场景:删除用户的时候需要先删除用户的外键关联数据,否则会触发规则报错. 解决办法不外乎有三个: 1.多条sql分批执行: 2.存储过程或函数调用: 3.sql批量执行. 今天我要说的是MyBatis中如何一次执行多条语句(使用mysql数据库). 1.修改数据库连接参数加上allowMultiQueries=true,如: hikariConfig.security.jdbcUrl=jdbc:mysql://xx.xx.xx:3306/xxxxx?characterEncoding=u

  • mybatis 通过拦截器打印完整的sql语句以及执行结果操作

    开发过程中,如果使用mybatis做为ORM框架,经常需要打印出完整的sql语句以及执行的结果做为参考. 虽然mybatis结合日志框架可以做到,但打印出来的通常都是sql和参数分开的. 有时我们需要调试这条sql的时候,就需要把参数填进去,这样未免有些浪费时间. 此时我们可以通过实现mybatis拦截器来做到打印带参数的完整的sql,以及结果通过json输出到控制台. 直接看代码和使用方法吧: MyBatis拦截器打印不带问号的完整sql语句拦截器 import java.text.DateF

  • MyBatis直接执行SQL的工具SqlMapper

    可能有些人也有过类似需求,一般都会选择使用其他的方式如Spring-JDBC等方式解决. 能否通过MyBatis实现这样的功能呢? 为了让通用Mapper更彻底的支持多表操作以及更灵活的操作,在2.2.0版本增加了一个可以直接执行SQL的新类SqlMapper. 我们来了解一下SqlMapper. SqlMapper提供的方法 SqlMapper提供了以下这些公共方法: Map<String,Object> selectOne(String sql) Map<String,Object&

  • 详解MyBatis直接执行SQL查询及数据批量插入

    一.直接执行SQL查询: 1.mappers文件节选 <resultMap id="AcModelResultMap" type="com.izumi.InstanceModel"> <result column="instanceid" property="instanceID" jdbcType="VARCHAR" /> <result column="insta

  • MyBatis执行Sql的流程实例解析

    这篇文章主要介绍了MyBatis执行Sql的流程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本博客着重介绍MyBatis执行Sql的流程,关于在执行过程中缓存.动态SQl生成等细节不在本博客中体现,相应内容后面再单独写博客分析吧. 还是以之前的查询作为列子: public class UserDaoTest { private SqlSessionFactory sqlSessionFactory; @Before public v

  • 浅谈MyBatis执行SQL的两种方式

    目录 前言 准备接口和Mapper配置文件: 使用SqlSession 发送 SQL 使用 Mapper 接口发送 SQL 比较两种发送 SQL 方式 前言 本文介绍MyBatis执行SQL语句的2种方式:SqlSession和Mapper接口以及它们的区别. 准备接口和Mapper配置文件: 定义UserMapper接口: package cn.cvs.dao; import cn.cvs.pojo.User; import java.util.List; public interface U

  • 浅谈ubuntu执行.sh文件几种方式区别

    前言 不同的script执行方式会造成不一样的结果,尤其对bash的环境影响很大,脚本的执行方式有大概以下几种方式. 首先写一个简单的test.sh文件: #!/bin/bash read -p "Please input your first name:" firstname read -p "Please input your last name:" lastname echo -e "\nYour full name is: $firstname $

  • 浅谈Mybatis之参数传递的几种姿势

    目录 I. 环境配置 1. 项目配置 2. 数据库表 II. 参数传递 1. @Param注解 2. 单参数 3. 多参数 3. Map传参 4. POJO对象 5. 简单参数 + Map参数 6.小结 III. 不能错过的源码和相关知识点 在mybatis的日常开发中,mapper接口中定义的参数如何与xml中的参数进行映射呢?除了我们常用的@Param注解之外,其他的方式是怎样的呢? I. 环境配置 我们使用SpringBoot + Mybatis + MySql来搭建实例demo spri

  • 浅谈java中String的两种赋值方式的区别

    类似普通对象,通过new创建字符串对象.String str = new String("Hello"); 内存图如下图所示,系统会先创建一个匿名对象"Hello"存入堆内存(我们暂且叫它A),然后new关键字会在堆内存中又开辟一块新的空间,然后把"Hello"存进去,并且把地址返回给栈内存中的str, 此时A对象成为了一个垃圾对象,因为它没有被任何栈中的变量指向,会被GC自动回收. 直接赋值.如String str = "Hello&

  • 浅谈mybatis中SQL语句给boolean类型赋值问题

    我就废话不多说了,大家还是直接看代码吧~ <select id="getBiTree" parameterType="String" resultMap="MenuVoListMap"> SELECT m.menu_id , m.parent_id , m.`name` , 1 opens FROM menu m WHERE m.is_valid = 1 AND (m.type = 0 or m.type = 1) and m.men

  • Mysql效率优化定位较低sql的两种方式

    关于mysql效率优化一般通过以下两种方式定位执行效率较低的sql语句. 通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件,通过查看这个日志文件定位效率较低的 SQL . 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用 show processlis

  • 浅谈SpringBoot主流读取配置文件三种方式

    读取配置SpringBoot配置文件三种方式 一.利用Bean注解中的Value(${})注解 @Data @Component public class ApplicationProperty { @Value("${application.name}") private String name; } 该方式可以自动读取当前配置文件appliation.yml  或者application.properties中的配置值 区别在于读取yml文件时候支持中文编码,peoperties需

  • mysql命令行中执行sql的几种方式总结

    1.直接输入sql执行 MySQL> select now(); +---------------------+ | now() | +---------------------+ | 2013-09-18 13:55:45 | +---------------------+ 1 row in set (0.00 sec) 2.执行编写好的sql脚本 mysql> source H:/1.sql +---------------------+ | now() | +--------------

  • 浅谈PostgreSQL表分区的三种方式

    目录 一.简介 二.三种方式 2.1.Range范围分区 2.2.List列表分区 2.3.Hash哈希分区 三.总结 一.简介 表分区是解决一些因单表过大引用的性能问题的方式,比如某张表过大就会造成查询变慢,可能分区是一种解决方案.一般建议当单表大小超过内存就可以考虑表分区了.PostgreSQL的表分区有三种方式: Range:范围分区: List:列表分区: Hash:哈希分区. 本文通过示例讲解如何进行这三种方式的分区. 二.三种方式 为方便,我们通过Docker的方式启动一个Postg

  • SpringBoot 在项目启动之后执行自定义方法的两种方式小结

    目录 SpringBoot 项目启动之后执行自定义方法的两种方式 方式一 实现 CommandLineRunner 接口 方式二 实现 ApplicationRunner 接口 二者区别 Springboot 项目启动后执行某些自定义代码 SpringBoot 项目启动之后执行自定义方法的两种方式 在测试配置中心的配置时,想在项目启动成功之后打印配置项,然后需要执行自定义的类 一般项目中也会在这个地方进行初始化数据的一些操作 方式一 实现 CommandLineRunner 接口 自定义类并实现

随机推荐