目录 背景 JDBC 中的 ResultSet 简介 简单映射 回归最初的问题:查询结果为空时的返回值 结论 背景 一行数据记录如何映射成一个 Java 对象,这种映射机制是 MyBatis 作为 ORM...这个可以关注 mybatis 配置中的 returnInstanceForEmptyRow 属性,它默认为 false。 当返回行的所有列都是空时,MyBatis 默认返回 null。...当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集(如集合或关联)。...回归最初的问题:查询结果为空时的返回值 | 返回结果为单行数据 可以从 ResultSetHandler的handleResultSets 方法开始分析。...所以不管是集合类型还是普通对象,Mybatis 都会先初始化一个 List 存储结果,然后返回值为普通对象且查为空的时候,selectOne 会判断然后直接返回 NULL 值。
以下语句表示为可以按照网站名称(name)或者网址(url)进行模糊查询。如果您不输入名称或网址,则返回所有的网站记录。但是,如果你传递了任意一个参数,它就会返回与给定参数相匹配的记录。...,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch 语句 select id="selectUserByChoose" resultType...> 在上面代码中,我们有三个条件,id,username,sex,只能选择一个作为查询条件 如果 id 不为空,那么查询语句为:select * from user where id=?...; 如果 id 为空,那么看username 是否为空,如果不为空,那么语句为 select * from user where username=?...; 如果 username 为空,那么查询语句为 select * from user where sex=?
执行完 SQL,MyBatis 也支持参数映射,可以通过自动映射来把返回的结果集绑定到 JavaBean 中。...自动映射 「自动映射」 也是 MyBatis 的一个特点,当autoMapperingBehavior 不设置为 NONE 的时候,MyBatis 会给我们提供自动映射的功能。...resultMap 结果集映射 在上面我们看到的查询返回的定义都是使用 resultType来映射结果集,其实还有一个标签也能用来映射结果集,那就是使用 resultMap 来映射结果集,而且功能更加强大...当参数和 SQL 完全一样的情况下,使用同一个 SqlSession 对象调用同一个 mapper 方法的时候,往往只会执行一次 SQL,因为在第一次查询后,MyBatis 会将结果放在缓存中,下次再查询的时候...为空而remark不为空,那么就用remark作用查询条件,如果两者都为空,就查询name不是空的记录。
当要构造动态sql语句时为了防止sql语句结构不当,所以加上where 1=1 ,这样SQL语句不会报错,后面的逻辑也很简单,判断#{usex}不为空且不为""的时候在后面添加SQL。...,当不为usex空时,仅执行了这个 usex=#{usex} where uid = #{uid} 在 元素中,当uname不为空时,SQL语句自动加上...如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array。 如果传入的参数是多个时,需要把它们封装成一个Map,当然单参数也可以封装成Map。...结果如图: ? 补充:当传入多个参数,即foreach的参数为map类型时候 我们有时候需要多个条件的查询语句时候,如:select * from user where usex = ?
后端分页 在ajax请求中指定页码(pageNum)和每页的大小(pageSize),后端查询出当页的数据返回,前端只负责渲染。...-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 --> select count语句,一条分页语句)适用于查询分页时数据发生变动,需要将实时的变动信息反映到分页结果上 Page时返回全部结果,false时分页,null时用默认配置 5)、默认值 //RowBounds参数offset作为PageNum使用 - 默认不使用 private... = false; //当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果 private boolean pageSizeZero
timeout 这个设置驱动程序等待数据库返回请求结果,并抛出异常时间的最大等待值。默认不设置(驱动自行处理) fetchSize 这是暗示驱动程序每次批量返回的结果行数。...timeout 这个设置驱动程序等待数据库返回请求结果, 并抛出异常时间的最大等待值。默认不设置(驱动自行处理)。...如果 mode 为 OUT (或 INOUT) ,而且 jdbcType 为 CURSOR(也就是 Oracle 的 REFCURSOR) ,你必须指定一个 resultMap 来映射结果集到参数类型。...,比如结构体,但是当注册 out 参数时你必须告诉语句类型名称。...这两者之间的唯一不同是 id 表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射) 。
SESSION | STATEMENT SESSION jdbcTypeForNull 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。...true | false false returnInstanceForEmptyRow 当返回行的所有列都是空时,MyBatis默认返回null。...当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。...SESSION | STATEMENT SESSION jdbcTypeForNull 当没有为参数提供特定的 JDBC 类型时,为空值指定 JDBC 类型。...当开启这个设置时,MyBatis会返回一个空实例。 请注意,它也适用于嵌套的结果集 (i.e. collectioin and association)。
; resultMap : 结果集映射,它就很好; 其中,增删改查操作拼接 SQL 时使用到的 动态SQL( if、where、foreach啥的),以及封装结果集时使用到的 复杂映射 (1对1 ,1对多...当然如果你不希望通过 hashmap 来接收查询结果,允许你自由指定返回类型。...,ResultSet 对象本身包含了一个由查询语句返回的一个结果集合。...resultOrdered 可选项,这个设置仅针对嵌套结果 select 语句:如果为 true,将会假设包含了嵌套结果集或是分组,当返回一个主结果行时,就不会产生对前面结果集的引用。...首先对于我们 Java 来说,特别不希望在代码中通过传递 map 来传参,这样对于后续维护或者参数查找都是极不负责任的,我们推荐使用 JavaBean 来传值参数,这是 parameterMap 被抛弃的其中一个原因
2.1.1 查询条件 根据输入的学生信息进行条件检索 当只输入用户名时, 使用用户名进行模糊检索; 当只输入性别时, 使用性别进行完全匹配 当用户名和性别都存在时, 用这两个条件进行查询匹配查询 2.1.2...2.2 在 UPDATE 更新列中使用 if 标签 有时候我们不希望更新所有的字段, 只更新有变化的字段。 2.2.1 更新条件 只更新有变化的字段, 空值不更新。...3.1 查询条件 假设 name 具有唯一性, 查询一个学生 当 studen_id 有值时, 使用 studen_id 进行查询; 当 studen_id 没有值时, 使用 name 进行查询; 否则返回空...trim 中含有内容时, 添加 where, 且第一个为 and 或 or 时, 会将其去掉。...而没有内容, 不添加 set 4.3.3 trim 的几个属性 prefix: 当 trim 元素包含有内容时, 增加 prefix 所指定的前缀 prefixOverrides: 当 trim 元素包含有内容时
任意正整数 defaultFetchSize 为驱动的结果集获取数量(fetchSize)设置一个建议值。此参数只可以在查询设置中被覆盖。...SESSION | STATEMENT jdbcTypeForNull 当没有为参数指定特定的 JDBC 类型时,空值的默认 JDBC 类型。...true | false returnInstanceForEmptyRow 当返回行的所有列都是空时,MyBatis默认返回 null。 当开启这个设置时,MyBatis会返回一个空实例。...类型处理器(typeHandlers) MyBatis 在查询后,从结果集中取出一个值时, 都会用类型处理器将获 “取到的值” 转换成 Java 类型的值方便使用。...,mybatis 可以实现复杂的映射语句,比如 集合的嵌套 Select 查询,集合的嵌套结果映射。
selectPerson,接受一个 int(或 Integer)类型的参数,并返回一个 HashMap 类型的对象,其中的键是列名,值便是结果行中的对应值。...resultOrdered 这个设置仅针对嵌套结果 select 语句适用:如果为 true,就是假设包含了嵌套结果集或是分组了,这样的话当返回一个主结果行的时候,就不会发生有对前面结果集的引用的情况。...,比如结构体,但是当注册 out 参数时你必须告诉它语句类型名称。...MyBatis 有两种不同的方式加载关联: 嵌套查询:通过执行另外一个 SQL 映射语句来返回预期的复杂类型。 嵌套结果:使用嵌套结果映射来处理重复的联合结果的子集。...autoMapping 如果使用了,当映射结果到当前属性时,Mybatis将启用或者禁用自动映射。 该属性覆盖全局的自动映射行为。
: 上面的查询语句,我们发现如果 #{sex} 为空,那么查询结果也是空,如何解决这个问题呢?...、if+set设置值 当update语句中没有使用if标签时,如果有一个参数为null,都会导致错误。...2.5、choose(when,otherwise) 开关 如果不想用到所有的查询条件,只想选择其中的一个,查询条件有一个满足即可,使用 choose 标签可以解决此类问题,类似于 Java 的 switch...: 也就是说,这里我们有三个条件,id,name,sex,只能选择一个作为查询条件 如果 id 不为空,那么查询语句为:select * from student where id=?...-- 1、有些时候,sql语句where条件中,需要一些安全判断,例如按性别检索,如果传入的参数是空的,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。
可使用 typeAliase 标签对别名进行设置,其中 alias 属性为别名内容(不设置默认为类名) ,type 属性为要用别名替换的内容。...4)typeHandlers MyBatis 在设置预编译SQL语句中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。...•flushCache:同样是清缓存,不同的是对于这三个标签,它默认为true,而select为false;•useGeneratedKeys:当设置为true时MyBatis会调用getGeneratedKeys...-- 其他以此类推 --> select> 当我们的employee对象是空的时候,可以查询出来所有结果(没有where子句);传入几个参数就按几个参数查,可见where标签的作用是帮我们处理...而@Result 就相当于 ,当id为true时,这个注解也相当于 。
领取专属 10元无门槛券
手把手带您无忧上云