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);
    }
相关推荐
wuminyu16 分钟前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人22 分钟前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒34 分钟前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼39 分钟前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ2 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油2 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦2 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp2 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy2 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
2zcode3 小时前
基于MATLAB元胞自动机(CA)的AZ80A镁合金动态再结晶(DRX)过程模拟
开发语言·matlab·动态再结晶