本篇博客是接着上一篇博客所写的,上一篇博客主要介绍了 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 文件 "
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>
测试类:
我们预期将 " 李明 " 改成 " 小红 ".
@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 " 注解,并预期将 " 小红 " 改成 " 杰克 ".
@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 文件 "
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>
测试类:
@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 文件 "
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>
测试类:
@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 表示字段值赋值给实体类的哪个属性
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>
测试类:
@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 只是作为中间桥梁,为我们转换了而已。