MyBatis带参查询的方法详解

#{}占位符

类似于jdbc中通过PreparedStatement进行操作的方式, 会将sql语句中需要参数的位置使用?进行占位,后续由传进来的参数进行参数的绑定。?处绑定的都是值,不能指定表的列,转换成sql时表名会被当成字符串,会出错,防止sql注入。

select username,age,password from 'tb_user'

简单类型参数

简单类型指的是: 基本数据类型, 包装类型, String, java.sql.*。当参数是简单类型时, MyBatis会忽略SQL语句中参数的个数和占位符的名称, 然后将参数进行自动绑定. parameterType属性可以定义参数的类型, 如果定义, 传参时要求参数类型必须和指定的类型一致, 否则抛出ClassCastException。

<select id="selBaseType" resultType="pojo.User" parameterType="java.lang.Integer">
 select * from tb_users where id=#{id}
</select>
User user=sqlSession.selectOne("selBaseType",1);

Map类型参数

当参数是Map集合时, SQL语句中的#{}里应该写Map集合的key值,MyBatis会通过key只找到value然后进行参数绑定。如果key不存在, 不会报错,会使用null进行参数绑定。

<select id="selByMap" resultType="pojo.User">
 select * from tb_users where username=#{username} and password=#{password}
</select>
Map<String,String> map=new HashMap<>();
map.put("username","zhangsan");
map.put("password","123456");
User user=sqlSession.selectOne("selByMap",map);

对象类型参数传递

当参数是对象类型时,SQL语句中的#{}里应该写对象的getter方法对应的属性名。当getter方法不存在时, 抛出异常。

<select id="selByObject" resultType="pojo.User">
 select * from tb_users where username=#{username} and password=#{password}
</select>
User user1=new User();
user1.setUsername("lisi");
user1.setPassword("123456");
User user=sqlSession.selectOne("selByObject",user1);

${}

类似于jdbc中通过Statement进行操作的方式, 会直接将传递的参数和SQL语句进行字符串的拼接。 一般当SQL语句结构不确定时使用。
当表名不确定,条件不确定,排序规则不确定的时候,不能使用#{},应该换做${}。对于简单数据类型,应尽量使用#{},避免错误。
${}需要加''传入的参数才能变成字符串,不然会被当成列名。

select * from tb_users where username='${username}' and password='${password}'

如果${123}会当成整型数字替换占位,此时传入的参数无效。

到此这篇关于MyBatis带参查询的文章就介绍到这了,更多相关MyBatis带参查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解MyBatis模糊查询LIKE的三种方式

    模糊查询也是数据库SQL中使用频率很高的SQL语句,使用MyBatis来进行更加灵活的模糊查询. 直接传参法 直接传参法,就是将要查询的关键字keyword,在代码中拼接好要查询的格式,如%keyword%,然后直接作为参数传入mapper.xml的映射文件中. public void selectBykeyWord(String keyword) { String id = "%" + keyword + "%"; String roleType = "

  • mybatis 实现 SQL 查询拦截修改详解

    前言 截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法. Mybatis拦截器设计的一个初衷就是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑.比如我想针对所有的SQL执行某个固定的操作,针对SQL查询执行安全检查,或者记录相关SQL查询日志等等. Mybatis为我们提供了一个Interceptor接口,可以实现自定义的拦截器. public inter

  • mybatis中查询结果为空时不同返回类型对应返回值问题

    今天在别人的代码基础上实现新需求,看到对于mybatis查询结果的判断不是很正确,如果查询结果为空就会异常,不知道大家有没有这样的疑惑:mybatis中resultType有多种返回类型,对于每种不同类型,查询结果为空时dao接口的返回值是一样的吗?接下来我就总结一下常见的几种情况. 第一种:resultType为基本类型,如string(在此暂且把string归纳为基本类型) 如果select的结果为空,则dao接口返回结果为null 第二种,resultType为基本类型,如int 后台报异

  • 结合mybatis-plus实现简单不需要写sql的多表查询

    项目地址: GITHUB (本地下载) java mybatis 多表查询 简介 实现简单的实体类操作多表,  首先你的项目是使用了mybatis-plus 才可以使用 设计说明 如何关联表? 找第一张表注解为 TableId (mybatis-plus 注解)的属性名, 到每二张表找同样的属性名, 如果没找到,反过来找,如果还没找到,挨个属性找.以此类推,实现关联的前提条件是 主从表的关联例名必须一样 // user 表 @TableId private Integer userId // a

  • Oracle使用MyBatis中RowBounds实现分页查询功能

    Oracle中分页查询因为存在伪列rownum,sql语句写起来较为复杂,现在介绍一种通过使用MyBatis中的RowBounds进行分页查询,非常方便. 使用MyBatis中的RowBounds进行分页查询时,不需要在 sql 语句中写 offset,limit,mybatis 会自动拼接 分页sql ,添加 offset,limit,实现自动分页. 需要前台传递参数currentPage和pageSize两个参数,分别是当前页和每页数量,controller层把参数传递给service层即可

  • MyBatis带参查询的方法详解

    #{}占位符 类似于jdbc中通过PreparedStatement进行操作的方式, 会将sql语句中需要参数的位置使用?进行占位,后续由传进来的参数进行参数的绑定.?处绑定的都是值,不能指定表的列,转换成sql时表名会被当成字符串,会出错,防止sql注入. select username,age,password from 'tb_user' 简单类型参数 简单类型指的是: 基本数据类型, 包装类型, String, java.sql.*.当参数是简单类型时, MyBatis会忽略SQL语句中

  • MyBatis SELECT基本查询实现方法详解

    1.返回一个LIST <!-- public List<Employee> getEmpsByLastNameLike(String lastName); --> <!--resultType:如果返回的是一个集合,要写集合中元素的类型 --> <select id="getEmpsByLastNameLike" resultType="com.atguigu.mybatis.bean.Employee"> selec

  • Mybatis 逆向工程的三种方法详解

    Mybatis 逆向工程   逆向工程通常包括由数据库的表生成 Java 代码 和 通过 Java 代码生成数据库表.而Mybatis 逆向工程是指由数据库表生成 Java 代码.   Mybaits 需要程序员自己编写 SQL 语句,但是 Mybatis 官方提供逆向工程可以针对单表自动生成 Mybaits 执行所需要的代码,包括 POJO.Mapper.java.Mapper.xml -. 一.通过 Eclipse 插件完成 Mybatis 逆向工程 1. 在线安装 Eclipse 插件  

  • MyBatis流式查询的使用详解

    目录 1.应用场景说明 2.模拟excel导出场景 1.创建海量数据的sql脚本 2.MyBatis流式查询 3.Excel通用导出工具类 1.Excel导入导出工具类 2.Excel数据读取监听器 3.Excel读取数据完成回调接口 4.拆分List集合工具类 4.测试结果 5.遗留问题待处理 1.应用场景说明 MyBatis preview: JDBC三种读取方式: 1.一次全部(默认):一次获取全部. 2.流式:多次获取,一次一行. 3.游标:多次获取,一次多行. 在开发中我们经常需要会遇

  • MySQL联合查询实现方法详解

    联合查询简单说 就是将两次查询合并在一起 例如 我们这里有一个用户表 我们先编写一段SQL select name from staff where age > 21; 查询年龄大于21的 输出结果如下 然后我们再写一段sql select name from staff where status =1; 查询 status 状态字段等于1 的 输出效果如下 然后我们可以二合一一下 select name from staff where age > 21 union all select n

  • 一篇文章带你入门Java方法详解

    目录 案例1 案例2 概念 如何定义方法 方法说明 方法实例 无参无返回值 有参无返回值 无参有返回值 有参有返回值 方法的调用 1.非静态方法 2.静态方法 小AD秀技术 总结 案例1 ♀ 小AD:明哥,刚才那个打野过来趁线你为啥不喷!那么友好的态度,被嫂子制裁了? ♂ 明世隐:你啥呀,你没看到人打野头上冒金光啊,还喷! ♀ 小AD:什么冒金光,如来佛祖? ♂ 明世隐:金色打野刀啊,那个刀不趁线的. ♀ 小AD:哦这样啊,难怪我说你不正常. ♂ 明世隐:分析一下来. 分析 打野刀 过程 结果

  • Mongoose实现虚拟字段查询的方法详解

    前言 不知道大家知不知道,mongoose为数据模型提供了虚拟属性, 借此可以更加一致地.方便地读写模型属性,类似于C#或Java中的访问器. 我们知道虚拟属性在Query阶段一定是查不到的,因为事实上MongoDB并没有存储这些属性. 但是否可以通过一个拦截器来实现虚拟属性的查询呢? 这个问题很有趣,而且在很多场景下都相当方便.例如: 实现一个暴力的全文检索时,需要对多个字段匹配统一查询词,该查询词可抽象为虚拟属性: 多处都需要进行同一个复杂条件的查询时,可以用虚拟属性封装该查询条件. 事实上

  • SpringData关键字查询实现方法详解

    一.创建项目并导入Jap相关依赖 1.1 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifac

  • 在php7中MongoDB实现模糊查询的方法详解

    前言 在实际开发中, 有不少的场景需要使用到模糊查询, MongoDB shell 模糊查询很简单: db.collection.find({'_id': /^5101/}) 上面这句就是查询_id以'5101'开始的内容. 在老的MogoDB中模糊查询挺简单的,这里简单记录下模糊查询的操作方式: 命令行下: db.letv_logs.find({"ctime":/uname?/i}); php操作 $query=array("name"=>new Mongo

随机推荐