MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
关于数据库mybatis的mapper关系
这里说明一下关于数据库,数据库对应实体各种复杂情况关系映射。
最基本的实体:
比如:(这里面不涉及复杂map,list,set等)
1 |
|
数据库:
resultMap最终将数据库查出的结果,映射到pojo(实体)上
type是指定映射到哪一个实体;id是相对应的resultMap的id
这里有两种属性,主键属性和普通属性
1,主键属性方式(是主键)
user_no是主键:
1 | <id property="testUserNo" column="user_no"/> |
2,普通属性(即不是主键)
user_name不是主键
1 | <result property="testUserName" column="user_name"/> |
完整的mapper.xml
1 | <?xml version="1.0" encoding="UTF-8"?> |
在我们深入更加复杂情况前,我们需要了解mapper3.0下常用的标签。我们从mapper开始讲起。
mapper: 是总标签,所有标签都包含在内。
namespace:命名空间。如果采用的是Mapper接口代理的方式开发,Mapper的映射文件中namespace必须为接口的全名,比如这里namespace=“com.cun.mapper.TestUserMapper”。
最常见的增删改查select,insert,update,delete。
1 | <?xml version="1.0" encoding="UTF-8" ?> |
每一个其中的内含标签:
下面逐一介绍其中的Content Model(内容模型)
selectKey : 标签表示子查询中主键的提取问题
它其中的标记:
keyColumn表示查询语句返回结果的列名
keyProperty表示将属性设置到某个列中
order=”BEFORE表示在插入语句之前执行
resultType=”int”表示返回值得类型为int类型
include:引入定义号的公共sql
这里不得不的引入另一个标签sql,因为这两者搭配使用。
例子:(通常用于有一段sql文,很长而且重复多次使用,我们把它抽象出来,之后直接引用)
1 | <!--1、首先定义一个sql标签,一定要定义唯一id。(name,age是要查询的字段)--> |
trim : (这个不常用)
prefix:前缀;suffix:后缀
prefixOverrides:忽略第一个指定分隔符;suffixOverrides:会略最后一个分隔符。
如果id为null执行的sql语句为:
select * from user where name=“xxx” and gender=“xxx”
where : 主要是用来简化 sql 语句中 where 条件判断,自动地处理 AND/OR 条件。
例子:(并自动地把首个 and / or 给忽略。)
1 | <select id="geTestUsers" parameterType="com.cun.entity.TestUser" resultMap="TestUser"> |
set : (主要作用于update语句)时若使用if标签,如果前面的if没有执行,则可能导致有多余逗号的错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
例子:(这里有一个坑,写完需要加逗号)
1 | <update id="updateByPrimaryKeySelective" parameterType="RecruitmentConfBanner"> |
foreach : 主要用于批量删除或批量插入。
它的6个参数说明:
collection:要循环的集合
index:循环索引;
item:集合中的一个元素(item和collection,按foreach循环理解);
open:以什么开始;
close:以什么结束;
separator:循环内容之间以什么分隔
mybatis接受的参数分为:(1)基本类型;(2)对象;(3)List;(4)数组;(5)Map
例子:(入参为list,collection为list)
1 | <update id="deleteWorkshopByIds" parameterType="Integer" > |
choose : 是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。
例子:
1 | <!-- choose(判断参数) - 按顺序将实体类 User 第一个不为空的属性作为:where条件 --> |
标签
if : 这个签前面已经涉及到了。
bind : 可以从 OGNL 表达式中创建一个变量并将其绑定到上下文
1 | <select id="selectBlogsLike" resultType="Blog"> |
回到原先的话题映射涉及复杂map,list,set等。
一对多collection 例子:一个班级相关的学生。StudentEntity是学生实体。
1 | import java.util.List; |
例子:
1 | <resultMap id="ClazzResultMap" type="com.cn.hnust.pojo.ClazzEntity" > |
一对多,一对一(association ):
1 | <resultMap type="Bill" id="ResultBill"> |