本篇博客是接着上一篇博客所写的,上一篇博客主要介绍了 MyBatis 的第一次使用,本篇博客主要介绍 MyBatis 的 CURD.
基本的增删改查
由于上篇博客介绍了查询操作,所以基本的查询操作就不演示了。我们一起来看一下修改、删除、添加操作。
一、修改操作
预期效果
我们预期通过 " id " 来修改 " username " 值。
代码实现
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 打印日志:
观察数据库:
使用 " @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 打印日志:
观察数据库:最终我们发现 " 小红 " 并未被改变
结论: " @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 打印日志:
观察数据库:
注意事项
① 往数据表中添加数据时,需要提前准备好一个实体类。标准情况下,实体类的成员变量名和数据表中的字段名应该相同。
② 在编辑 " xml 文件 " 时,占位符必须与实体类的成员变量相同。
只有准备好了上面的这两点,MyBatis 框架才能够自动帮我们相互识别。
四、第二个添加操作
我们预期在添加用户的同时,也能够获取到表中用户的 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 打印日志:
观察数据库:
注意事项
实际上,我们只需要将实体类的属性与数据表中的字段名对应起来,就可以达到互相转换的结果,MyBatis 只是作为中间桥梁,为我们转换了而已。