实战:用户模块从建表到 XML/注解两种实现的完整流程
把前面所学串成一条完整流水线:建表 → 实体 → Mapper → XML/注解两种实现 → Spring Boot 跑通增删改查。学完本节能独立从零搭一个"用户模块"。
第 1 步:建表
CREATE TABLE `user` (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
username VARCHAR(50) NOT NULL COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码(建议存哈希)',
email VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
status TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0禁用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_username (username)
) COMMENT='用户表';
第 2 步:实体类
public class User {
private Long id;
private String username;
private String password;
private String email;
private Integer status;
private LocalDateTime createTime;
private LocalDateTime updateTime;
// getter/setter 省略
}
第 3 步:注解版 Mapper
一个方法一条注解;开启驼峰映射后无需额外字段映射,@Options 负责回填自增主键:
public interface UserMapper {
@Insert("INSERT INTO user(username,password,email,status) "
+ "VALUES(#{username},#{password},#{email},#{status})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(@Param("id") Long id);
@Select("SELECT * FROM user WHERE status = #{status}")
List<User> selectByStatus(@Param("status") Integer status);
@Update("UPDATE user SET status = #{status} WHERE id = #{id}")
int updateStatus(@Param("id") Long id, @Param("status") Integer status);
@Delete("DELETE FROM user WHERE id = #{id}")
int deleteById(@Param("id") Long id);
}
第 4 步:XML 版 Mapper
接口方法同上、去掉注解;SQL 挪进 XML,动态条件用 where/if 更顺手:
<mapper namespace="com.demo.mapper.UserMapper">
<select id="selectByStatus" resultType="com.demo.entity.User">
SELECT * FROM user
<where>
<if test="status != null">AND status = #{status}</if>
</where>
ORDER BY id
</select>
</mapper>
Spring Boot 配置(properties 写法):
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.configuration.map-underscore-to-camel-case=true
第 5 步:跑通调用
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void crud() {
User u = new User();
u.setUsername("zhangsan");
u.setPassword("123456");
u.setStatus(1);
userMapper.insert(u);
System.out.println("自增id=" + u.getId()); // 输出:自增id=1
System.out.println(userMapper.selectById(u.getId()).getUsername()); // 输出:zhangsan
userMapper.updateStatus(u.getId(), 0);
System.out.println(userMapper.selectById(u.getId()).getStatus()); // 输出:0
userMapper.deleteById(u.getId());
}
}
两种实现如何选
注解版代码量小、就近可见,适合简单 CRUD;XML 版支持 where/if/foreach 动态条件与 sql 片段复用,适合复杂查询。建议一个项目统一一种风格,同一 Mapper 内注解与 XML 不要混用。
从建表到跑通共五步,本质是"库表 ↔ 实体 ↔ SQL 位置 ↔ 调用"四件事的对应关系。流程练熟后,再叠加主键回填、驼峰开关、动态 SQL 三件套,单表模块即可快速搭建。