一、相关配置
pom.xml相关依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.9</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.3.2</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>4.1.3</version> </dependency> </dependencies>
依赖载入过程中问题点
maven加载依赖的时候如果标了黄色波浪线,提示:Provides transitive vulnerable dependency maven,表示你选择的依赖版本有更好的选择,这个版本可能存在问题,具体可以去maven库里看是否标注了Vulnerabilities(文章中的maven配置的ali的镜像库,maven官方库中并没有标注Vulnerabilities,但是加载之后仍然会有黄色波浪线,换了依赖版本重新加载了一次,问题消失,有点奇怪)
yaml文件相关配置
yaml中主要配置的是数据源以及mybatis的一些属性,mybatisPlus的配置不用管,mybatis-plus-boot-starter这个依赖帮助mybatisPlus节省了配置的工作(文章中的数据源配置可用其他数据库策略,只要能连上就好)
server: port: 10011 spring: application: name: user_provider #服务名称 datasource: dynamic: primary: master #设置默认的数据源或者数据源组,默认值即为master strict: false #设置严格模式,默认false不启动. 启动后在未匹配到指定数据源时候回抛出异常,不启动会使用默认数据源. datasource: master: url: jdbc:mysql://127.0.0.1:3306/mateProject?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver # slave_1: mybatis: # 配置XML映射文件中指定的实体类别名路径 type-aliases-package: serverApi.entity # 配置MyBatis的xml配置文件路径 mapper-locations: classpath:mapper/*.xml # 开启驼峰uName自动映射到u_name map-underscore-to-camel-case: true
代码目录结构
以下分层仅代表个人习惯,仅展示和Mybatis以及plus使用过程中相关的,具体分层可自由安排。
实体类相关:
分为Param(执行查询等操作用的参数),Entity(数据库实体),Result(返回给前端)
Service:
Dao(直接关联数据库),IService(封装MybatisPlus,方便使用),Service(接口),ServiceImpl(接口实现)
Control:
Controller(处理请求)
Resource:
mapper(存放mybatis配套的xml文件)
二、MyBatis
使用方法
MyBatis需要自己写xml,和sql高度一致,只有一些mybatis的特殊标签需要注意一下。
首先在使用idea的时候,可以安装插件方便mybatis的使用(可装可不装,非必需),插件可以帮助在xml和对应的dao文件间快速跳转。
mybatis核心是写xml,第一步需要配置对应的xml文件,在上文的yaml文件中可以看到mybatis的一些配置,这里需要特别注意的是,mapper-locations的classPath默认是在resources文件夹下
这里创建mapper文件夹统一管理mybatis的xml文件,接下来写xml和对应的dao文件
dao文件(这里继承BaseMapper是为了使用MyBatis Plus,详细见MyBatis plus使用方法 ):
xml文件:
xml代码:
其中mapper namespace和dao是对应的,mapper上面的代码不需要改动,直接复制就行
<?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="serverProvider.dao.testDao"> <select id="getList" resultType="serverApi.entity.testEntity"> select * from test_table t <where> 1 = 1 <if test="ID != null and ID != ''"> and t.ID = #{ID} </if> <if test="name != null and name != ''"> and t.name = #{name} </if> </where> </select> </mapper>
接下来数据库里插入一条数据
调用接口看一下效果,以下为正常使用结果
备注
参数相关
在使用mybatis时,注意到此处写法为正常传参
使用的时候直接取对象中的属性,并不需要写成param.ID和param.name
如果直接写param.XXX,会报错There is no getter for property named param,原因是mybatis会自动读取传入对象,也就是说此时,ID等价于param.ID,如果在xml写param.ID,等价于param.param.ID,所以会报错。
当然参数传入有另一种更好的写法,使用@Param注解,此方法允许一次性传入多个参数,并且可以设置别名,xml根据别名识别属性,如下图所示:
SQL注入问题
另外需要注意的是在xml里写sql,绝大多数情况下都是使用“#{}”拼接参数,原因是这样可以防止sql注入。
三、MyBatis Plus
使用方法
mybatis plus性能相较于mybatis更强,且配置更加简便
首先dao文件继承BaseMapper
BaseMapper源码中有注解,BaseMapper相当于帮助开发人员写了通用的xml,所以mybatis plus看起来会更加简洁:
实体类testEntity:
实体类里需要使用TableName标注数据库名称,TableField标注数据库字段,更多相关注解可以看mybatis plus的注解说明。
接下来是IService文件(别忘了@Service注解):
Service接口:
Service实现类(别忘了@Component注解):
controller:
先存入一条数据:
查询:
备注
MyBatis Plus事务
可以注意到
这里是将事务交给spring boot去做处理,注解的方法整个作为一个事务,只有整个方法执行结束,数据才会写入数据库,否则根据rollbackFor指定的异常类型进行回滚操作。
这里要额外提一句,建议修改数据库的操作都加上事务,但是事务不能乱加,比如极其复杂的业务逻辑,并且内部还要调用其他方法,这种情况下在整个方法加事务固然省事,但是要考虑到这样做会导致数据库被长时间加锁,实际工作中极易产生死锁,更好的做法是在复杂业务逻辑中,将数据库更改操作解耦出来,单独加事务。
QueryWrapper相关
queryWrapper写完之后其实并不会执行,可以理解为他相当于自动帮你写sql,这里只是写好sql,执行需要调用IService的方法,需要额外注意的是IService的getOne方法并不会检查你sql写的对不对,在使用MySql数据库的情况下,需要在QueryWrapper加上last("limit 1"),从结果集中筛选一条数据,否则如果结果集有多条数据,会抛出异常nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2
四、总结
mybatis plus功能强大,但是现实业务中涉及到复杂sql时,写起来会比较复杂,并且mybatis plus中的queryWrapper的or 或 and关键词在代码量较大时,并不是很容易理解,这时候反而xml的优势更加明显(可能是因为大部分人更熟悉sql的写法)。
mybatis plus对于数据库更改操作有优化,批量保存,修改的性能很优秀,建议数据库变更操作使用mybatis plus。
技术没有绝对的优劣之分,分析需求,选择技术,才能提高开发效率,减少维护压力。