javaweb - Mybatis6
Mybatis详解4
DML 操作
前面我们介绍了查询操作,我们接着来看修改相关操作(增、删、改)。
Mybatis为我们的DML操作提供了几个预设方法:
int insert(String statement);
int insert(String statement, Object parameter);
int update(String statement);
int update(String statement, Object parameter);
int delete(String statement);
int delete(String statement, Object parameter);
可以看到,这些方法默认情况下返回的结果都是int类型的,这与我们之前JDBC中是一样的,它代表执行SQL后受影响的行数。
插入 insert标签
我们来尝试编写一个插入操作
Mybatis为我们提供的插入操作非常快捷,我们可以直接让一个User对象作为参数传入
即可在配置中直接解析其属性到insert语句中,这里需要用到insert标签:
<insert id="addUser" parameterType="com.test.entity.User">
insert into user (name, age) values (#{name}, #{age})
</insert>
这里我们将parameterType类型设置为我们的实体类型,这样下面在使用#{name}时Mybatis就会自动调用类中对应的Get方法来获取结果
不过,即使这里不指定具体类型,Mybatis也能完成自动推断,非常智能(参数名称要与实体类参数对应)。
和之前一样,我们也可以直接将其绑定到一个接口上:
public interface TestMapper {
int addUser(User user);
}
注意返回类型必须是int或是long这类数字类型,表示生效的行数,然后这里我们传入的参数直接写成对应的类型即可。
自增主键ID useGeneratedKeys
有些时候,我们的数据插入后使用的是一个自增主键ID,那么这个自增的主键值我们该如何获取到呢?
Mybatis为我们提供了一些参数用于处理这种问题:
<insert id="addUser" parameterType="com.test.entity.User" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into user (name, age) values (#{name}, #{age})
</insert>
这里useGeneratedKeys设置为true表示我们希望获取数据库生成的键
keyProperty设置为User类中的需要获取自增结果的属性名,keyColumn为数据库中自增的字段名称
但是一般情况下不需要手动设置,但是某些数据库(像 PostgreSQL)中,当主键列不是表中的第一列的时候,必须设置。
这样我们就可以获取到自增后的值了,接着我们什么都不需要做,Mybatis会在查询完后自动为我们的User对象赋值:
修改 update标签
我们接着来看修改操作,比如要根据ID修改用户的年龄:
<update id="setUserAgeById">
update user set age = #{age} where id = #{id}
</update>
int setUserAgeById(User user);
这里的参数我们依然选择使用User,和之前insert一样,Mybatis会从传入的对象中自动获取需要的参数,当然我们也可以将此方法设计为两个参数的形式:
int setUserAgeById(@Param("age") int age, @Param("id") int id);
删除
删除操作则更为简单,假设我们要根据用户的id进行数据的删除:
<delete id="deleteUserById">
delete from user where id = #{id}
</delete>
这些操作相比查询操作来说非常简单就可以实现,这里就不多做介绍了。
事务操作
我们可以在获取SqlSession关闭自动提交来开启事务模式,和JDBC其实都差不多
在创建SqlSession的时候不填写参数默认使用的就是事务模式:
try (SqlSession session = sqlSessionFactory.openSession(false)) { ... }
我们发现,在关闭自动提交后,我们的内容是没有进入到数据库的:
try(SqlSession session = MybatisUtils.openSession(false)) {
TestMapper mapper = session.getMapper(TestMapper.class);
mapper.deleteUserById(1); //虽然日志中已经提示生效1行,但是并没有提交
}
SqlSession接口中为我们提供了事务操作相关的方法,这里我们可以直接尝试进行事务的提交:
TestMapper mapper = session.getMapper(TestMapper.class);
mapper.deleteUserById(7);
session.commit(); //通过SqlSession进行事务提交
注意,如果我们在提交事务之前,没有进行任何的DML操作,也就是删除、更新、插入的其中任意一种操作,那么调用commit方法则不会进行提交,当然如果仍然需要提交的话也可以使用commit(true)来强制提交。
我们接着来测试一下回滚操作:
TestMapper mapper = session.getMapper(TestMapper.class);
mapper.deleteUserById(1);
System.out.println(mapper.selectUserById(1)); //此时由于数据被删除,无法查到
session.rollback(); //进行回滚操作
System.out.println(mapper.selectUserById(1)); //之前被删除的数据回来了
事务相关操作非常简单,这里就暂时先介绍这么多。
