MyBatis 初阶

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: MyBatis 初阶

本篇博客是接着上一篇博客所写的,上一篇博客主要介绍了 MyBatis 的第一次使用,本篇博客主要介绍 MyBatis 的 CURD.


基本的增删改查



由于上篇博客介绍了查询操作,所以基本的查询操作就不演示了。我们一起来看一下修改、删除、添加操作。


一、修改操作


预期效果


我们预期通过 " id " 来修改 " username " 值。


bf7a48ef086d4caeac95f313f263cce7.png


代码实现


UserMapper 接口:


由于修改字段后,MySQL 数据库的提示是关于行数是否被改变的信息,所以,我们就可以使用一个 int 类型来接收返回值。


@Mapper
public interface UserMapper {
    // 2. 根据用户 id 修改某个用户的昵称
    public int updateUsernameById(@Param("id") Integer id, @Param("username")String username);
}


" xml 文件 "


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <!-- 2. 根据用户 id 修改某个用户的昵称 -->
    <update id="updateUsernameById">
        update userinfo set username = #{username} where id = #{id}
    </update>
</mapper>


测试类:


我们预期将 " 李明 " 改成 " 小红 ".


@SpringBootTest
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 2. 根据用户 id 修改某个用户的昵称
    @Test
    void updateUsernameById() {
        String username = "小红";
        int result = userMapper.updateUsernameById(2, username);
        System.out.println("修改结果:" + result);
    }
}


启动测试方法,观察结果


MyBatis 打印日志:


b7bba8ed80054acdba1d2421910eff65.png

观察数据库:


0c2010dbb0594a048a55111de58f741c.png


使用 " @Transactional " 注解


为测试类加上 " @Transactional " 注解,并预期将 " 小红 " 改成 " 杰克 ".


@Spri@SpringBootTest
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 2. 根据用户 id 修改某个用户的昵称
    @Test
    @Transactional
    void updateUsernameById() {
        String username = "杰克";
        int result = userMapper.updateUsernameById(2, username);
        System.out.println("修改结果:" + result);
    }
}


MyBatis 打印日志:


f022e85be8864842bd200beb56f0e311.png


观察数据库:最终我们发现 " 小红 " 并未被改变


203ab100903b4bce9dbd6d379100fff1.png


结论: " @Transactional " 注解表示在测试方法执行完后回滚事务,也就是说,使用此注解既不会污染数据库,也不会影响测试。


二、删除操作


代码实现


" UserMapper " 接口:


@Mapper
public interface UserMapper {
    // 3. 根据用户 id 删除某个用户全部信息
    public int deleteUserById(@Param("id") Integer id);
}


" xml 文件 "


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <!-- 3. 根据用户 id 删除某个用户全部信息 -->
    <delete id="deleteUserById">
        delete from userinfo where id = #{id};
    </delete>
</mapper>


测试类:


@SpringBootTest
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 3. 根据用户 id 删除某个用户全部信息
    @Test
    @Transactional
    void deleteUserById() {
        int result = userMapper.deleteUserById(2);
        System.out.println("删除结果:" + result);
    }
}


备注: 修改操作和删除操作很相似,这里就不再演示测试结果了。


三、添加操作


代码实现


" UserInfo " 实体类:


@Data
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String photo;
    private String createtime;
    private String updatetime;
    private int state;
}

" UserMapper " 接口:


@Mapper
public interface UserMapper {
    // 4. 添加新用户
    public int addUser(UserInfo userInfo);
}


" xml 文件 "


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <!-- 4. 添加新用户 -->
    <insert id="addUser">
        insert into userinfo (username, password, photo) values (#{username}, #{password},#{photo})
    </insert>
</mapper>


测试类:


@SpringBootTest 
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 4. 添加新用户
    @Test
    void addUser() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("小华");
        userInfo.setPassword("654");
        userInfo.setPhoto("小华.png");
        int result = userMapper.addUser(userInfo);
        System.out.println("添加结果:" + result);
    }
}


启动测试方法,观察结果


MyBatis 打印日志:


90765032dde2422a88c0c1f568a64dca.png


观察数据库:


050ffe8070e544cc896d5611acb038d3.png


注意事项


① 往数据表中添加数据时,需要提前准备好一个实体类。标准情况下,实体类的成员变量名和数据表中的字段名应该相同。


② 在编辑 " xml 文件 " 时,占位符必须与实体类的成员变量相同。

只有准备好了上面的这两点,MyBatis 框架才能够自动帮我们相互识别。


74c32eed4e914abfadb12cd407a2a5bb.png


四、第二个添加操作


我们预期在添加用户的同时,也能够获取到表中用户的 id。最终字段 " id " 的值,返回给对象,我们可以通过 " userinfo.getId() " 的方式,得到其值。


代码实现


" UserInfo " 实体类:


@Data
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String photo;
    private String createtime;
    private String updatetime;
    private int state;
}


" UserMapper " 接口:


@Mapper
public interface UserMapper {
    // 5. 添加新用户并获得用户的 id
    public int addUserAndGetId(UserInfo userInfo);
}


" xml 文件 "


这里的 " xml 文件 " 需要添加三个额外的属性:

① useGeneratedKeys 表示对应的字段是否是主键

② keyColumn 表示从表中拿的字段名

③ keyProperty 表示字段值赋值给实体类的哪个属性


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
    <!--  5. 添加新用户并获得用户的 id -->
    <insert id="addUserAndGetId" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
        insert into userinfo (username, password, photo) values (#{username}, #{password}, #{photo})
    </insert>
</mapper>


测试类:


@SpringBootTest 
class UserMapperTest {
    @Resource
    private UserMapper userMapper;
    // 5. 添加新用户并获得用户的 id
    @Test
    void addUserAndGetId() {
        UserInfo userInfo = new UserInfo();
        userInfo.setUsername("莉莉");
        userInfo.setPassword("789");
        userInfo.setPhoto("莉莉.png");
        System.out.println("添加之前的 id: " + userInfo.getId());
        int result = userMapper.addUserAndGetId(userInfo);
        System.out.println("添加之后的 id: " + userInfo.getId());
        System.out.println("添加结果:" + result);
    }
}



启动测试方法,观察结果


MyBatis 打印日志:


66f18232e88e4089b5528394289182ba.png


观察数据库:


09b91425fa2849918a4df2f58737db42.png


注意事项


实际上,我们只需要将实体类的属性与数据表中的字段名对应起来,就可以达到互相转换的结果,MyBatis 只是作为中间桥梁,为我们转换了而已。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
目录
相关文章
|
8月前
|
数据采集 存储 搜索推荐
从零开始搭建埋点采集体系:轻松解锁用户行为分析
埋点技术因其高精度和定制化能力,成为许多公司的首选方式。然而,有些公司在埋点采集时,将其视为开发过程中的“附加任务”,让研发人员在开发过程中顺带加上一些埋点,而没有完整的规划和验证。这往往导致数据分析的效果不尽如人意。为了避免这种情况,我们需要将数据采集提升到项目级别,进行系统化的规划和实施。
从零开始搭建埋点采集体系:轻松解锁用户行为分析
|
机器学习/深度学习 自然语言处理 算法
编译器:原理与技术的奥秘
编译器:原理与技术的奥秘
|
Kubernetes jenkins 测试技术
Jenkins,持续交付的利器:揭秘插件生态系统(二)
Jenkins,持续交付的利器:揭秘插件生态系统
|
前端开发 JavaScript Java
Apache Wicket 框架:踏上从新手到英雄的逆袭之路,成就你的编程传奇!
【9月更文挑战第4天】Apache Wicket是一款基于Java的开源Web应用框架,以简洁、易维护及强大功能著称。它采用组件化设计,让页面开发更为模块化。Wicket的简洁编程模型、丰富的组件库、良好的可维护性以及对Ajax的支持,使其成为高效开发Web应用的理想选择。下文将通过解析Wicket的基本概念与特性,帮助读者深入了解这一框架的优势。
564 1
|
数据可视化 测试技术 uml
【掌握绘图艺术】用PlantUML绘制完美UML图表,开发者的福音
【掌握绘图艺术】用PlantUML绘制完美UML图表,开发者的福音
3424 2
|
存储 Java 索引
java list集合相关介绍和方法使用操作
java list集合相关介绍和方法使用操作
237 1
|
安全 Linux 数据安全/隐私保护
Windows 部署 Elasticsearch + kibana 8.0 指南
Windows 部署 Elasticsearch + kibana 8.0 指南
|
Ubuntu 开发工具 C语言
EPICS的下载与安装
主要讲述的是EPICS的下载安装
680 1
|
JavaScript 调度
万界星空科技MES与WMS如何集成的?
传统制造业数字化转型正汹涌而来,要进一步提高产业发展质量,重塑制造业竞争优势,就必须加快发展数字化制造,加紧推动制造业的数字化转型。
301 0
|
Java 数据库连接 数据库
mybatis plus中BaseMapper接口
在使用的过程中,BaseMapper会指定范型T,T又通过TableName关联了某个数据库的某张表,因此实际上BaseMapper的所有操作都是针对某个数据库的某张表来执行。

热门文章

最新文章