• Mybatis的使用


    一、Mybatis简介

    Mybatis是一个ORM框架。ORM(Object Relation Mapping)对象关系映射,就是将关系型数据库的数据表和代码对象建立映射关系,自动的完成数据表和对象的相互转换。

    二、Mybatis使用

    1. 引入依赖
      要使用Mybatis必须要引入Mybatis框架依赖和要操作的数据库驱动依赖。
      在创建项目时在SQL依赖中找到Mybatis框架和对应的数据库驱动(使用什么数据库就装什么数据库)

      • Mybatis依赖
        在这里插入图片描述
      • 数据库驱动依赖
        在这里插入图片描述
    2. 配置数据库连接和Mybatis设置文件的保存路径

      • 在Application配置文件中,配置数据库的url,username,password,以及数据库的驱动类的路径driver-name-class。
        在这里插入图片描述
      • 配置Mybatis的保存路径
        mybatis.mapper-locations;
        在这里插入图片描述
        (classpath:):代表了当前路劲,也就是配置文件的路径,也就是Resource文件夹下
        (*Mapper.xml):*表示一个占位符,代表Mapper前面还有字符。
        这个配置表示Mybatis的文件保存在Resource文件夹下的mybatis文件夹下的文件名以Mapper.xml结尾的文件中。
    3. 创建数据表对应的实体类
      将数据表的表项映射为实体类的属性,属性的名称和表的列名要一一对应。
      实体类必须要有set和get方法。
      在这里插入图片描述

    4. 实现接口类
      将操作数据库的的方法名写在接口里面。接口用@Mapper注释修饰,表示将这个接口托管给Mybatis。
      方法的参数就是sql语句要用来查询的参数,方法的返回值就是用来接收sql语句的查询结果的,查询结果的值要和返回值的属性名一一对应。
      在这里插入图片描述

    5. 设置sql查询语句
      根据配置文件中配置的路径(classpath:/mybatis/*Mapper.xml),在resource文件夹下创建mybatis文件夹,然后创建和接口对应的Mapper.xm文件。
      在这里插入图片描述
      文件名可以前面可以随便取,后面必须符合配置的Mapper.xml。
      然后复制粘贴xml配置模版

      <?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">
      >
         
      >
      
      • 1
      • 2
      • 3
      • 4
      • 5

      开始加入标签,绑定接口和接口参数,设置sql语句
      在这里插入图片描述

    6. 注入接口对象,使用配置方法
      配置完接口方法之后,就要使用这个接口了,直接在被类注释修饰的类中,用@Autowired注入接口对象,就可以使用接口的方法了。

      • 上面的Mapper.xml就是在配置接口方法的查询sql,配置好之后,接口的方法就算是被重写了,有方法体了,可以调用。
      • 上面接口用@Mapper修饰了,就交给Mybatis托管了,MyBatis会根据方法的配置文件,重写方法,然后形成一个代理对象,代理对象就会被Spring容器接收,使用@Autowired注入的其实是这个代理类对象。
        在这里插入图片描述
    7. sql语句中传入动态参数的方法

    一个是 ${}另一个是#{}
    注意:

    1. 其中${}就是直接替换
      #{}就是使用占位符,根据参数预处理,然后再查询
      这个在参数是String时会体现出来区别,因为${}是直接替换,字符串参数不会被加上引号,所以使用这个sql语句时,会报错,此时需要手动在${}外层加上引号:‘${}’,这样才能让字符串传参时被正确识别。
      使用#{}替换,使用的是占位符,会对字符串参数进行正确预处理,就能正常的查询。
    2. ${}存在安全问题,这是因为${}是直接全盘替换的,如果替换的字符串是一个特定的字符串,比如字符串中有’(引号),这样的数据字符串会和${}外层的’’配对,导致sql语句出错。
    3. ${}的应用场景,${}虽然有安全问题,但是它也有自己的应用场景,前面说了,#{}传递的参数会进行预处理,这个预处理不是根据#{}在sql中的身份去处理的,而是根据传来的参数类型,String就一定会被处理成带’’的字符串再放入sql语句中,所以当出现String放入sql语句中且不需要‘’包括的场景,就需要${}来实现了,典型的应用场景就是升序或者降序查询的问题,sql查询语句的 by desc还是 by asc是要根据前端传的数据变化的,所以desc或者asc是一个参数,并且,desc和sac参数只能是一个字符串,并且不能被’’包裹,此时就只有使用${}了。

    综上:#{}和${}都有自身的局限和只有自己能实现的场景,主要还是看使用的时机,如果被传递的字符串是可以预期的,那就可以使用${}来接受,如果是不可预期到的那就使用#{}来接受更安全。

    1. 参数重命名注解@Param
      可以再接口的方法定义中对参数使用@Param注解,重命名这个参数映射在sql中的名字
      在这里插入图片描述
      在sql中就使用这个重命名的参数代表原参数名了。

    三、XML中的sql局域配置标签

    1. 查找
      select查询语句的标签就是 中设置resultMap属性来替代resultType属性
      在这里插入图片描述
      除了使用resultMap来使名称不同的类属性和列名互相映射之外,还可以设置列的别名来识别不同映射。
      在这里插入图片描述

    五、多表的查询

    多表查询会遇到一个问题:多表查询的结果是多个表的联合结果,此时用什么类来映射这个临时结果呢?
    例子:

    查一篇文章数据,就需要查两个表,一个文章表,一个用户表,因为文章表中一般只有一个userid,用userid来查找到作者信息。联合查询到的信息才是前端展示这篇文章要用到的所有信息。
    所以这个多表查询的的结果一般为文章表的所有信息,以及一个用户表的部分信息。
    此时就遇到一个问题,用什么实体类来接收这个结果呢?
    为了接收这个数据,就要专门再定义一个实体类,这个实体类需要有文章实体类的全部属性,并且添加一些用户类的属性。所以这个实体类可以继承文章类,然后添加字段,由于这个类是为了让前端获取数据方便而专门设计的,这个类名可以加上VO(View Out,前端输出)
    使用继承而不是直接在原本的类中添加一个字段的好处是:
    1.让代码的可读性更高,更易于理解
    2.符合单一设计原则

    继承的形成的子类实体类
    使用@Data这个注解自动生成toString方法时要注意,如果是对子类使用这个注解,这个生成的toString只会将子类内定义的属性打印,不会打印父类中的属性。要自己重写toString方法。自己重写了之后@Data就不会再重写了。使用generate生成,并且选择添加父类toString的模本,
    在这里插入图片描述

    六、动态sql语句

    1. 什么是动态sql语句?
      sql语句中操作的列是在根据用户的选择变化的,同一个功能可能操作不同的列,所以sql语句要根据传来的参数对操作的列进行动态调整。
    2. 动态sql语句的实现标签
      • 标签
        必须设置属性test,代表的是if标签的条件,满足了这个test的条件,就加入标签的内容,如果有多个条件就用and和or来并列。
        在这里插入图片描述If标签内容的逗号也是非常关键的,必须要思考一下,插入和不插入这个标签的值是否会影响原本语句,所以要想一下逗号的位置。
        只要有一个必填项,就可以让必填项做末尾,然后其他的选填项都在名称后面添加逗号,但是如果一个必填项都没有,单独使用标签就没有办法实现逗号的正确显示了

      • 标签
        trim就是用来解决逗号问题的,trim有四个属性,添加前缀prefix,添加后缀suffix,去除前缀prefixOverrides,去除后缀suffixOverrides。
        Trim都是去除或添加在被Trim包裹的标签块内部的内容
        Trim去后缀的好处是,如果有这个就去掉,如果没有也不做任何的改变。
        在这里插入图片描述

      • 标签
        当在where语句中,如果所有的条件判断都是非必填项,where条件在所有天剑都不插入的时候,就可能会出问题。
        此时就可以使用where标签来包裹所有的if标签

        • where标签会自动生成where前缀。
        • where标签会判断内容是否有内容,没有内容就不会生成where,直接什么也不干。
        • where标签还能自动去除and或者or前缀,也只能去除前缀(所以and或者or要写在if内容的首部)
          在这里插入图片描述

        where标签也可以使用trim代替。因为where标签的三个功能,trim标签都能实现。

        • trim可以设置prefix属性来设置生成前缀where
        • trim可以设置prefixOverride来设置删除前缀and或者or
        • trim标签如果没有内容也什么都不会生成
          在这里插入图片描述
      • 标签
        和where标签差不多,也可以自动生成set,并且set标签会将多余的逗号后缀给去除。
        如果set中没有信息,set标签就不会生成set,啥也不干
        set标签也可以使用trim来代替
        在这里插入图片描述

      • 标签(批量操作标签)
        这个foreach就是将集合对象的所有值全部插入到sql语句中,并用separator这个属性的值作为每个值的分割符。
        在使用时要用collection指定插入的集合名
        Item来作为集合单个参数的别名
        Open和close作为整个foreach标签内容的前缀和后缀
        最终foreach呈现出的内容就是前缀和后缀包裹着foreach标签里面的内容复制成多份,每份用分割字符分割,份数就是集合内元素的数量
        在这里插入图片描述

    七、配置单元测试

    单元测试就是对程序的最小可测试单元进行功能性的验证的过程,简单来说就是测试功能是否符合预期。但是又和讲程序跑起来使用对应功能来测试不一样,单元测试是在代码中写下测试代码,只需要运行测试代码就可以测试出代码功能是否符合预期。

    1. 单元测试的好处:
      (1) 单元测试可以帮助我们绕开逻辑的限制,直接测试目标单元功能。
      (2) 单元测试在打包的时候发现问题,如果单元测试不通过,打包是不会成功的。
      (3) 单元测试在测试功能的时候可以不污染数据库,就是测试数据库的增删改查功能,但是又真正的对数据库的数据进行改变
      (4) 简单
    2. 使用单元测试的流程
    • 需要使用依赖,但是这个依赖时spring-boot框架自带的在这里插入图片描述
      这个测试依赖里面集成了junit这个测试框架
    • 要测试哪个类就在哪里右键生成在这里插入图片描述
      选中其中的test
      在这里插入图片描述
      因为这是在接口中generate,所以每个getter,Setter没有
      在这里插入图片描述
      选中要测试的类的方法
      这是生成的测试类
      在这里插入图片描述
      然后添加springBootTest注释,(这个注释的单元测试类是在spring boot环境中,这个单元测试也是要使用spring容器的)
      并添加测试代码
      在这里插入图片描述
      当同一个类有多个方法要测试时,首次创建测试类时只指定了一个测试方法,第二次添加时和首次步骤一样,只需要添加类方法就可以。
      测试类方法旁边有专属的运行键,代表运行测试这一个单独方法

    在这里插入图片描述点击运行之后就可以运行起来此时代码了。

    八、配置打印sql语句

    在这里插入图片描述
    但是配完上面的还不行,因为sql语句日志默认级别是debug,而项目默认的日志打印级别是info,所以还要将默认日志级别改为debug。
    Logging.leve.com.exmple.demo=debug

  • 相关阅读:
    刘洪盛广东发研考察宝隆农业国稻种芯功能性水稻示范基地
    python-turtle库
    基于jsp+mysql+SSM学生兼职网站-计算机毕业设计
    [论文阅读] 颜色迁移-Correlated Color Space
    注解在Java中有什么用?请给出示例
    SQALE 是什么
    Visual Studio 集成了.NET 升级助手插件
    81-RabbitMQ详解
    整理mongodb文档:搭建分片集群
    231n--CNN 卷积神经网络
  • 原文地址:https://blog.csdn.net/qq_61925446/article/details/132835039