mybatis mapper.xml dtd_全栈开发踩坑之路4-用MyBatis实现服务
1.前言
上一篇文章介绍了如何设计后端的Mysql数据库:Alex Wang:全栈开发踩坑之路3-MySql数据库设计,本文介绍如何用MyBatis实现后端服务。
本后端项目的Github地址(撰写中):apkkids/mymis_end
2.引入并配置MyBatis
在pom.xml中引入MyBatis的依赖项:
<dependency>
注意,在pom.xml中加入以下配置,解决idea不自动将xml配置文件拷贝到target目录中的问题。如果不加这个配置,会导致MyBatis的Mapper XML文档不自动拷贝,导致调试时代码执行失败。
<build>
在resource目录下添加配置文件mybatis-config.xml,该配置文件会开启MyBatis的调试log:
<?xml version="1.0" encoding="UTF-8" ?>
在application.properties中增加:
#mybatis
mybatis.config-location=classpath:/mybatis-config.xml
至此MyBatis就配置完成了。
3.代码结构
完整的实现数据库的CURD服务,需要编写实体类、Mapper接口、Mapper配置文件和服务类。
其中实体类存储了对应数据库表中记录的值,放在bean包中;
Mapper接口提供了对数据库进行操作的方法名,Mapper配置文件提供了Java和Mysql的对应配置,它们一起放在mapper包内,并且名字一致(除了后缀);
服务类调用了Mapper类中的方法,访问数据库,并对外提供访问接口,它们放在service包内。
另外,所需的单元测试代码放在test目录里。
3.1实体类
数据库中所有表,除了关联表外,每个表都对应一个实体类,编写方法比较简单,就是将表中所有字段都对应为一个实体Java类中的属性。为了便于调试,每个实体类还需要重载toString方法,重载toString()时可使用IntelliJ提供的generate... toString功能,生成的代码基本不需要改动。然后为每个属性生成Getter和Setter方法,这时也使用IntelliJ的generate... Getter and Setter功能。
字典表对应的实体类还要重载equals方法,用于比对两个字典项是否一致,此处也可以使用IntelliJ的generate...功能。
3.2Mapper接口与配置文件
从MyBatis3.0开始,支持使用Java来调用数据库访问方法,这个Java接口一般称之为Mapper接口,因为在Java接口上有@Mapper注解,此接口中,只需要声明方法即可,不需要实现此方法。若方法中包含参数,可以使用@Param来声明参数(例如@Param("id")),然后在XML配置文件中使用#{id}来指代这个参数。通过使用Mapper接口和相应的XML配置文件,就可以实现数据库的各种复杂操作。
MyBatis也支持使用注解来直接实现数据库访问,不需要XML配置文件,但是经过我的测试,这种方法对于一些复杂操作是无能为力的,因此还是使用XML加Mapper接口的方式为最佳。
3.3服务类
其实直接使用Mapper接口就可以很方便的操作数据库,但是从程序的架构上来考虑,还是设计一个服务层比较合理,服务层中都是服务类。例如,可以将四个操作字典表的Mapper接口统一写在一个DictionaryService服务类中,一目了然。也可以将操作实体和关联表的Mapper接口放在一个服务类中。
服务类代码基本上就是调用Mapper,然后进行一些数据的校验工作。
3.4测试类
利用JUnit进行单元测试,可以面向每个服务类编写一系列单元测试代码,从而确保每个数据库操作方法都是正确的。测试类和服务类是一一对应的。
下面给出字典表nation的例子:
实体类:省略。
Mapper接口:
@Mapper
XML配置文件:
<?xml version="1.0" encoding="UTF-8" ?>
(4)服务类(作为DictionaryService的一部分)
@Service
(5)测试类(作为DictionaryServiceTest的一部分)
@RunWith
以上几个代码完成后,直接运行测试代码,通过运行日志,就可以看到Mybatis是如何操作数据库的。观察可知,最重要的部分实际上是XML配置文件,它是MyBatis用来操作数据的主要手段,SQL语句也是穿插写在其中的。利用XML配置文件,再复杂的SQL语句也可以实现。至于Mapper接口和服务类,都是配合XML配置文件,完成功能的。
4.关于数据类型的处理
数据库中的datetime对应Java的Date类,在XML配置文件中要写jdbcType=DATE;
数据库中的tinyint对应Java的Boolean类;
使用MyBatis时,在Java中永远要使用包装类型,例如Boolean而不是原生类型boolean,使用Long而不是long。这一点已经在知乎上有人专门讨论过了。
5.下一步工作
使用MyBatis将数据库的简单CRUD操作实现后,下一步工作就开始准备实现系统登录相关功能。另外,在进一步完善系统的过程中,可能还需要实现更加复杂的数据库操作,届时将回头继续增加数据库操作功能。
6.学习资料
《MyBatis从入门到精通》
《阿里巴巴Java开发手册》:https://juejin.im/entry/589c173b8d6d81006c7e9f70。
mybatis mapper.xml dtd_全栈开发踩坑之路4-用MyBatis实现服务相关推荐
- 《Spring Boot+Vue全栈开发实战》读书笔记
写在前面 嗯,回家处理一些事,所以离职了,之前的公司用开源技术封装了一套自己的低代码平台,所以之前学的spring Boot之类的东西都忘了很多,蹭回家的闲暇时间复习下. 笔记整体以 Spring B ...
- 全栈开发实战 | SSM框架整合完整教程
"一个人最好的状态:梦想藏在心里,行动落于腿脚." 目录 1.前言 2.基本概念 2.1 MyBatis 2.2 Spring 2.3 SpringMVC 3.开发环境搭建 3.1 ...
- ehcache springboot_阿里内部进阶学习SpringBoot+Vue全栈开发实战文档
前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置烦琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...
- 《SpringBoot+vue全栈开发实战项目》笔记
前言 Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置繁琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能 ...
- SpringBoot+vue全栈开发实战笔记太香了
Spring 作为一个轻量级的容器,在JavaEE开发中得到了广泛的应用,但是Spring 的配置繁琐臃肿,在和各种第三方框架进行整合时代码量都非常大,并且整合的代码大多是重复的,为了使开发者能够快速 ...
- 扶贫干部拍胸脯认证,AI开发者上手零门槛,百度打造 “云智一体”全栈开发杀手锏...
"我可以拍着胸脯说识别准确率很高."扶贫干部刘乐这样评价他在使用百度EasyDL平台助力扶贫的效果,他是陕西省汉中市扶贫信息中心副主任,也是一名热爱编程的程序员. 在近期百度智能云 ...
- Spring Boot 专栏全栈开发实战
2020 年 11 月 12 日,Spring 官方发布了 Spring Boot 2.4.0 GA 的公告,链接为 Spring Boot 2.4.0 available now.为了让大家能够学习 ...
- SAP新一代全栈开发工具:SAP Business Application Studio
作为SAP从业者,我们能够清楚地感受到这些年SAP技术进化的趋势. SAP前端开发技术的进化方向,从SAP GUI,到能在浏览器里运行的ABAP Webdynpro / WebClient UI,再到 ...
- python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)
python全栈开发笔记第二模块 第四章 :常用模块(第二部分) 一.os 模块的 详解 1.os.getcwd() :得到当前工作目录,即当前python解释器所在目录路径 impor ...
最新文章
- 配置.net 3.0开发环境
- python类继承实例
- Java未赋值变量的默认初始值
- python mysqldb cursor_python中MySQLdb模块用法实例
- win7卸载打印机驱动
- 【数字图像处理】图像内插“双线性内插法 Bilinear interpolation”代码演示(以像素中心点确定像素位置)(图像放大缩小)具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊
- html表单赋值提交,jQuery自动给表单赋值
- leetcode 113. 路径总和 II(Path Sum II)
- 查看linux IO地址范围
- 剑指offer——面试题64:数据流中的中位数
- VS2019以及MFC的安装(详细)
- php有没有能无限遍历,php无限遍历目录代码
- mustache模板引擎
- 西门子 dp通讯测试软件,西门子 PLC DP通讯
- MTK 刷机操作说明v2.0(单路)
- html浮动垂直居中对齐,css如何设置垂直居中对齐?
- android-x86 地图,android 手机客户端百度地图 x86的jar包需要吗
- 接口测试常用文档模板介绍
- 一文了解 NextJS 并对性能优化做出最佳实践
- nginx设置IP、文件目录、请求头白名单