MyBatis 详细使用教程

MyBatis 详细使用教程

MyBatis 详细使用教程

一、MyBatis 简介

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解为配置和原始映射,将 SQL 语句与 Java 对象进行绑定。

核心优势:

  • 简化数据库操作:减少了 80% 的代码量
  • 灵活的 SQL 控制:可以直接编写和优化 SQL 语句
  • 支持动态 SQL:能够根据条件动态生成 SQL
  • 强大的映射能力:支持复杂的对象关系映射
  • 易于学习和使用:学习曲线平缓

二、快速开始

1. 添加依赖

在 `pom.xml` 中添加 MyBatis 依赖:

“`xml

org.mybatis.spring.boot
mybatis-spring-boot-starter
3.0.3


mysql
mysql-connector-java
8.0.33


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 selectAll();
List selectByName(String name);
}


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

name = #{name},
age = #{age},
email = #{email},

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 getAllUsers() {
return userMapper.selectAll();
}

// 批量查询
public List getUsersByIds(List ids) {
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

name = #{name},
age = #{age},



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 orders; // 用户的订单列表
}


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 selectAll();

@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 selectByName(String name);
}


四、最佳实践

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 users);


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 searchUsers(SearchCriteria criteria);

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 getOrderStatistics(@Param(“startTime”) Date startTime,
@Param(“endTime”) Date endTime);
}


xml

“`

六、总结

MyBatis 是一款灵活强大的持久层框架,通过 XML 和注解两种配置方式,能够满足不同场景的开发需求。掌握 MyBatis 的核心功能和最佳实践,可以显著提升开发效率和代码质量。

学习建议:

  1. 从简单的 CRUD 操作开始
  2. 逐步掌握动态 SQL 的使用
  3. 深入理解关联映射
  4. 优化 SQL 性能
  5. 遵循项目规范和最佳实践
  6. MyBatis 与 Spring Boot 的良好整合,使其成为企业级开发的首选持久层框架之一。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容