• MyBatis 初阶


    引言

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

    上一篇博客链接

    基本的增删改查

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

    一、修改操作

    预期效果

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

    1-1

    代码实现

    UserMapper 接口:

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

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

    " xml 文件 "

    
    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">
    
        
        <update id="updateUsernameById">
            update userinfo set username = #{username} where id = #{id}
        update>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试类:

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

    @SpringBootTest
    class UserMapperTest {
    
        @Resource
        private UserMapper userMapper;
        
        // 2. 根据用户 id 修改某个用户的昵称
        @Test
        void updateUsernameById() {
            String username = "小红";
            int result = userMapper.updateUsernameById(2, username);
            System.out.println("修改结果:" + result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    启动测试方法,观察结果

    MyBatis 打印日志:

    1-2

    观察数据库:

    1-3

    使用 " @Transactional " 注解

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

    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    MyBatis 打印日志:

    1-4

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

    1-5

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

    二、删除操作

    代码实现

    " UserMapper " 接口:

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

    " xml 文件 "

    
    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">
    
        
        <delete id="deleteUserById">
            delete from userinfo where id = #{id};
        delete>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试类:

    @SpringBootTest
    class UserMapperTest {
    
        @Resource
        private UserMapper userMapper;
    
        // 3. 根据用户 id 删除某个用户全部信息
        @Test
        @Transactional
        void deleteUserById() {
            int result = userMapper.deleteUserById(2);
            System.out.println("删除结果:" + result);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    三、添加操作

    代码实现

    " 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    " UserMapper " 接口:

    @Mapper
    public interface UserMapper {
    
        // 4. 添加新用户
        public int addUser(UserInfo userInfo);
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    " xml 文件 "

    
    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">
    
        
        <insert id="addUser">
            insert into userinfo (username, password, photo) values (#{username}, #{password},#{photo})
        insert>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试类:

    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    启动测试方法,观察结果

    MyBatis 打印日志:

    1-5

    观察数据库:

    1-6

    注意事项

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

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

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

    1-7

    四、第二个添加操作

    我们预期在添加用户的同时,也能够获取到表中用户的 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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    " UserMapper " 接口:

    @Mapper
    public interface UserMapper {
    
        // 5. 添加新用户并获得用户的 id
        public int addUserAndGetId(UserInfo userInfo);
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    " xml 文件 "

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

    ① useGeneratedKeys 表示对应的字段是否是主键
    ② keyColumn 表示从表中拿的字段名
    ③ keyProperty 表示字段值赋值给实体类的哪个属性

    
    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">
    
        
        <insert id="addUserAndGetId" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
            insert into userinfo (username, password, photo) values (#{username}, #{password}, #{photo})
        insert>
    
    mapper>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    测试类:

    @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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    启动测试方法,观察结果

    MyBatis 打印日志:

    1-8

    观察数据库:

    1-9

    注意事项

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

  • 相关阅读:
    JVM(八股文)
    正则表达式
    简化 Go 开发:使用强大的工具提高生产力
    solr安装后修改配置文件,启动
    Python 图形化界面基础篇:更改字体、颜色和样式
    今天是1024节日,作为一个程序员,我想表达我对Java和詹姆斯·高斯林(James Gosling)的感激之情
    No converter found for return value of type: class
    DDD领域驱动模型笔记
    java计算机毕业设计社区卫生预约挂号系统源码+系统+mysql数据库+lw文档+部署
    2、Calcite 源码编译与运行
  • 原文地址:https://blog.csdn.net/lfm1010123/article/details/127247159