MyBatis查询数据库

1.MyBatis是什么?

MyBatis是一款有序的持久层框架,能更简单的完成程序和数据库交互的工具,也就是更简单的的操作和读取数据库的工具。

2.为什么要学习MyBatis?

我们原来操作数据库的时候,是使用JDBC的代码,但是它是非常麻烦的。每次都要建立数据库连接池,通过DataSource获取数据库连接Connection,然后执行语句,最后还要释放资源等等,这是相当繁琐的步骤。学习使用MyBatis就能更加简单的操作数据库了。

3.怎么学习MyBatis?

MyBatis学习分为两个部分:

  • 配置MyBatis开发环境
  • 使用MyBatis模式和语法操作数据库。

4第一个MyBatis查询操作

开始搭建MyBatis之前,我们先看一下MyBatis在整个框架中的定位,框架交互流程图:

MyBatis查询数据库_第1张图片

 4.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';

-- 添加⼀个⽤户信息
INSERT INTO `mycnblog`.`userinfo` (`id`, `username`, `password`, `photo`,
`createtime`, `updatetime`, `state`) VALUES
(1, 'admin', 'admin', '', '2021-12-06 17:10:48', '2021-12-06 17:10:48', 1);

-- ⽂章添加测试数据
insert into articleinfo(title,content,uid)
 values('Java','Java正⽂',1);

4.2添加MyBatis框架支持

MyBatis查询数据库_第2张图片

 4.3配置连接字符串和MyBatis

4.3.1配置连接字符串

下面是application.yml的文件的相关配置:

Spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mycnblog?characterEncoding=utf8&userSSL=fasle
    username: root
    password: 1020118096
    dirver-class-name: com.mysql.jdbc.Driver

4.3.2配置MyBatis中XML路径

# 配置 mybatis xml的文件路径名,在resources/mapper创建所有表的xml文件
mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml

4.4添加业务代码

下面是后端开发的工程思路,也就是下面的流程来实现MyBatis查询所有的用户功能:

MyBatis查询数据库_第3张图片

 4.4.1添加实体类

先添加用户的实体类:

import lombok.Data;
import java.util.Date;
/**
 * Describe:
 * User:lenovo
 * Date:2023-07-28
 * Time:9:14
 */
@Data
public class User {
    private Integer id;
    private String username;
    private String password;
    private String photo;
    private Date createTime;
    private Date updateTime;
    
}

4.4.2添加mapper接口

数据持久层的接口定义:

@Mapper
public interface UserMapper {
    
    public List getAll();
}

4.4.3添加UserMapper.xml

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





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




    

以下是对标签的说明:

  • 标签:需要指定namespace属性,表示命名空间,值为mapper接口的全限定名
  • select * from userinfo where id = #{id}

    MyBatis查询数据库_第7张图片

     test方法:

    @SpringBootTest
    class User1MapperTest {
    
        @Autowired
        private User1Mapper user1Mapper;
    
        @Test
        void getUserById() {
            System.out.println(user1Mapper.getUserById(1));
        }
    }

     6.2多表查询

    在进行多表查询的时候,如果我们使用resultType标签,在一个类中包含了另一个对象是查询不出来所包含的对象的,比如以下代码:

    @Data
    public class ArticleInfo {
        private Integer id;
        private String title;
        private String content;
        private LocalDateTime createtime;
        private LocalDateTime updatetime;
        private Integer rcount;
        //包含了另一个对象
        private User user;
    }

    这个时候,由于我们查询文章的时候,又需要查询作者的信息,导致对象中包含了对象,我们使用MyBatis是无法进行响应的user对象中字段匹配的。

    ArticleInfoMapper.java 类:

    @Mapper
    public interface ArticleInfoMapper {
    
        //查询文章以及对应的作者名字
        List getAll();
    }
    

    ArticleInfoMapper.xml文件:

    
    
    
        
    

    Test类:

    @SpringBootTest
    class ArticleInfoMapperTest {
        @Autowired
        private ArticleInfoMapper articleInfoMapper;
    
        @Test
        void getAll() {
            List list = articleInfoMapper.getAll();
            System.out.println(list);
        }
    }

    MyBatis查询数据库_第8张图片

     修改如下:

    
    
    
        
            
            
            
            
            
        
        
    
    

    MyBatis查询数据库_第9张图片

     以上使用association>标签,表示一对一结果映射:

    • property属性:指定Article中对应的属性,即用户
    • resultMap属性:指定关联的结果集映射,将基于该映射配置来组织用户数据。
    • columnPrefix属性:这个属性不能省略,如果省略并且还需要作者的id时,关联表中有两个id,,这会跟文章的id混淆,导致匹配错误的问题。

    6.3一对多,一个用户多篇文章案例

    一对多,我们需要使用标签,用法和相同,如下所示:

    
        
        
        
        
        
        
    
    
            select * from userinfo
            
                
                    and id = #{id}
                
                
                    and username = #{username}
                
                
                    and photo = #{photo}
                
                
                    and createtime = #{createTime}
                
                
                    and updatetime = #{updateTime}
                
            
        

    标签也可以使用代替

    7.4标签

    根据川渝的用户对象属性来更新数据。

    UserMapper接口中修改用户,根据传入的用户ID,修改其他非空属性。

     //标签的使用
        int updateById(User user);

    UserMapper.xml:

    
            update userinfo
            
                
                    username = #{username},
                
                
                    password = #{password},
                
                
                    photo != #{photo}
                
            
            where id = #{id}
        

    标签可以使用代替

    7.5标签

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

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

    根据多个文章id查询文章数据:

    //根据Id查询文章,的使用
        List selectByIds(List list);

    .xml:

你可能感兴趣的:(mybatis,oracle,数据库)