当前位置:   article > 正文

MyBatis 初阶

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 文件 "

<?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>
  • 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 文件 "

<?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>
  • 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 文件 "

<?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>
  • 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 表示字段值赋值给实体类的哪个属性

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/536504
推荐阅读
相关标签
  

闽ICP备14008679号