1.xml映射文件中除了常见的select,insert,update,delete标签外还有哪些标签答还有很多其他的标签resultMap、parameterMap、sql、include、selectKey加上动态 sql 的 9 个标签trim|where|set|foreach|if|choose|when|otherwise|bind等其中sql为 sql 片段标签通过include标签引入 sql 片段selectKey为不支持自增的主键生成策略标签resultMap- 结果集映射定义数据库列与 Java 对象属性的映射关系尤其适用于字段名与属性名不一致的情况resultMap iduserMap typeUser id propertyid columnuser_id/ !-- 主键映射 -- result propertyname columnuser_name/ !-- 普通字段映射 -- !-- 关联对象映射 -- association propertydept javaTypeDepartment result propertydeptName columndept_name/ /association !-- 集合映射 -- collection propertyroles ofTypeRole result propertyroleName columnrole_name/ /collection /resultMap select idgetUser resultMapuserMap SELECT * FROM users WHERE id #{id} /selectsql- SQL 片段定义可重用的 SQL 片段sql iduserColumns id, name, email, create_time /sqlinclude- 包含 SQL 片段引用已定义的sql片段select idselectUsers resultTypeUser SELECT include refiduserColumns/ !-- 插入 SQL 片段 -- FROM users /selectselectKey- 主键生成获取数据库生成的主键支持插入前/后获取insert idinsertUser parameterTypeUser !-- MySQL 插入后获取自增 ID -- selectKey keyPropertyid resultTypelong orderAFTER SELECT LAST_INSERT_ID() /selectKey INSERT INTO users(name) VALUES(#{name}) /insert动态 SQL 标签if- 条件判断choose/when/otherwise- 多路选择trim- 自定义字符串修剪where- 智能 WHERE 子句set- 智能 SET 子句。foreach- 集合遍历bind- 变量绑定2.${}和#{}的区别是什么${}是 Properties 文件中的变量占位符它可以用于标签属性值和 sql 内部属于原样文本替换可以替换任意内容。#{}是 sql 的参数占位符MyBatis 会将 sql 中的#{}替换为? 号在 sql 执行前会使用 PreparedStatement 的参数设置方法按序给 sql 的? 号占位符设置参数值!-- 标签属性值数据源配置示例 -- bean iddataSource classorg.apache.commons.dbcp2.BasicDataSource property namedriverClassName value${jdbc.driver}/ !-- 占位符用于属性值 -- property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean!-- 在SQL内部使用 MyBatis SQL映射文件示例 -- select idgetUser resultTypeUser SELECT * FROM ${table.name} !-- 动态表名 -- WHERE username #{param} !-- #{}是参数绑定${}是直接替换 -- /select
7.14 遇到的 mybatis 面试题
发布时间:2026/7/15 15:38:20
1.xml映射文件中除了常见的select,insert,update,delete标签外还有哪些标签答还有很多其他的标签resultMap、parameterMap、sql、include、selectKey加上动态 sql 的 9 个标签trim|where|set|foreach|if|choose|when|otherwise|bind等其中sql为 sql 片段标签通过include标签引入 sql 片段selectKey为不支持自增的主键生成策略标签resultMap- 结果集映射定义数据库列与 Java 对象属性的映射关系尤其适用于字段名与属性名不一致的情况resultMap iduserMap typeUser id propertyid columnuser_id/ !-- 主键映射 -- result propertyname columnuser_name/ !-- 普通字段映射 -- !-- 关联对象映射 -- association propertydept javaTypeDepartment result propertydeptName columndept_name/ /association !-- 集合映射 -- collection propertyroles ofTypeRole result propertyroleName columnrole_name/ /collection /resultMap select idgetUser resultMapuserMap SELECT * FROM users WHERE id #{id} /selectsql- SQL 片段定义可重用的 SQL 片段sql iduserColumns id, name, email, create_time /sqlinclude- 包含 SQL 片段引用已定义的sql片段select idselectUsers resultTypeUser SELECT include refiduserColumns/ !-- 插入 SQL 片段 -- FROM users /selectselectKey- 主键生成获取数据库生成的主键支持插入前/后获取insert idinsertUser parameterTypeUser !-- MySQL 插入后获取自增 ID -- selectKey keyPropertyid resultTypelong orderAFTER SELECT LAST_INSERT_ID() /selectKey INSERT INTO users(name) VALUES(#{name}) /insert动态 SQL 标签if- 条件判断choose/when/otherwise- 多路选择trim- 自定义字符串修剪where- 智能 WHERE 子句set- 智能 SET 子句。foreach- 集合遍历bind- 变量绑定2.${}和#{}的区别是什么${}是 Properties 文件中的变量占位符它可以用于标签属性值和 sql 内部属于原样文本替换可以替换任意内容。#{}是 sql 的参数占位符MyBatis 会将 sql 中的#{}替换为? 号在 sql 执行前会使用 PreparedStatement 的参数设置方法按序给 sql 的? 号占位符设置参数值!-- 标签属性值数据源配置示例 -- bean iddataSource classorg.apache.commons.dbcp2.BasicDataSource property namedriverClassName value${jdbc.driver}/ !-- 占位符用于属性值 -- property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean!-- 在SQL内部使用 MyBatis SQL映射文件示例 -- select idgetUser resultTypeUser SELECT * FROM ${table.name} !-- 动态表名 -- WHERE username #{param} !-- #{}是参数绑定${}是直接替换 -- /select