网站首页 > 技术文章 正文
序
大家好,我是乐于分享编程知识和实战项目的老K,今天我们会继续讲解MyBatis相关的知识。
经过前面几讲的铺垫,我们已经掌握了MyBatis的配置、连接、映射以及查询的相关知识,有需要的小伙伴可以点击下面的连接获取信息:
- MyBatis精讲(一)MyBatis基础配置及持久层连接创建代码实战
- MyBatis精讲(二)常用工具MyBatisUtils类的实现
- MyBatis精讲(三)一篇文章让你学会如何用MyBatis获取数据
- MyBatis精讲(四)查询数据方法精讲及实战代码集合
本期,我们将一起来探索,如何用MyBatis将“增删改”的操作实现。
开始本次内容前,请务必搭配前四期的内容一起服用,效果才更好哦。
尤其是SQL数据库导入代码,可以到《MyBatis精讲(三)一篇文章让你学会如何用MyBatis获取数据》获取。
一、增 - 添加数据
在开始增删改的分享前,我们先对齐一个知识点——事务机制。
所谓事务机制,就是保证数据操作完整性的一种安全机制。 概念可能有些晦涩,我们这里举个例子: 当你向商户甲转账的时候,其实背后至少有2组数据需要改动: 其一是你的账户余额要减少,其二是商户甲的账户余额要增加。 如果没有一种安全机制,两者在计算机处理中是相互独立的,可能会发生你的资金没减少但商户甲收到付款,或者你资金已经支付减少了但商户甲没有收到货款的情况。 事务机制就是这样的一种安全机制,保证整个事务中的所有数据都能成功写入时,才将数据更新到数据库,否则回滚数据,也就是作操作失败的处理。
MyBatis中的“增删改”,都使用了事务机制,这点我们会在案例中详细讲解一下。
添加数据的具体操作如下:
在mapper映射文件humanResource.xml中编写映射方法:
<insert id="insert" parameterType="koder.mybatis.entity.Employee" useGeneratedKeys="true" keyProperty="id"
keyColumn="id">
insert into employee(name, depart, salary, age)
values (#{name}, #{depart}, #{salary}, #{age})
</insert>
- 与之前的查询方法不同,增添数据使用的是<insert>标签;
- 属性id表示方法名为insert;
- 属性parameterType表示传入的参数类型为Employee类;
- 属性useGeneratedKeys表示是否使用自动生成键值,这里选true,与keyProperty、keyColumn搭配使用,起到与SQL中“主键自增”相同的效果;
- 属性keyProperty表示自增键在java实体类中的私有变量名;
- 属性keyColumn表示自增键在数据库中的字段名;
MyBatisTest.java中的测试用例:
@Test
public void testInsert() {
SqlSession session = null;
try {
session = MyBatisUtils.openSession();
Employee employee = new Employee();
employee.setAge(27);
employee.setDepart("技术部");
employee.setName("冯晨");
employee.setSalary(4700.0f);
int num = session.insert("humanResource.insert", employee);
session.commit();
System.out.println(employee.getId());
} catch (Exception e) {
if (session != null) {
session.rollback();
}
throw new RuntimeException(e);
} finally {
MyBatisUtils.closeSession(session);
}
}
- 先通过new和setter方法设置一个新的Employee实例;
- 通过session.insert调用映射表中的插入方法,将实例传入映射方法;
- 通过session.commit()告知程序事务相关数据处理完成,在此处进行提交;
- 在catch代码块中,用session.rollback()处理数据写入失败的情况,根据事务机制对结果进行回滚并报错;
- 由于我们在映射表中启用了useGeneratedKeys设置,并定义了自增键为id,所以当数据提交成功后,我们可以立刻在employee 对象中获取到自动生成的id结果;
返回的结果即自动生成的新id号:
6003
此时,查看数据库,你会发现数据库中新增了一条关于“技术部冯晨”的数据。
二、改 - 修改数据
修改数据和添加数据的思路及用法十分类似。
首先,在mapper映射文件humanResource.xml中编写映射方法。
<update id="update" parameterType="koder.mybatis.entity.Employee">
update employee
set name = #{name}, depart = #{depart}, salary = #{salary}, age = #{age}
where id = #{id}
</update>
- 修改数据需要使用<update>标签;
- 属性id和parameterType表示该映射的名称和传入的参数类型,类型为Employee;
MyBatisTest.java中的测试用例:
@Test
public void testUpdate() {
SqlSession session = null;
try {
session = MyBatisUtils.openSession();
Employee em = session.selectOne("humanResource.selectById", 6003);
em.setSalary(5700.0f);
int num = session.update("humanResource.update", em);
session.commit();
} catch (Exception e) {
if (session != null) {
session.rollback();
}
throw new RuntimeException(e);
} finally {
MyBatisUtils.closeSession(session);
}
}
- 由于修改的必定是数据库中存在的数据,所以先通过select的方法将数据从数据库中取出来,本例使用的是selectById方法;
- 拿到数据后,由于在mapper映射文件中已经定义了selectById输出类型resultType为Employee, 所以直接存入Employee 变量em中即可;
- 通过Employee的setter方法对em数据进行修改;
- 使用session.update方法将数据传入映射方法,实现数据的更新;
- 依照事务机制的要求,使用commit实现提交,使用rollback实现异常回滚;
运行完成后,你会发现,数据库中关于员工6003的薪酬发生了更新。
三、删 - 删除数据
在mapper映射文件humanResource.xml中编写映射方法:
<delete id="delete" parameterType="Integer">
delete from employee where id = #{value}
</delete>
- 删除的标签是<delete>,使用和属性与<select>一致,可以参考前文selectById的部分->【传送门: MyBatis精讲(四)查询数据方法精讲及实战代码集合】:
MyBatisTest.java中的测试用例:
@Test
public void testDelete() {
SqlSession session = null;
try {
session = MyBatisUtils.openSession();
int num = session.delete("humanResource.delete", 5002);
session.commit();
} catch (Exception e) {
if (session != null) {
session.rollback();
}
throw new RuntimeException(e);
} finally {
MyBatisUtils.closeSession(session);
}
}
- 本例为删除员工5002;
- 在掌握前述增改方法、以及事务机制的前提下,代码理解并无难点,不作展开;
运行测试代码后,数据库中的员工5002信息已被删除。
至此,我们以及完整的分享了MyBatis包括增删改查在内的所有基本操作。
感谢你和我一起经历了5篇文章的学习。
这里的知识虽然晦涩,但却是java工程师十分实用的知识,希望这段时间的分享能给你的职业生涯带来帮助。
如果你对老K分享的内容有任何疑问,欢迎随时在评论区留言或者私信我。
正在学习的小伙伴记得给老K一个赞哦,你的支持是我持续输出课程内容最大的动力!
阅读推荐
除了看过了教程和知识点,学习Java时,也可以找些项目来练练手,看看自己掌握的情况。
我之前分享一些不错的Java练手项目,需要的可以点击下方卡片获取:
结束语
我是专注于开发领域的@老K玩代码 ,会持续生产关于如何学习编程语言的优质内容。
如果你想学习Java编程,或者想精进你的Java编程能力,可以关注我。
如果你对开发、编程有任何疑问或者有想了解的内容,而我暂时没有写到的,也欢迎随时来找我聊聊。
猜你喜欢
- 2024-11-21 MyBatis详解(二)
- 2024-11-21 想要开发中灵活的使用Mybatis?精通结果映射,你准了吗?
- 2024-11-21 小学妹问:Mybatis常见注解有哪些?
- 2024-11-21 重学Mybatis(二)-------主键自增 (含面试题)
- 2024-11-21 Mybatis入门
- 2024-11-21 重学Mybatis(五)-------分页 (含面试题)
- 2024-11-21 一、手写mybatis框架
- 2024-11-21 MyBatis中的翻页
- 2024-11-21 Mybatis的基础和高级查询应用实践
- 2024-11-21 看完这一篇学会MyBatis就够了
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)