MyBatis:注解方式实现数据库 CRUD 全操作

Mybatis是什么

Mybatis 是一个轻量级的 Java 持久层框架,它简化了数据库操作,将 SQL 语句与 Java 代码解耦。通过 XML 或注解配置 SQL 映射,开发者可以更灵活地操作数据库,同时避免了传统 JDBC 的繁琐编码。Mybatis 支持动态 SQL、存储过程以及高级映射功能,是 Java 应用中常用的 ORM 解决方案之一。

根据MyBatis的写法完成数据库的操作

1.先创建一个接口

java 复制代码
@Mapper
public interface UserInfoMapper {
    @Select("select * from user_info")
        List<UserInfo> selectAll();
}

@Mapper 注解替代了传统的五大注解,用于将该接口交由 Spring 容器进行管理。

java 复制代码
@Data
public class UserInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private Integer deleteFlag;
    private Date createTime;
    private Date updateTime;
}

2.创建测试类

我们在这个接口中点击鼠标右键,然后点击Generate,再点击Test:

然后记得把左下角的那个选项勾选

于是在test文件之下就会生成测试类:

3.进行测试

由于我们这个测试需要搭建Spring的环境,所以@SpringBootTest这个注解不能删除,这个注解的作用就是用来搭建Spring的环境的。

测试方法1:通过注解直接将 IOC 容器中的UserInfoMapper注入到测试类中使用。

测试方法2:通过ApplicationContext(Spring 上下文)主动从 IOC 容器中获取 Bean 的测试方法

执行具体的查询操作

在查询中传入一个参数

java 复制代码
@Select("select * from user_info where id=#{id}")
    UserInfo selectAllById(Integer id);

上面的#{id}就获取到了我们所传入的id的数值,这样我们就可以根据不同的id来灵活查询不同的数据

java 复制代码
@Test
    void selectAllById() {
        System.out.println(userInfoMapper.selectAllById(1));
    }

在查询中传入多个参数

java 复制代码
@Select("select * from user_info where username =#{username} and password=#{password}")
    List<UserInfo> selectByNameAndPassword (String username,String password);
java 复制代码
@Test
    void testSelectByNameAndPassword() {
        System.out.println(userInfoMapper.selectByNameAndPassword("zhangsan123", "zhangsan"));
    }

1.新增数据

java 复制代码
@Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into user_info (username,password,age)VALUES(#{username},#{password},#{age}) ")
    Integer insertUser(UserInfo userInfo);

@Options(useGeneratedKeys = true,keyProperty = "id")
这行注解就可以让我们方便在后续拿到自增后的id的数值。

java 复制代码
@Test
    void insertUser() {
        UserInfo userInfo=new UserInfo();
        userInfo.setAge(18);
        userInfo.setUsername("user");
        userInfo.setPassword("password");
        Integer result= userInfoMapper.insertUser(userInfo);
        System.out.println("影响行数:" +result +", id: "+userInfo.getId());
    }

参数重命名(参数绑定)

这里我们就引入了@Param这个新的注解:

java 复制代码
@Select("select * from user_info where username =#{userName} and password=#{PassWord}")
    List<UserInfo> selectByNameAndPassword (@Param("userName") String username, @Param("PassWord") String password);

这里就把我们所传入的username这个参数的值赋值给了userName,把password的值赋值给了PassWord。

如果是针对对象来重命名的话要做出额外的处理:

java 复制代码
@Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into user_info (username,password,age)"+
            "VALUES(#{UserInfo.username},#{UserInfo.password},#{UserInfo.age}) ")
    Integer insertUser2( @Param("UserInfo") UserInfo userInfo);

我们要在对象对应的属性的前面加上我们重新命名的名字然后再加上.

2.删除数据

java 复制代码
@Delete("delete from user_info where id=#{id}")
    Integer deleteUser(Integer id);
java 复制代码
@Test
    void deleteUser() {
        userInfoMapper.deleteUser(2);
    }

通过数据库中的信息我们可以发现id为2的数据确实被删除了。

3.更新数据

java 复制代码
@Update("update user_info set delete_flag=#{deleteFlag},phone=#{phone} where id=#{id}")
    Integer updateUser(UserInfo userInfo);

上面参数中的对应关系要注意:

delete_flag是数据库中字段的名称,deleteFlag是Java中UserInfo的属性名称。

java 复制代码
 @Test
    void updateUser() {
        UserInfo userInfo=new UserInfo();
        userInfo.setId(3);
        userInfo.setPhone("123456");
        userInfoMapper.updateUser(userInfo);
    }
相关推荐
oak隔壁找我2 小时前
JVM常用调优参数
java·后端
蝎子莱莱爱打怪6 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
狼爷8 小时前
Go 没有 override?别硬套继承!用接口+嵌入,写更清爽的“覆盖”逻辑
java·go
小兔崽子去哪了10 小时前
Java 自动化部署
java·后端
ma_king10 小时前
入门 java 和 数据库
java·数据库·后端
后端AI实验室10 小时前
我用Cursor开发了3个月,整理出这套提效4倍的工作流
java·ai
码路飞15 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
SimonKing15 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven9717 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德1 天前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty