一、SQL映射器Mapper接口

Mappper的作用:可以让我们无需再编写Dao的实现。直接把以前的dao接口定义成符合规则的Mapper。

使用方法:

  1. 在Dao层写一个接口,命名规则为DomainMapper
  2. 在Dao层下写一个xml文件,命名为DomainMapper.xml

 

  1. mapper.xml文件要和Mapper接口建立关系,通过namespace:要能连接到Mapper接口,并在里面写相关sql语句
  2. 在资源文件夹下写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.嵌套结果

单向一对多嵌套查询