关于mubatis使用3

目录

1. 使用分页插件完成分页查询

2.mybatis.xml的插件配置

2. 联表查询的操作

第一种(不使用)

第二种使用map集合(万金油类型,不常用)

第三种使用association

结果映射(resultMap)

“多”对“一”

​编辑

“一”对“多”

3. 动态sql标签

if的使用

where的使用

choose when otherwise

​编辑

foreach的使用

批量删除(delete from 表名 where id in(?,?,?)) 和批量添加 insert into 表名 values(),(),()

批量插入

4. 使用插件完成代码生成


1. 使用分页插件完成分页查询

官网教程github

Mybatis-PageHelper/wikis/zh/HowToUse.md at master · pagehelper/Mybatis-PageHelper · GitHub

1.引入依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.3</version>
</dependency>

2.mybatis.xml的插件配置

<!--
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?,
    typeAliases?, typeHandlers?,
    objectFactory?,objectWrapperFactory?,
    plugins?,
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
        <property name="param1" value="value1"/>
    </plugin>
</plugins>

在使用PageHelp时有多种使用方法,在这里只说Pageinfo用法

官方文档有以下使用方法,可以逐一试用

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectAll();
//用PageInfo对结果进行包装
PageInfo page = new PageInfo(list);
//测试PageInfo全部属性
//PageInfo包含了非常全面的分页属性
assertEquals(1, page.getPageNum());
assertEquals(10, page.getPageSize());
assertEquals(1, page.getStartRow());
assertEquals(10, page.getEndRow());
assertEquals(183, page.getTotal());
assertEquals(19, page.getPages());
assertEquals(1, page.getFirstPage());
assertEquals(8, page.getLastPage());
assertEquals(true, page.isFirstPage());
assertEquals(false, page.isLastPage());
assertEquals(false, page.isHasPreviousPage());
assertEquals(true, page.isHasNextPage());

从日志文件中可以看出首先执行SELECT count(0) FROM day1206.tbl_emp,查出信息总数,再执行Preparing: select * from day1206.tbl_emp LIMIT ?,  将PageHelper.startPage(1,1);(第一个“1”,表示从第一个开始查询,第二个“1”,表示每页显示一个)其中的值赋值给sql语句


2. 联表查询的操作

多对一,常用

在这里以部门和员工表为例(列名与属性名不一致使用ResultMap标签,在关于mubatis使用2中有使用,可以看)

第一种(不使用)

再新建一个实体类包含连表后所有的属性,每有一个新的连表操作都需要新建一个实体类,非常麻烦,不再演示

第二种使用map集合(万金油类型,不常用)

在声明方法的时候使用,List<Map<String,Objects>>, sql只需要进行连表,其他的不需要修改,非常方便,能用但是不常用,idea也有波浪线提示

第三种使用association

以下为官方文档ResultMap介绍

结果映射(resultMap)
  • constructor - 用于在实例化类时,注入结果到构造方法中
    • idArg - ID 参数;标记出作为 ID 的结果可以帮助提高整体性能
    • arg - 将被注入到构造方法的一个普通结果
  • id – 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能
  • result – 注入到字段或 JavaBean 属性的普通结果
  • association – 一个复杂类型的关联;许多结果将包装成这种类型
    • 嵌套结果映射 – 关联可以是 resultMap 元素,或是对其它结果映射的引用
  • collection – 一个复杂类型的集合
    • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用
  • discriminator – 使用结果值来决定使用哪个 resultMap
    • case – 基于某些值的结果映射
      • 嵌套结果映射 – case 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
ResultMap 的属性列表
属性描述
id当前命名空间中的一个唯一标识,用于标识一个结果映射。
type类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)。
autoMapping如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)

“多”对“一”

在“多”对“一”的“多”所在的那个属性中添加“一”的对象

在对应的xml文件中,在这里将列名与属性名进行对应,在<association>标签中写入一所对应的值

 property="dept"表示Emp类中 “一”的属性名,
type="com.zwt.entity.Emp"表示dept的java类型
property映射到列结果的字段或属性。如果用来匹配的 JavaBean 存在给定名字的属性,那么它将会被使用。否则 MyBatis 将会寻找给定名称的字段。 无论是哪一种情形,你都可以使用通常的点式分隔形式进行复杂属性导航。 比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。
javaType一个 Java 类的完全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。

运行

“一”对“多”

在“多”对“一”的“一”所在的那个属性中添加“多”的集合对象,在xml的resultMap中使用collection区分

  • collection – 一个复杂类型的集合
    • 嵌套结果映射 – 集合可以是 resultMap 元素,或是对其它结果映射的引用

首先,你会注意到我们使用的是集合元素。 接下来你会注意到有一个新的 “ofType” 属性。这个属性非常重要,它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来。 所以你可以按照下面这样来阅读映射:

<collection property="posts" javaType="ArrayList" column="id" ofType="Post" select="selectPostsForBlog"/>

读作: “posts 是一个存储 Post 的 ArrayList 集合”

在一般情况下,MyBatis 可以推断 javaType 属性,因此并不需要填写。所以很多时候你可以简略成:

<collection property="posts" column="id" ofType="Post" select="selectPostsForBlog"/>

在我们的xml中<collection>标签用来搭配集合使用 ,“ofType” 属性它用来将 JavaBean(或字段)属性的类型和集合存储的类型区分开来。


3. 动态sql标签

介绍

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。

使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。

如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉似曾相识。在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。

动态标签

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if的使用

test中放的是实体类的属性名的判断条件,若条件成立就将if所在的语句拼接到select * from day1206.tbl_emp where 1=1后面

三个条件都满足

观察执行的sql语句,三个条件全部满足则将if包围的语句拼接到原语句后面

可能会产生疑问 为什么还要加个 where 1=1条件

呢么我们不加试试,从图中执行的sql语句来看sql语句错误,条件前没有加上where

那要是把where加到if语句里呢,从图中看到每个条件都成立时,三个都会拼接到sql处造成语句错误。如果只在第一个语句中添加where呢,呢么当第一个 条件不成立时,则没有where关键字,其他语句同样,呢么就需要在使用if的最前面加上where 1=1,这样即便三个条件都不成立,也会查找所有数据,从而避免造成sql语句错误 where后面面跟上一个恒成立等式就可以,不用 非要1=1

where的使用

此时mybatis提供了一个<where>标签,会自动提供where关键字,如下图,我们没有使用where关键字,但在执行日志中可以看到where关键字,非常好用

choose when otherwise

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

<choose>:类似于 Java 中的 switch 语句,根据条件选择执行不同的 SQL 语句片段。它可以包含多个 <when> 和一个可选的 <otherwise> 标签。

<when>:用于在 <choose> 标签中定义条件分支。可以根据指定的条件判断是否执行特定的 SQL 语句片段。

<otherwise>:在 <choose> 标签中可选的标签,用于定义当没有任何 <when> 条件匹配时执行的 SQL 语句片段。

choose标签实在说有when标签中满足的选择一个进行执行,这一点可以在sql执行中看到

otherwise标签是当所有when条件不成立时执行

foreach的使用

foreach 元素的功能非常强大,它允许你指定一个集合,声明可以在元素体内使用的集合项(item)和索引(index)变量。它也允许你指定开头与结尾的字符串以及集合项迭代之间的分隔符。这个元素也不会错误地添加多余的分隔符,看它多智能!

提示 你可以将任何可迭代对象(如 List、Set 等)、Map 对象或者数组对象作为集合参数传递给 foreach。当使用可迭代对象或者数组时,index 是当前迭代的序号,item 的值是本次迭代获取到的元素。当使用 Map 对象(或者 Map.Entry 对象的集合)时,index 是键,item 是值。 

批量删除(delete from 表名 where id in(?,?,?)) 和批量添加 insert into 表名 values(),(),()

使用集合传入要删除的id,在这里使用数组

批量插入

插入的是对象,使用list集合


4. 使用插件完成代码生成

安装mybatisX插件

选中生成的表,点击MybatisX-Generator

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值