• MyBatis 查询数据库


    目录

    1.什么是 MyBatis

    • MyBatis 是一款优秀的持久层框架,它支持 自定义 SQL存储过程 以及 高级映射
    • MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
    • MyBatis 可以通过简单的 XML注解 来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

    简单来说 MyBatis更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库工具。

    2.MyBatis 环境搭建

    开始搭建 MyBatis 之前,MyBatis 在整个框架中的定位,框架交互流程图:
    在这里插入图片描述
    MyBatis 也是一个 ORM 框架,ORM(Object Relational Mapping),即对象关系映射。在面向对象编程语言中,将关系型数据库中的数据与对象建立起映射关系,进而自动的完成数据与对象的互相转换

    1. 将输入数据(即传入对象)+SQL 映射成原生 SQL
    2. 将结果集映射为返回对象,即输出对象

    ORM 把数据库映射为对象

    1. 数据库表(table)–> 类(class)
    2. 记录(record,行数据)–> 对象(object)
    3. 字段(field) --> 对象的属性(attribute)

    一般的 ORM 框架,会将数据库模型的每张表都映射为一个 Java 类。 也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换。

    2.1 创建数据库和表

    -- 创建数据库
    drop database if exists mycnblog;
    create database mycnblog DEFAULT CHARACTER SET utf8mb4;
    
    -- 使用数据数据
    use mycnblog;
    
    -- 创建表[用户表]
    drop table if exists  userinfo;
    create table userinfo(
        id int primary key auto_increment,
        username varchar(100) not null,
        password varchar(32) not null,
        photo varchar(500) default '',
        createtime datetime default now(),
        updatetime datetime default now(),
        `state` int default 1
    ) default charset 'utf8mb4';
    
    -- 创建文章表
    drop table if exists  articleinfo;
    create table articleinfo(
        id int primary key auto_increment,
        title varchar(100) not null,
        content text not null,
        createtime datetime default now(),
        updatetime datetime default now(),
        uid int not null,
        rcount int not null default 1,
        `state` int default 1
    )default charset 'utf8mb4';
    
    -- 创建视频表
    drop table if exists videoinfo;
    create table videoinfo(
      	vid int primary key,
      	`title` varchar(250),
      	`url` varchar(1000),
    		createtime datetime default now(),
    		updatetime datetime default now(),
      	uid int
    )default charset 'utf8mb4';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    2.2 添加 MyBatis 框架支持

    ① 在已有的项目中添加:

    
    
    	org.mybatis.spring.boot
    	mybatis-spring-boot-starter 
    	2.1.4
    
    
    
    	mysql
    	mysql-connector-java 
    	runtime
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    ② 在创建新项目时添加:

    在这里插入图片描述

    2.3 配置数据库连接和MyBatis

    在 application.yml 配置数据库连接:

    # 配置数据库连接
    spring:
      datasource:
        url: jdbc:mysql://127.0.0.1/mycnblog?charsetEncoding=utf8
        username: root
        password: 12345678
        driver-class-name: com.mysql.cj.jdbc.Driver
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置 MyBatis 中的 XML 路径:

    # 设置Mybatis的xml保存路径
    mybatis:
      mapper-locations: classpath:mybatis/**Mapper.xml
    
    • 1
    • 2
    • 3

    2.4 添加代码

    按照后端开发的工程思路来实现 MyBatis 查询所有用户的功能:
    在这里插入图片描述
    目录结构:
    在这里插入图片描述

    2.4.1 添加实体类

    添加用户的实体类:

    @Setter
    @Getter
    @ToString
    public class UserInfo {
        private int id;
        private String username;
        private String password;
        private String photo;
        private String createtime;
        private String updatetime;
        private int state;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.4.2 添加 mapper 接口

    数据持久层的接口定义:

    @Mapper
    public interface UserMapper {
    	public List getAll(); 
    }
    
    • 1
    • 2
    • 3
    • 4

    2.4.3 添加 UserMapper.xml

    数据持久层的实现,mybatis 的固定 xml 格式:

    
    
     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    UserMapper.xml 查询所有用户的具体实现 SQL:

    
    
    
    	 
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    标签说明:

    • 标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定名,包括全包名.类名。

    • select * from userinfo where id = #{id}

      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      3.4.2 多表查询

      但有些场景就需要用到返回字典映射(resultMap)比如:

      • 字段名称和程序中的属性名不同的情况;
      • 对和对多关系。

      ① 字段名和属性名不同的情况

      在这里插入图片描述
      在这里插入图片描述
      xml 如下:

       
      
       
      
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

      在这里插入图片描述
      ② 一对一映射
      一对一映射要使用 标签,具体实现如下(一篇文章只对应一个作者):

      
      	
      	
      	
      	
      	
      	
      	
      	
      	
      	 
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • property 属性:指定 Article 中对应的属性,即用户。
      • resultMap 属性:指定关联的结果集映射,将基于该映射配置来组织用户数据。
      • columnPrefix 属性:绑定一对一对象时,是通过
        columnPrefix+association.resultMap.column 来映射结果集字段。

      ③ 一对多映射
      一对多需要使用 标签,用法和 相同,如下所示:

       
      	
      	 
      	 
      	
      	
      	 
      
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      3.4.3 like查询

      like 使用 #{} 会报错,可以考虑使用 mysql 的内置函数 concat() 来处理,实现代码如下:

          
      
      • 1
      • 2
      • 3
      • 4
      • 5

      4.动态SQL使用

      动态 sql 是Mybatis的强大特性之一,能够完成不同条件下不同的 sql 拼接。
      可以参考官方文档:Mybatis动态sql

      4.1 if 标签

      
              insert into userinfo(username,
              
                  photo,
              
              password)
              values (#{username},
              
                  #{photo},
              
              #{password})
          
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      test中的对象是传入对象的属性,当它不为空时,才拼接里面的内容。

      4.2 trim 标签

      标签中有如下属性:

      • prefix:表示整个语句块,以prefix的值作为前缀
      • suffix:表示整个语句块,以suffix的值作为后缀
      • prefixOverrides:表示整个语句块要去除掉的前缀
      • suffixOverrides:表示整个语句块要去除掉的后缀

      示例:

          
              insert into userinfo
              
                  
                      username,
                  
                  
                      photo,
                  
                  
                      password
                  
              
              values
              
                  
                      #{username},
                  
                  
                      #{photo},
                  
                  
                      #{password}
                  
              
          
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26

      4.3 where 标签

      传入的用户对象,根据属性做where条件查询,用户对象中属性不为 null 的,都为查询条件。

      • 标签, 如果有查询条件就会生成where, 如果没有查询条件就不会生成where
      • 会判断第一个条件前面有没有and, 如果有就会去掉.
          
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      4.4 set 标签

      更新的时候也会出现问题, 使用 标签来解决(与标签类似):

          
              update userinfo
              
                  
                      username=#{username},
                  
                  
                      password=#{password}
                  
              
              where id=#{id}
          
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12

      4.5 foreach 标签

      对集合进行遍历时可以使用该标签。标签有如下属性:

      • collection:绑定方法参数中的集合,如 List,Set,Map或数组对象
      • item:遍历时的每一个对象
      • open:语句块开头的字符串
      • close:语句块结束的字符串
      • separator:每次遍历之间间隔的字符串

      示例:

          
              delete from userinfo where id in
              
                  #{id}
              
          
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
  • 相关阅读:
    C# 在流行度指数上将超过Java
    行业报告:视频直播美颜sdk对互联网直播产业的影响与前景
    react 低代码图编辑探索
    Vue Router 嵌套路由
    Docker 常用命令全解析:提升对雷池社区版的使用经验
    在基于ABP框架的前端项目Vue&Element项目中采用电子签章处理文件和打印处理
    【树莓派】yolov5 Lite,目标检测,行人检测入侵报警
    Docker资源控制管理
    如何把pdf拆分成多个文件?
    【原创】基于Jsp+Servlet的茶叶商城(在线商城毕业设计源代码)
  • 原文地址:https://blog.csdn.net/m0_67402013/article/details/126035014