
MyBatis 详细使用教程
一、MyBatis 简介
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解为配置和原始映射,将 SQL 语句与 Java 对象进行绑定。
核心优势:
- 简化数据库操作:减少了 80% 的代码量
- 灵活的 SQL 控制:可以直接编写和优化 SQL 语句
- 支持动态 SQL:能够根据条件动态生成 SQL
- 强大的映射能力:支持复杂的对象关系映射
- 易于学习和使用:学习曲线平缓
二、快速开始
1. 添加依赖
在 `pom.xml` 中添加 MyBatis 依赖:
“`xml
2. 配置文件
yaml
application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&characterEncoding=utf-8&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.example.project.entity
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl
3. 创建实体类
java
public class User {
private Long id;
private String name;
private Integer age;
private String email;
private Date createTime;
// Getter and Setter methods
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
}
4. 创建 Mapper 接口
java
public interface UserMapper {
// 基础 CRUD 方法
int insert(User user);
int deleteById(Long id);
int updateById(User user);
User selectById(Long id);
// 自定义查询
List
List
}
5. 创建 XML 映射文件
xml
id, name, age, email, create_time
INSERT INTO user (name, age, email, create_time)
VALUES (#{name}, #{age}, #{email}, #{createTime})
DELETE FROM user WHERE id = #{id}
UPDATE user
WHERE id = #{id}
三、核心功能详解
1. CRUD 操作
MyBatis 提供了完整的增删改查功能:
插入操作:
java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public void addUser(User user) {
int rows = userMapper.insert(user);
System.out.println(“插入成功,影响行数:” + rows);
System.out.println(“生成的 ID: ” + user.getId());
}
}
查询操作:
java
// 根据 ID 查询
public User getUserById(Long id) {
return userMapper.selectById(id);
}
// 查询所有用户
public List
return userMapper.selectAll();
}
// 批量查询
public List
return userMapper.selectByIds(ids);
}
更新操作:
java
// 更新用户信息
public void updateUser(User user) {
int rows = userMapper.updateById(user);
System.out.println(“更新成功,影响行数:” + rows);
}
// 部分字段更新
public void updateUserPartially(Long id, String name, Integer age) {
User user = new User();
user.setId(id);
user.setName(name);
user.setAge(age);
userMapper.updateById(user);
}
删除操作:
java
// 逻辑删除
public void deleteUser(Long id) {
int rows = userMapper.deleteById(id);
System.out.println(“删除成功,影响行数:” + rows);
}
2. 动态 SQL
动态 SQL 可以根据条件灵活构建查询语句:
xml
其他动态 SQL 标签:
xml
INSERT INTO user (name, age, email)
VALUES
(#{user.name}, #{user.age}, #{user.email})
DELETE FROM user
WHERE id IN
#{id}
3. 关联查询
MyBatis 支持一对一、一对多、多对多关联查询:
一对一关联:
java
public class Order {
private Long id;
private String orderNo;
private BigDecimal amount;
private User user; // 关联的用户
}
xml
一对多关联:
java
public class User {
private Long id;
private String name;
private List
}
xml
4. 注解方式
对于简单的 CRUD 操作,可以使用注解替代 XML:
java
@Mapper
public interface UserMapper {
@Select(“SELECT * FROM user WHERE id = #{id}”)
User selectById(Long id);
@Select(“SELECT * FROM user”)
List
@Insert(“INSERT INTO user (name, age, email) VALUES (#{name}, #{age}, #{email})”)
@Options(useGeneratedKeys = true, keyProperty = “id”)
int insert(User user);
@Update(“UPDATE user SET name = #{name}, age = #{age} WHERE id = #{id}”)
int update(User user);
@Delete(“DELETE FROM user WHERE id = #{id}”)
int deleteById(Long id);
@Select(“SELECT * FROM user WHERE name LIKE CONCAT(‘%’, #{name}, ‘%’)”)
List
}
四、最佳实践
1. 项目结构规范
com.example.project
├── config // 配置类
├── entity // 实体类
├── mapper // Mapper 接口
├── mapper/xml // XML 映射文件
├── service // 服务层
├── controller // 控制器
└── dto // 数据传输对象
2. 命名规范
- 实体类使用驼峰命名,数据库字段使用下划线
- Mapper 接口与 XML 文件同名,位于相同包路径
- 方法名遵循语义化原则
3. SQL 性能优化
xml
CREATE INDEX idx_user_age ON user(age);
CREATE INDEX idx_user_name ON user(name);
4. 批量操作优化
java
// 使用 MyBatis 批量插入
@Insert(“INSERT INTO user (name, age, email) VALUES ” +
“
“(#{u.name}, #{u.age}, #{u.email})” +
“
int batchInsert(@Param(“list”) List
5. 使用缓存
yaml
mybatis:
configuration:
cache-enabled: true
lazy-loading-enabled: true
aggressive-lazy-loading: false
java
@CacheNamespace
public interface UserMapper {
}
五、实际应用场景
场景 1:复杂条件查询
用户搜索功能,支持多条件组合:
java
@SelectProvider(type = UserSqlProvider.class, method = “searchUsers”)
List
public class UserSqlProvider {
public String searchUsers(SearchCriteria criteria) {
return new SQL() {{
SELECT(“*”).FROM(“user”);
WHERE(criteria.getName() != null)
.AND(“name LIKE CONCAT(‘%’, #{criteria.name}, ‘%’)”);
WHERE(criteria.getMinAge() != null)
.AND(“age >= #{criteria.minAge}”);
ORDER BY(create_time DESC);
}}.toString();
}
}
场景 2:多表联查统计
订单统计报表:
java
public interface OrderStatisticsMapper {
Map
@Param(“endTime”) Date endTime);
}
xml
“`
六、总结
MyBatis 是一款灵活强大的持久层框架,通过 XML 和注解两种配置方式,能够满足不同场景的开发需求。掌握 MyBatis 的核心功能和最佳实践,可以显著提升开发效率和代码质量。
学习建议:
- 从简单的 CRUD 操作开始
- 逐步掌握动态 SQL 的使用
- 深入理解关联映射
- 优化 SQL 性能
- 遵循项目规范和最佳实践
MyBatis 与 Spring Boot 的良好整合,使其成为企业级开发的首选持久层框架之一。





















暂无评论内容