一、MyBatis 简介
MyBatis 是一个 半自动 ORM 框架,本质上还是基于 JDBC,但它帮我们做了很多重复性工作:
-
SQL 写在 XML 或注解里,Java 代码只管调用。
-
自动完成参数映射(Java 对象 → SQL 占位符)。
-
自动完成结果映射(SQL 查询结果 → Java 对象)。
👉 它不像 Hibernate 那样完全 ORM,而是 SQL 你来写,MyBatis帮你执行和映射。
二、MyBatis 基本配置[1] Maven
1. 引入依赖
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
2. 配置 MyBatis 核心文件 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 环境配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/testdb"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!-- 注册映射文件 -->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
3. 定义实体类 User.java
public class User {
private Integer id;
private String name;
private Integer age;
// getter/setter
}
4. 定义 Mapper 接口 UserMapper.java
public interface UserMapper {
User selectUserById(int id);
int insertUser(User user);
}
5. 编写 SQL 映射文件 UserMapper.xml
<?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="UserMapper">
<!-- 查询 -->
<select id="selectUserById" resultType="User">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
<!-- 插入 -->
<insert id="insertUser" parameterType="User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
</mapper>
6. 使用 MyBatis
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
public class MyBatisDemo {
public static void main(String[] args) throws Exception {
// 读取配置
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
try (SqlSession session = sqlSessionFactory.openSession(true)) {
UserMapper mapper = session.getMapper(UserMapper.class);
// 查询
User user = mapper.selectUserById(1);
System.out.println(user.getName());
// 插入
User newUser = new User();
newUser.setName("Tom");
newUser.setAge(22);
mapper.insertUser(newUser);
}
}
}
三、MyBatis 基本配置[2] SpringBoot
1、添加依赖
在 pom.xml 中加入:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
2、配置数据库连接
在 application.yml 或 application.properties 中配置数据库信息。
application.yml 示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # XML 映射文件位置
type-aliases-package: com.example.demo.entity # 实体类包路径
3、创建实体类
User.java
package com.example.demo.entity;
public class User {
private Integer id;
private String name;
private Integer age;
// getter & setter
}
4、创建 Mapper 接口
UserMapper.java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
@Mapper // 让 Spring 管理这个接口
public interface UserMapper {
// XML 或注解方式都可以,这里先演示注解
@Select("SELECT id, name, age FROM users WHERE id = #{id}")
User selectUserById(Integer id);
}
5、XML 配置 SQL(可选)
如果不想用注解,可以写 XML 文件。
在 src/main/resources/mapper/UserMapper.xml 下:
<?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="com.example.demo.mapper.UserMapper">
<select id="selectUserById" resultType="com.example.demo.entity.User">
SELECT id, name, age FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="com.example.demo.entity.User">
INSERT INTO users (name, age) VALUES (#{name}, #{age})
</insert>
</mapper>
6、Service 层
UserService.java
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class UserService {
@Resource
private UserMapper userMapper;
public User getUser(Integer id) {
return userMapper.selectUserById(id);
}
}
7、Controller 层
UserController.java
package com.example.demo.controller;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Integer id) {
return userService.getUser(id);
}
}
8、启动测试
启动 Spring Boot 应用后,访问:
http://localhost:8080/user/1
四、MyBatis 与 JDBC 的区别
| 对比点 | JDBC | MyBatis |
|---|---|---|
| SQL 管理 | 写在 Java 代码里,字符串拼接 | 写在 XML 或注解中,清晰分离 |
| 参数设置 | 需要手动 ps.setXXX() | 自动映射 #{} |
| 结果处理 | 需要手动 rs.getXXX() 转换为对象 | 自动映射到 Java Bean |
| 代码量 | 冗长、重复代码多 | 简洁,关注 SQL 逻辑即可 |
| 事务控制 | 手动管理 | 框架支持 |
| 可维护性 | SQL 和 Java 强耦合,不利于维护 | SQL 和 Java 解耦,更利于团队协作 |
| 扩展性 | 需要自己写工具类 | 插件机制丰富(分页、缓存等) |
五、MyBatis 的优势
-
SQL 与代码分离
-
SQL 写在 XML/注解里,Java 专注业务逻辑。
-
DB 工程师和 Java 工程师分工协作更方便。
-
-
自动映射
-
参数自动绑定,结果集自动封装成对象。
-
避免大量
rs.getXXX()和ps.setXXX()。
-
-
可维护性强
-
SQL 独立文件,版本控制方便。
-
修改 SQL 不需要改 Java 代码。
-
-
灵活性
-
与数据库强绑定(不像 Hibernate 那样完全 ORM)。
-
复杂 SQL 可以手写,性能可控。
-
-
插件丰富
-
MyBatis-Plus(分页、CRUD 简化)。
-
缓存机制(一级缓存、二级缓存)。
-
六、适用场景
✅ MyBatis 更适合:
-
SQL 逻辑比较复杂的项目(报表系统、业务规则复杂)。
-
团队需要 SQL 与代码解耦,方便数据库工程师和 Java 工程师协作。
-
强调 性能可控(自己写 SQL,避免 Hibernate 那样的自动 SQL 性能隐患)。
❌ JDBC 适合:
-
极简单的 Demo、小型项目。
-
学习底层原理(理解预编译、连接池等)。
✅ Spring Boot + MyBatis 优势:
-
无需写 mybatis-config.xml,配置直接写在
application.yml。 -
自动注入 SqlSessionFactory、DataSource,开发者不必手动管理。
-
用
@Mapper注解即可自动扫描接口,不用在 XML 中写<mappers>。 -
与 Spring 生态无缝整合(事务、IOC、AOP 等)。
✨ 总结:
-
JDBC → 底层 API,繁琐但灵活
-
MyBatis → JDBC 的封装,简化开发,灵活性和性能兼顾
2万+



被折叠的 条评论
为什么被折叠?



