Spring Boot 如何整合 MyBatis 进行数据库操作?
引入 mybatis-spring-boot-starter 后,通过 @MapperScan 扫描接口、XML 或注解编写 SQL 即可完成整合。核心三要素:Mapper 接口(定义方法签名)、映射文件(编写 SQL 与 ResultMap)、自动配置(驼峰映射、数据源)。简单 CRUD 用注解(@Select/@Insert),复杂动态 SQL 用 XML(where/set/foreach)。PageHelper.startPage 即可实现分页,@Transactional 管理事务。
追问
@Mapper 和 @MapperScan 有什么区别? @Mapper 逐个标注接口,适合 Mapper 少的场景;@MapperScan 在启动类统一指定包路径,批量注册,推荐使用。两者二选一,不可重复注册。
#{} 和 ${} 的区别是什么? #{} 使用预编译参数(PreparedStatement 占位符),防止 SQL 注入;${} 直接字符串拼接,有注入风险,仅用于表名、列名等不可预编译的位置。
ResultMap 和 ResultType 怎么选? 字段名与属性一致时用 resultType 自动映射(配合 map-underscore-to-camel-case);不一致或有关联查询(association/collection)时必须用 resultMap 手动映射。
动态 SQL 的 where 标签解决了什么问题? 自动去除首个多余 AND/OR,并在条件全空时不生成 WHERE 子句,避免语法错误。set 标签同理,自动去除末尾多余逗号。
PageHelper 分页的原理和坑是什么? PageHelper 基于 MyBatis Interceptor 拦截 SQL,自动拼接 LIMIT。坑:startPage 必须紧挨查询语句,中间不能有其他查询,否则分页错乱;只对紧跟的第一条查询生效。
写段代码
java@SpringBootApplication @MapperScan("com.example.mapper") public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } } // XML 动态查询 <select id="selectByCondition" resultMap="BaseMap"> SELECT * FROM user <where> <if test="name != null">AND name LIKE CONCAT('%',#{name},'%')</if> </where> </select>