Mybatis操作数据库(2)

一、什么是 MyBatis?

MyBatis 是 Java 中用于操作数据库的持久层框架,核心思想是 “用 SQL 语句精准控制数据库”,提供灵活的 SQL 定制能力。通过 XML 或注解配置 SQL,自动将 Java 对象映射到 SQL 参数和结果集。

二、动态SQL —— MyBatis 的杀手锏

动态 SQL 是 MyBatis 最强大的特性,能根据不同条件拼接 SQL 语句。举个栗子:用户注册时,非必填字段(如性别)可能为空,此时 SQL 需要灵活处理。

1.  标签:条件判断

作用:如果字段存在则拼接 SQL,否则跳过。



    INSERT INTO userinfo (
        username, 
        password,  --
        gender,
        phone
    )
    VALUES (
        #{username},
        #{password},
        #{gender},
        #{phone}
    );

重点test="gender != null" 中的 gender 是 Java 对象的属性名,不是数据库字段名!

2.  标签:去除多余符号

当多个动态字段存在时,可能因逗号导致语法错误。 自动处理头和尾的符号。



    INSERT INTO userinfo
    
        username,
        password,
    
    VALUES 
    
        #{username},
        #{password},
    

  • prefix:开头添加 (
  • suffix:结尾添加 )
  • suffixOverrides:去掉最后一个逗号
3.  和  标签
  • :自动去除条件前的 AND 或 OR,避免 WHERE 后空条件。
    
    
  • :自动去除 UPDATE 语句中的多余逗号。
  • 
        UPDATE userinfo
        
            username = #{username},
            password = #{password},
        
        WHERE id = #{id}
    
    
    4.  标签:批量操作

    批量删除书籍(比如选中多个图书 ID 调用后端接口):

  • 
        DELETE FROM book_info
        WHERE id IN 
        
            #{id}
        
    
    
  • collection="ids":传入的集合参数(如 List
  • openclose:包裹成 (id1, id2, id3)
  • separator:分隔符设为逗号
三、实战案例 —— 图书管理系统
1. 用户登录(Session管理)
@PostMapping("/login")
public boolean login(String name, String password, HttpSession session) {
    UserInfo user = userService.getUserByName(name);
    if (user != null && password.equals(user.getPassword())) {
        session.setAttribute("SESSION_USER_KEY", user); // 存储登录状态
        return true;
    }
    return false;
}
2. 分页查询(LIMIT + 前端显示)
// BookController
@GetMapping("/getListByPage")
public PageResult getListByPage(@RequestParam int currentPage, 
                                          @RequestParam int pageSize) {
    int offset = (currentPage - 1) * pageSize;
    int total = bookService.countBooks();
    List books = bookService.getBooksByPage(offset, pageSize);
    return new PageResult<>(total, books);
}

XML分页查询:


3. 强制登录(拦截器示例)
@Component
public class AuthInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, 
                             HttpServletResponse response, 
                             Object handler) throws Exception {
        HttpSession session = request.getSession();
        if (session.getAttribute("SESSION_USER_KEY") == null) {
            response.sendRedirect("/login.html"); // 未登录跳转
            return false;
        }
        return true;
    }
}
四、核心技巧总结
  1. 动态SQL标签

    • :按条件拼接 SQL。
    • :去除多余符号的黑科技。
    •  + :智能处理条件。
    • :批量操作神器。
  2. 项目实践常见问题

    • 参数传递:确保 XML 中 #{} 引用的属性名是 Java 对象的字段!
    • 逻辑删除:通过 UPDATE 标记 status=0,而非物理删除。
    • 分页计算
      offset = (currentPage - 1) * pageSize;
      totalPages = (total + pageSize - 1) / pageSize;
      
      五、MyBatis Generator 代码生成工具

      简化 CRUD 操作,快速生成 Model、Mapper 文件。

      配置 generatorConfig.xml

    • 
          
          
          
          
          
          

      运行插件生成代码,无需手动写增删改查!

      你可能感兴趣的:(数据库,mybatis,java)