文章目录
- 什么是MyBatis
- MyBatis程序的创建
- MyBatis实现数据库查询
- 传参查询
- 插入实现
- 添加操作获取自增ID
- 删除实现
- 修改实现
- #{}和${}
- SQL注入
- like查询
- resultMap和resultType
- 多表查询
对于普遍的后端开发而言,其程序主要包含了后端主程序和数据库两个部分,用户访问前端页面,前端发送数据给后端程序,后端从数据库中查询用户需要的信息返回给前端,如此即完成了一次完整的数据查询。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文件组成;
- 添加实体类
实体类中属性的名称与数据库中的字段名称必须保持一致:
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;
}
- 添加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接口,不可以省略;
- 添加对应的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的命名空间(包名+接口类)需要根据实际代码进行修改;
- 在xml文件中实现SQL
- 使用单元测试进行验证
数据库查询结果:
单元测试:
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则是当数据库的字段名与程序的属性名不一致时,使用该标签就可以进行配置;
多表查询
首先需要在主表添加需要查询的连接表的属性:
定义查询方法和查询语句:
得到查询结果: