目录
(2)、一对一或一对多关系可以使用 resultMap 映射并查询数据
一、定义
后端开发的程序主要是由后端程序和数据库组成的,而这两个重要的组成部分想要通讯,就要依靠数据库连接工具。之前在 JavaWeb 的学习中所使用的JDBC便是一种数据库连接工具,但其操作却极为复杂繁琐。因此在 JavaEE 中引入了更为方便快捷的 MyBatis 来操作数据库。
MyBatis 是一种持久层框架,其支持自定义 SQL、存储过程和高级映射。MyBatis 的底层通过封装 JDBC 操作,去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。它可以通过简单的 XML 或注解来配置和映射原始类型、接口、普通老式 Java 对象作为数据库中的记录。因此 MyBatis 是更为简便的程序和数据库交互工具,能够更加简单的操作和读取数据库。
二、过程
MyBatis 是一个 ORM(Object Relational Mapping) 框架——对象关系映射。能够将关系型数据库中的数据与对象建立映射关系,完成数据与对象的互相转换:
- 将输入对象和 SQL 语句映射成原生 SQL 语句
- 将结果集映射成输出对象
ORM 把数据库映射为对象
- 数据库表--> 类
- 记录--> 对象
- 字段--> 对象的属性
因此使用 MyBatis 可以像操作对象一样操作数据库中的表,来实现对象和数据库表之间的转换。
三、配置
1、pom.xml依赖配置
在新建项目时,相比于普通的Spring Boot项目,此处需要通过勾选MyBatis Framework和MySQL Driver来添加依赖;如果是旧项目则需要自主在pom.xml中添加dependency依赖。
2、application.properties配置
(1)、配置数据库的相关连接
注:如果使用的 mysql-connector-java 是 5.x 之前的需要写入 com.mysql.jdbc.Driver,如果大于 5.x 需要使用 com.mysql.cj.jdbc.Driver。
(2)、配置MyBatis存放路径和命名格式
MyBatis的XML中保存是对于数据库的具体SQL操作
注:使用注解时可以不用配置存放地址和命名方式
四、使用
1、基础设置
(1)、实体类
(2)、xml方式实现
【1】、Mapper接口
【2】、UserMapper.xml
<mapper>标签:需要指定 namespace 属性,表示命名空间,值为 mapper 接口的全限定
名。
(3)、注解方式实现
【1】、Mapper接口
使用注解的方式相比于使用 .xml更为简洁,不用配置 .xml
2、基本功能
(1)、查询
【1】、xml方式
查询标签<select>,用来执行数据库的查询操作的。
- id:和接口中定义的方法名称相同,表示对接口的具体实现方法。
- resultType:返回的数据类型,也就是定义的实体类。
【2】、注解方式
查询注解@Select,用来执行数据库的查询操作。
(2)、修改
【1】、xml方式
修改标签<update>,用来执行数据库的修改操作的。
【2】、注解方式
修改注解@Update,用来执行数据库的修改操作。
(3)、删除
【1】、xml方式
删除标签<delete>,用来执行数据库的删除操作的。
【2】、注解方式
删除注解@Delete,用来执行数据库的删除操作。
(4)、增加
【1】、xml方式
插入标签<insert>,用来执行数据库的插入操作的。
- useGeneratedKeys:使 MyBatis 使用 JDBC 的 getGeneratedKeys 方法取出由数据库内部生成的主键,默认值为false。
- keyColumn:设置生成键值在表中的列名,在某些数据库中当主键列不是表中的第一列时必须设置。如果生成列不止一个,可以用逗号分隔多个属性名称。
- keyProperty:指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值。如果生成列不止一个,可以用逗号分隔多个属性名称。
【2】、注解方式
插入注解@Insert,用来执行数据库的插入操作。
3、"#{}" 和 "${}" 区别
- #{}:预编译处理。是预编译执行模式,执行时安全,不存在sql注入的问题。
- ${}:字符直接替换。是即时执行模式,直接替换,执行时不安全,存在sql注入的问题。其适用于需要传递sql命令的业务,且查询结果需要能被穷举。
4、返回字典映射 resultMap
(1)、处理字段名和属性名不同
数据库中字段名称和程序中的属性名不同时,可以使用 resultMap 配置映射。
- type:要映射的实体类
- id:数据库主键名
- result:数据库普通字段和属性
- column:数据库字段名
- property:类中的属性名
(2)、一对一或一对多关系可以使用 resultMap 映射并查询数据
五、动态SQL
1、<if>标签
注册有必填和非必填两种字段。在添加用户有不确定的字段传入时,就需要使用动态标签 <if> 来判断。
2、<trim>标签
如果插入时所有字段都是非必填项,就需要结合<trim>标签和<if>标签来使用,对多个字段都采取动态生成的方式。
<trim>标签属性:
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
3、<where>标签
传入的用户对象根据属性做 where 条件查询,用户对象中属性不为 null 时,都为查询条件。
对于<where>标签也可以使用 <trim prefix="where" prefixOverrides="and"> 进行替换
4、<set>标签
根据传入的用户对象属性来更新用户数据时,可以使用<set>标签来指定动态内容。
对于<set>标签也可以使用 <trim prefix="set" suffixOverrides=","> 进行替换。
5、<foreach>标签
对集合进行遍历时可以使用<foreach>标签进行统一删除。
<foreach>标签有如下属性:
- collection:绑定方法参数中的集合,如 List、Set、Map或数组对象
- item:遍历时的每一个对象
- open:语句块开头的字符串
- close:语句块结束的字符串
- separator:每次遍历之间间隔的字符串