目录
- 1、MyBatis 是什么
- 2、配置 MyBatis 开发环境
- 2.1、添加 MyBatis 框架支持
- 2.1.1、老项目添加 MyBatis
- 2.1.2、新项目添加 MyBatis
- 2.2、配置数据库连接字符串
- 2.3、配置 MyBatis 中的 XML 路径
- 3、添加业务代码
- 3.1、添加实体类
- 3.2、添加 mapper 接口
- 3.3、添加 xml 文件
- 3.4、添加 Service
- 3.5、添加 Controller
- 3.6、Postman 测试
- 4、数据的增删改
- 4.1、参数占位符
- 4.2、增加数据
- 4.3、删除数据
- 4.4、修改数据
- 5、数据的查询
- 5.1、单表查询
- 5.1.1、like 查询
- 5.1.2、单表查询
- 5.2、多表查询
- 5.2.1、返回字典映射:resultMap
- 5.2.2、一对一的表映射
- 5.2.3、一对多的表映射
1、MyBatis 是什么
MyBatis 是一个操作数据库的持久层框架,它支持自定义 SQL、存储过程以及高级映射,是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库的工具。
MyBatis 是一个 ORM(Object Relational Mapping,即对象关系映射)框架,在面向对象编程语言中,将关系型数据库中的数据和对象建立起映射关系,进而自动完成数据与对象之间的转换:
- 将输入数据(即传入的对象)+ SQL 映射成原生 SQL
- 将结果集映射为返回对象,即输出对象
ORM 将数据库映射为对象:
- 数据库表(table)-> 类(class)
- 记录(record,即行数据)-> 对象(object)
- 字段(field)-> 对象的属性(attribute)
一般来说,ORM 框架会把数据库的每张表映射成一个类,也就是说使用 MyBatis 可以像操作对象一样操作数据库的表,可以实现对象和数据库表之间的转换。
2、配置 MyBatis 开发环境
2.1、添加 MyBatis 框架支持
2.1.1、老项目添加 MyBatis
如果需要在老项目中添加 MyBatis,则可以在 pom.xml 文件中添加相关依赖。
<!-- 添加 MyBatis 框架--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!-- 添加 MySQL 驱动--><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
2.1.2、新项目添加 MyBatis
如果在创建 SpringBoot 项目时添加 MyBatis 框架,则增加下述引用。
2.2、配置数据库连接字符串
添加了 MyBatis 框架,由于 MyBatis 启动类会读取相关配置,因此必须配置需要的信息,否则启动报错。
如果是 application.properties,则添加下列内容:
# 数据库连接配置
# 这里的 db 是数据库名称,需要改变,其余的不动
spring.datasource.url=jdbc:mysql://localhost:3306/db?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
如果是 application.yml,则添加下列内容:
# 数据库连接配置
spring: datasource: url: jdbc:mysql://localhost:3306/db?characterEncoding=utf8&useSSL=falseusername: root password: root driver-class-name: com.mysql.cj.jdbc.Driver
上述两种写法只是不同类型的文件格式不同而已,内容是相同的。
2.3、配置 MyBatis 中的 XML 路径
MyBatis 中的 XML 文件中保存的是数据库具体操作的SQL语句,配置如下:
如果是 application.properties,则添加下列内容:
# 在 resources/mapper 下创建所有表的 xml文件,文件名以Mapper结尾,类型是xml
mybatis.mapper-locations=classpath:mappers/**Mapper.xml
如果是 application.yml,则添加下列内容:
mybatis: mapper-locations: classpath:mappers/**Mapper.xml
3、添加业务代码
根据后端开发的工程思路添加业务代码。
3.1、添加实体类
实体类对应数据库的表,实体类的属性对应数据库表的字段名。
3.2、添加 mapper 接口
数据持久层的接口定义:
3.3、添加 xml 文件
在配置文件中已经配置了 xml 文件的位置:在类加载路径下的mappers文件夹中创建,即在 src/main/resources/mappers 下创建
mapper 标签中的 namespace 表示命名空间,值是 mapper 接口的全限定名,接口文件和 xml 文件通过 namespace 的值相对应。
select 标签的 id 和接口方法名称一样的,表示是对接口方法的具体实现,接口方法和某个 sql 语句通过 id 的值相对应。
resultType 是返回的数据类型,无论返回的是某个类型还是 List<某个类型>,值都是某个类型。
3.4、添加 Service
服务层实现代码如下:
3.5、添加 Controller
控制层的实现代码如下:
3.6、Postman 测试
4、数据的增删改
4.1、参数占位符
参数占位符有两种 #{} 和 ${}。
- #{}:预编译处理,MyBatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 ?号,然后再基于 jdbc 来替换。变量本身如果是字符串,会加上单引号 ’ ’ 来替换。
- ${}:字符直接替换,整个 sql 作为字符串拼接来替换。变量本身如果是字符串,替换时不加任何符号。因此可以使用 ${sort} 实现排序查询。
如果传入的参数是 asc,那么上述的 sql 语句会被替换成 select * from userinfo order by id asc
但是如果使用的是 #{sort},传入的参数是 asc,那么那么上述的 sql 语句会被替换成
select * from userinfo order by id ‘asc’,因此使用 ${sort} 可以实现排序查询,而#{sort} 不能实现。
- SQL 注入问题:根据用户名查询用户时用的是 ${} 占位符,但是当传入的参数是 ’ or ‘1’=‘1,代码会变成 select * from userinfo where username=’’ or ‘1’=‘1’,而 ‘1’='1’表达式始终为真,因此会返回所有的用户。由此可得,用于查询的字段,要尽可能使用 #{} 占位符。
4.2、增加数据
增加数据用 insert 关键字,返回的值是 int 类型,默认情况下返回的是受影响的行数。
如果传进来的方法参数中没有某个属性值,那么插入表中的值为 null。
Mapper 接口中:
xml 文件中:
测试数据:
4.3、删除数据
删除数据用 delete 关键字,返回的值是 int 类型,默认情况下返回的是受影响的行数。
Mapper 接口中:
xml 文件中:
测试数据:
4.4、修改数据
修改数据用 update 关键字,返回的值是 int 类型,默认情况下返回的是受影响的行数。
Mapper 接口中:
xml 文件中:
测试数据:
5、数据的查询
5.1、单表查询
5.1.1、like 查询
MyBatis 可以利用 like 进行模糊查询。
- 利用 #{} 进行查询时,会变成 select * from userinfo where username like ‘%‘username’%’,造成语法错误。
- 利用 ${} 进行查询时,会造成注入问题。
- 可以利用 mysql 的内置函数 concat() 来处理。#{}会给 username 的值加上单引号 ’ ’ 来替换,因此无需再加。
5.1.2、单表查询
查询数据用 select关键字,返回的值可以是复杂类型,也可以是简单类型。
如果是增删改操作返回受影响的行数时,xml文件中可以不设置返回的类型,但是即使是简单的查询语句也要设置返回的类型。
Mapper 接口中:
xml 文件中:
测试数据:
5.2、多表查询
多表查询的本质是查询结果集的字段,超出某个自定义类型的属性,此时之前的方式就不满足要求。
5.2.1、返回字典映射:resultMap
resultMap 使用场景:
1.字段名称和实体类中的属性名不同的情况,可使用 resultMap 配置映射
2.一对一和一对多关系可以使用 resultMap 映射并查询数据
5.2.2、一对一的表映射
- 在实体类中增加属性。
- 在 xml 文件中增加一对一映射。
resultMap 属性:指定关联的结果集映射,将基于该映射配置来组织用户数据。
columnPrefix:给 column 统一加上前缀,作为结果集字段,如果 columnPrefix 省略,并且恰好两个表中有相同的字段,那么就会导致查询出错。绑定一对一对象时,通过columnPrefix+association.resultMap.column 来映射结果集字段。
- 关联查询的sql语句。
resultMap 属性:设置当前查询结果集使用的映射。写法是 命名空间.resultMap.映射名,如果是同一个命名空间,就可以省略命名空间。
- 测试数据。
查询字段,如果在 resultMap 映射中没有配置,就相当于不做映射,值为 null。
5.2.3、一对多的表映射
- 在实体类中增加属性。
- 在 xml 文件中增加一对多映射。
- 关联查询的sql语句。
.
- 测试数据。