- 前言
边学边做中
mapper的用处是和数据库交互,具体的行为找了一个mapper文件,让chatgpt讲解了一下,如下:
首先是方法表
| 方法 | 功能 | 是否常用 |
| --------------------------- | -------- | ------- |
| countByExample | 统计数量 | ✅ |
| deleteByExample | 按条件删除 | ⚪️(慎用) |
| deleteByPrimaryKey | 按主键删除 | ✅ |
| insert | 全字段插入 | ❌(一般不用) |
| insertSelective | 非空字段插入 | ✅ |
| selectByExample | 条件查询 | ✅ |
| selectByPrimaryKey | 主键查询 | ✅ |
| updateByExampleSelective | 条件更新部分字段 | ⚪️ |
| updateByExample | 条件更新全字段 | ❌ |
| updateByPrimaryKeySelective | 主键更新部分字段 | ✅ |
| updateByPrimaryKey | 主键更新全字段 | ⚪️ |
然后是讲解
1️⃣ 统计记录数
long countByExample(UserAccountExample example);
功能:根据条件统计表中记录数量。
例子:
UserAccountExample example = new UserAccountExample();
example.createCriteria().andRoleEqualTo("student");
long count = userAccountMapper.countByExample(example);
SQL 等价于:
SELECT COUNT(*) FROM user_account WHERE role = 'student';
2️⃣ 删除数据
int deleteByExample(UserAccountExample example);
int deleteByPrimaryKey(Long id);
方法 功能 示例
deleteByExample 按条件删除多行 删除所有 is_deleted = 1 的用户
deleteByPrimaryKey 按主键删除一行 删除 ID=5 的用户
3️⃣ 插入数据
int insert(UserAccount row);
int insertSelective(UserAccount row);
方法 区别 用途
insert 全字段插入(null 也会写入) 不推荐(会覆盖默认值)
insertSelective 只插入非空字段 推荐使用,保持默认值生效
例子:
UserAccount user = new UserAccount();
user.setEmail("test@cuhk.edu.hk");
user.setDisplayName("Mingya");
userAccountMapper.insertSelective(user);
SQL:
INSERT INTO user_account (email, display_name)
VALUES ('test@cuhk.edu.hk', 'Mingya');
4️⃣ 查询数据
List
UserAccount selectByPrimaryKey(Long id);
方法 功能 示例
selectByExample 按条件查多行 查询所有学生用户
selectByPrimaryKey 按主键查单行 查询 ID=3 的用户
例子:
UserAccountExample example = new UserAccountExample();
example.createCriteria().andRoleEqualTo("admin");
List
SQL:
SELECT * FROM user_account WHERE role = 'admin';
5️⃣ 更新数据
int updateByExampleSelective(@Param("row") UserAccount row, @Param("example") UserAccountExample example);
int updateByExample(@Param("row") UserAccount row, @Param("example") UserAccountExample example);
int updateByPrimaryKeySelective(UserAccount row);
int updateByPrimaryKey(UserAccount row);
方法 功能 示例
updateByPrimaryKeySelective 按主键更新非空字段(推荐) 修改某个用户昵称
updateByPrimaryKey 按主键全字段更新(不推荐)
updateByExampleSelective 按条件批量更新部分字段 批量把 role='student' 改成 is_deleted=1
updateByExample 按条件批量全字段更新
例子:
UserAccount update = new UserAccount();
update.setLastLoginAt(new Timestamp(System.currentTimeMillis()));
UserAccountExample example = new UserAccountExample();
example.createCriteria().andRoleEqualTo("student");
userAccountMapper.updateByExampleSelective(update, example);
SQL:
UPDATE user_account
SET last_login_at = NOW()
WHERE role = 'student';
-
环境配置
1)模块根文件夹下
pom.xml
(具体是不是一定要有,还不清楚,但目前版本号和插件依赖能跑通)
加入依赖org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.boot.version} com.mysql mysql-connector-j org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-jdbc org.projectlombok lombok provided
加入插件
2)模块根文件夹/src/main/resources下
generatorConfig.xml
参考网上配置即可
- 生成
Vscode下左下角有maven插件,点开模块下可看到mybatis-generator的generate,可使用。另一个方法是在模块根目录下执行
mvn -U -DskipTests mybatis-generator:generate
最终会生成
类型 | 说明 | 举例 |
---|---|---|
DataObject (DO) | 数据表对应的 Java 实体类 | Event.java、UserAccount.java |
Mapper 接口 | 操作数据库的接口 | EventMapper.java |
Mapper XML | SQL 语句定义 | EventMapper.xml |
- 下一步
注册Mapper,让其他文件能使用mapper