spring boot使用my batis和my batis plus方法及问题处理

文章讲述了Maven依赖管理和配置,包括pom.xml中的相关依赖,以及在使用MyBatis和MyBatisPlus时遇到的问题,如依赖版本警告、数据源配置、SQL注入防范和MyBatisPlus的事务管理与QueryWrapper的注意事项。
摘要由CSDN通过智能技术生成

一、相关配置

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。

        技术没有绝对的优劣之分,分析需求,选择技术,才能提高开发效率,减少维护压力。

  • 35
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值