MyBatis数据库查询

29 篇文章 0 订阅


对于普遍的后端开发而言,其程序主要包含了后端主程序和数据库两个部分,用户访问前端页面,前端发送数据给后端程序,后端从数据库中查询用户需要的信息返回给前端,如此即完成了一次完整的数据查询。MyBatis就是一种作为后端程序与数据库连接和交互的工具。

什么是MyBatis

MyBatis是一款支持自定义SQL、存储过程及高级映射的持久层框架。它不同于JDBC操作的繁琐,是通过简单的xml和注解来进行接口或对象的配置和映射,是一种更加简单地用来完成程序和数据库交互的工具。

MyBatis程序的创建

  • 与SpringMVC项目的创建类似,首先需要额外添加MyBatis的框架依赖:在这里插入图片描述
  • 再设置数据库的连接配置:

在application.properties文件中进行数据库的连接信息的配置:
在这里插入图片描述

如果使⽤ MySQL 是 5.x 之前的使⽤的是“com.mysql.jdbc.Driver",
如果是⼤于 5.x 使⽤的是“com.mysql.cj.jdbc.Driver”

此时,这个MyBatis 程序就可以成功运行了。

  • 再对MyBatis xml文件的存放位置和命名规则进行配置,同样是在application.properties文件中进行 配置:

在这里插入图片描述

MyBatis实现数据库查询

MyBatis作为程序服务层和数据库连接的工具,简单来说由用来给当前类作方法声明的接口和对应的xml文件组成;

  1. 添加实体类

实体类中属性的名称与数据库中的字段名称必须保持一致:

在这里插入图片描述

package com.example.demo.model;

import lombok.Data;

import java.util.Date;

@Data
public class UserInfo {
    private int id;
    private String username;
    private String password;
    private String photo;
    private Date createtime;
    private Date updatetime;
    private int state;
}

  1. 添加mapper接口
package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

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

@Mapper注解由MyBatis提供,标明当前类是一个mapper接口,不可以省略;

  1. 添加对应的xml文件

创建一个xml文件,首先写入MyBatis固定的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">
<mapper namespace="com.example.demo.mapper.UserMapper">


</mapper>

具体mapper的命名空间(包名+接口类)需要根据实际代码进行修改;

  1. 在xml文件中实现SQL
    在这里插入图片描述
    在这里插入图片描述
  2. 使用单元测试进行验证

数据库查询结果:
在这里插入图片描述

单元测试:

package com.example.demo.mapper;

import com.example.demo.model.UserInfo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static org.junit.jupiter.api.Assertions.*;


@SpringBootTest  //标识当前测试的上下文环境为springboot

class UserMapperTest {

    @Autowired    //注入需要测试的类
    private UserMapper userMapper;

    @Test
    void getAll() {

        //实现测试代码
        List<UserInfo> list=userMapper.getAll();
        for (UserInfo user:list){
            System.out.println(user.toString());
        }
    }
}

mybatis查询数据库结果:
在这里插入图片描述

传参查询

在这里插入图片描述

添加@Param注解,可以增强代码的跨平台性;
在这里插入图片描述
xml文件中的SQL语句实现,参数的格式需要特别注意;

使用单元测试进行验证:

在这里插入图片描述

当@Param注解中的参数与实体类的属性名称不同时,xml文件中SQL语句的参数与@Param注解中的保持一致;

插入实现

在这里插入图片描述
在这里插入图片描述

除查询外,增删改默认返回的是受影响的行数;

在这里插入图片描述
通过数据库查询验证:

在这里插入图片描述

添加操作获取自增ID

在这里插入图片描述

在这里插入图片描述

useGeneratedKeys得到数据库内部生成的
主键;
keyColumn设置生成的键在数据表中的列名;
keyProperty指定唯一识别对象的属性

单元测试:

在这里插入图片描述

删除实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改实现

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以进一步在数据库中验证:
在这里插入图片描述

#{}和${}

在xml文件中实现SQL语句时,可以使用#{}和${}两种参数占位符;

#{}代表预编译处理,即MyBatis在处理占位符处的参数时,是将#{}替换为?符号,后使用 PreparedStatement的set方法来赋值;
$ {}代表字符的直接替换,即直接将${}替换成变量的值;

在这里插入图片描述
在这里插入图片描述

两种占位符各有优缺;
#{}预编译处理的方式在遇到像上面这种直接替换的字符串时,会给传递的值添加单引号,无法完成查询;
$ {}直接替换的方式则是有可能会带来越权查询和操作数据的问题,带来一些安全问题;

SQL注入

SQL注入是一种常见的网络攻击方式,它是利用数据库查询的bug,通过SQL语句来实现对数据的无差别查询;

在这里插入图片描述
在这里插入图片描述

用于查询的字段,更推荐使用#{}预编译的处理方式;

like查询

在这里插入图片描述

如果使用上面两种占位符的方式进行模糊查询:

在这里插入图片描述

预编译的方式程序会出现报错,直接替换的方式可以查询成功,但不安全。因此可以考虑使用mysql的内置函数concat来查询;

在这里插入图片描述

resultMap和resultType

resultType是对查询的对象的返回类型进行设置,大多数场景使用resultType就可以;resultMap则是当数据库的字段名与程序的属性名不一致时,使用该标签就可以进行配置;

在这里插入图片描述
在这里插入图片描述

多表查询

在这里插入图片描述
首先需要在主表添加需要查询的连接表的属性:

在这里插入图片描述
定义查询方法和查询语句:
在这里插入图片描述
得到查询结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值