实战:用户模块从建表到 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 三件套,单表模块即可快速搭建。

笔记加载中…