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 只是作为中间桥梁,为我们转换了而已。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
存储 缓存 Java
|
SQL 存储 缓存
二.吃透Mybatis源码-Mybatis执行流程
上一篇文章我们分析了一下Mybatis的初始化流程,跟踪了一下Mybatis的配置解析过程,SqlSessionFactory和SqlSession的创建过程,这篇文章我们来分析一下SqlSession的执行流程
|
SQL XML 存储
一.吃透Mybatis源码-Mybatis初始化
Mybatis是Java 项目开发使用率非常高的一款持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 同时Mybatis也是面试过程中被高频问到的一门技术,今天我就带大家一起来对Mybatis的重要原理及其源码进行一个分析。
|
7月前
|
SQL Java 数据库连接
还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
141 1
|
7月前
|
SQL Java 关系型数据库
一文彻底搞懂Mybatis系列(一)之mybatis入门
一文彻底搞懂Mybatis系列(一)之mybatis入门
686 0
|
7月前
|
SQL 缓存 Java
一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
一文彻底搞懂Mybatis系列(十五)之MyBatis二级缓存
453 0
|
7月前
|
SQL 缓存 Java
一文彻底搞懂Mybatis系列(十四)之MyBatis一级缓存
一文彻底搞懂Mybatis系列(十四)之MyBatis一级缓存
176 0
|
SQL 存储 前端开发
一文解惑mybatis中的#{}和${}
一文解惑mybatis中的#{}和${}
|
SQL XML Java
MyBatis系列-入门篇
MyBatis系列-入门篇
117 0
|
SQL XML 存储
Mybatis知识点总结
Mybatis知识点总结
216 0