作者
:学Java的冬瓜
博客主页
:☀冬瓜的主页🌙
专栏
:【Framework】
主要内容
:什么是MyBatis框架?MyBatis框架有什么用?MyBatis实现查询步骤详解。MyBatis实现单表的增删查改。MyBatis模糊查询,MyBatis结果集映射。
文章目录
- 一、什么是MyBatis?
- 二、使用MyBatis框架实现查询示例
- 1、添加MyBatis框架支持
- 2、设置数据库连接字符串 和 MyBatis的配置信息
- 3、添加业务代码
- 三、查询操作
- 1、单表查询
- a 单表传参查询
- b 单表指定顺序(顺序or逆序)打印
- 四、使用MyBatis实现增、删、改
- 1、新增
- a 返回影响行数
- b 返回影响行数和id
- 2、删除
- 3、修改
- 五、特殊情况处理
- 1、模糊查询 去除多余引号的处理
- 2、对象属性名和数据库表字段名不一致 的映射处理
一、什么是MyBatis?
MyBatis是一个开源的Java持久层框架,可以帮助开发人员简化数据库访问操作。它将Java对象和数据库表之间建立映射关系,通过配置文件和注解来定义SQL和参数映射关系,并提供了灵活的查询,插入,更新,删除等操作的API。
MyBatis的工作原理
MyBatis是一个对象关系映射框架(ORM Object Relational Mapping)。
核心操作有如下几步:
配置:
首先需要编写MyBatis项目的配置文件,在SpringBoot中,就是application.yml或者application.properties文件。在application.yml中配置了数据库连接信息和映射文件(* Mapper.xml)的位置。
映射:
在资源文件中(resources目录下)引入了映射文件(* Mapper.xml),映射文件定义了Java对象和数据库表之间的映射关系。
编译:
如下图,在编译时,MyBatis会读取并解析配置文件和映射文件,并将其编译为可以执行的Java对象。
运行:
当应用需要执行SQL操作时,会调用MyBatis的api来执行相应的方法。在下图中 (* Mapper.xml)相当于实现了接口Interface,在调用Interface的抽象方法时,会根据方法名在映射文件中找到对应的SQL语句,
再调用JDBC进行操作。
二、使用MyBatis框架实现查询示例
1、添加MyBatis框架支持
注意:和创建SpringBoot项目的过程完全一样,只是加入依赖时需要多添加MyBatis和MySql Driver依赖。
2、设置数据库连接字符串 和 MyBatis的配置信息
开始操作前声明:各种配置和接口、类定义好,项目可以正常运行并查询后,目录结构如下图:
a.设置数据库连接的相关信息
在application.xml(如果是application.properties使用相应的语法添加即可)下添加以下信息,以正确连接数据库。
spring:
datasource:
url: jdbc:mysql://localhost:3306/blog_system?characterEncoding=utf8&useSSl=false
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
b.Mybatis的 xml 保存路径和 xml 名称
在上面的配置文件中接着写上下面的信息,配置好MyBatis的组件之一 xml 的保存路径和 xml的名称。
Mybatis:
# 此路径表示在 resources/mapper目录下创建 数据库对应表的 xml文件
# 文件名称为 ***Mapper.xml
mapper-locations: classpath:mapper/*Mapper.xml
3、添加业务代码
a.添加UserEntity实体类
注意:实体类中的成员变量名应与对应数据库表的字段名相同,这样MyBatis才能够自动帮我们映射。
package com.example.demo.entity;
import lombok.Data;
@Data
public class UserEntity {
private Integer userId;
private String username;
private String password;
private String headPath;
}
b.添加UserMapper接口
在c中可以看到,查询结果是所有user,因此此处使用了一个List集合来接收用户。
package com.example.demo.mapper;
import com.example.demo.entity.UserEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
List<UserEntity> getUserAll();
}
c.添加UserMapper.xml映射文件
注意:
namespaces参数是包名+接口名
SQL语句中的 id 对应UserMapper接口中的方法,表示对接口的具体实现方法。
resultType表示返回的实体类,包名+实体类名
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybati
s.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="getUserAll" resultType="com.example.demo.entity.UserEntity">
select * from user
</select>
</mapper>
d. 添加service调用UserMapper提供的操作数据库的方法
package com.example.demo.service;
import com.example.demo.entity.UserEntity;
import com.example.demo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<UserEntity> getUserAll(){
return userMapper.getUserAll();
}
}
e.添加controller调用service提供的方法以操作数据库
package com.example.demo.controller;
import com.example.demo.entity.UserEntity;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUserAll")
public List<UserEntity> getUserAll(){
return userService.getUserAll();
}
}
f.启动服务器后再输入URL查询成功
三、查询操作
1、单表查询
单表查询可以分为非传参查询和传参查询,在传参查询时,在UserMapper.xml的sql语句中,需要给sql语句传参时我们会用到
${key}
或#{key}
,因此,我们先来了解它们的区别:
${key}是字符直接替换。
${key} 缺点:容易被sql注入;优点:可以实现sql关键字传参
。
#{key}是进行预编译再填充?的位置:
#{key} 缺点:无法实现sql关键字(desc和asc)传参;优点:可以防止sql注入。
a 单表传参查询
单表非传参查询,在上面第二大点已经作为示例展示,下面我们来学习单表传参查询。由于我们已经搭建好MyBatis环境,并且在上面提到单元测试测试功能,因此添加方法和测试部分功能会很方便。以下是根据id获取用户信息的示例:
- 1>在UserMapper接口中添加getUserById方法:接口中写抽象方法。
- 2>在UserMapper.xml文件中写出getUserById方法的实现:mapper.xml中对抽象方法的实现。
在UserMapper.xml文件中,id为要实现的抽象方法(getUserById),resultType是返回值的类型(UserEntity)。
- 3>测试部分(单元测试跑一下):在UserMapper接口下右键->Generate->Test,然后选择getUserById方法,就将getUserById加入到单元测试中。再在单元测试中写下面一行代码,根据代码要打印获取到的用户信息。可以发现,确认无误。
b 单表指定顺序(顺序or逆序)打印
- 1> UserMapper接口中写抽象方法,由用户传递 排序方式 参数。
- 2> 在UserMapper的xml文件中针对UserMapper的接口进行排序方法实现。(注意MySql中asc和desc是关键字,这里要用$进行字符串替换,而不是#进行预编译)
四、使用MyBatis实现增、删、改
1、新增
新增用户有两种方法:1> 新增一个信息,返回影响行数。2> 新增一个信息,返回这个信息的id(将会把MySql中的id写回到我们传递的新增的用户对象中),并返回影响行数。
a 返回影响行数
-
1> 在UserMapper接口中写新增用户抽象方法:
-
2> 实现抽象方法
-
3> 单元测试(按照单表传参查询中步骤在Test目录下的对应包中添加关于UserMapper的新增方法的单元测试)
-
4> 运行结果:可以发现id的值并未取到,即只是返回了影响行数。
b 返回影响行数和id
-
1> 新增用户抽象方法:
-
2> 实现抽象方法:
useGeneratedKeys属性表示指示是否使用数据库生成主键,设置为true时,表示将数据库表生成的主键值返回给实体对象,keyProperty属性指定数据库表的主键。
-
3> 单元测试
-
4> 运行结果:可以发现id的值已经取到,从代码中可知,id是被写回到我们进行传参的用户对象中。同时影响行数也成功获取。
2、删除
-
1> 接口中抽象方法
-
2> 实现抽象方法
3、修改
-
1> 接口中抽象方法
-
2> 实现抽象方法
五、特殊情况处理
1、模糊查询 去除多余引号的处理
- 1> 在UserMapper接口中写模糊查询用户抽象方法:
- 2> 在UserMapper的xml文件中针对UserMapper的接口进行 模糊查询方法实现。
注意:模糊查询的格式为:%信息%,为了防止出错需要使用到concat函数,将3个字符串进行连接。
否则如果使用%#{信息}%的格式,那么SQL中识别到的是:‘%’ ‘#{信息}’ ‘%’。即中间出现多余的引号。
2、对象属性名和数据库表字段名不一致 的映射处理
处理方式:下列使用resultMap实现结果集映射。除此之外,还可使用MySql语句查询时用as进行字段和对象属性名一致也可以。
- 下列 resultMap标签中:
resultMap标签同一行,id为这个结果集的标识,查询语句select中的resultMap属性的内容就是这个id。
type为返回的数据类型。
resultMap标签内部第一行id表示实体类id属性和数据库表主键对应的id。
resultMap标签内部result标签表示实体类其他属性和数据库其他字段对应。
最后,resultMap的每一行中,property表示实体类的属性名,column表示数据库表中对应的字段名。