一、SQL映射器Mapper接口
Mappper的作用:可以让我们无需再编写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。
使用方法:
- 在Dao层写一个接口,命名规则为DomainMapper
- 在Dao层下写一个xml文件,命名为DomainMapper.xml
- mapper.xml文件要和Mapper接口建立关系,通过namespace:要能连接到Mapper接口,并在里面写相关sql语句
- 在资源文件夹下写MyBatis-Config.xml文件、数据库连接信息文件、日志文件,并注册DomainMapper.xml文件
二、Mybatis的批量操作(foreach)
1.批量删除:
collection="list":传入的list,相当于map的key,通过list得到传入的整个集合的值;
item="id" :每次循环的这个值 ,open="(" :以什么开始 ,separator=",":分隔符 ,close=")":以什么结束
批量插入
parameterType:传入参数是:java.util.List的类型的;对传入的list进行foreach循环:取出值填入插入的values中:collection="list":这个不能修改,表示传入的一个list类似于一个key是list,得到传入的list集合,index="index":每一次遍历的序号 ,item="item":每次遍历的这个对象别名,可以修改 ,separator=",":每遍历一次后的分隔符
MyBatis中的动态SQL
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一。很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行SQL查询语句,对于这种情况需要使用动态SQL来完成。再比如,对于分页的情况,对于不同的表,必定存在不同的字段,因此使用静态SQL则只能针对某几个特定的表来形成分页。而使用动态的SQL,则可以对不同的表,不同的字段进行不同的分页。这些情况的处理通常都是用动态SQL来完成.
if
动态SQL通常要做的事情是有条件地包含where子句的一部分。如:
注释后的结果: 开启后的结果: |
choose
有些时候,不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis提供了choose元素,它有点像Java中的switch语句:
设置class属性,不设置学生姓名,则班级ID为条件查询(其他条件忽略): 设置学生姓名,不设置class属性,则学生姓名为查询条件: 没有设置任何属性的值: |
where和trim
在之前的示例中,使用了1=1这种明确为true的条件来解决应该插入where还是插入and|or的问题,而新版本的MyBatis提供了新标签(where、trim)来使用更优雅的方式来解决这个问题:
如果where元素失效,还可以通过自定义trim元素来定制想要的功能。比如,和上例where元素等价的自定义trim元素为:
|
set
类似的用于动态更新语句的解决方案叫做set。set 元素可以被用于动态包含需要更新的列,而舍去其他的。如:
也能使用等价的自定义trim元素完成同等功能,结果如下: |
之前在插入数据时介绍的foreach节点也是一个构建动态SQL的利器,它能够利用自动迭代一个集合,完成SQL语句的生成
三、(多对一)关联映射
有用户和部门两个对象,一个部门有多个用户。在实际中这种很常见的情况,我们讲的是多对一,就要从多方入手,用户就是我们的多方。比如要查询一个用户,并得到用户所在部门,就应该在用户的domain中增加一个部门类型的字段。
1.导入sql文件
在用户t_user中有一个部门的外键,关联部门的id
2.写domain域对象
3.写映射文件DomainMapper.xml
4.核心文件MyBatis-config.xml
5.保存测试数据
6.查询数据的两种方式
单向多对一嵌套结果
发一条左外连接sql解决问题,映射文件Mapper结果的手动封装ResultMap)
使用嵌套结果映射来处理重复的联合(association)结果的子集。--这种方式,所有属性都要自己来!!只发送一条sql
单向多对一嵌套查询
发1查询user+N查询dept条sql解决问题,映射文件Mapper结果的自动封装ResultMap)
四、(一对多,多对多)集合映射
查询数据的两种方式
1.嵌套结果
单向一对多嵌套查询