目录
批量删除(delete from 表名 where id in(?,?,?)) 和批量添加 insert into 表名 values(),(),()
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 也是一个结果映射,因此具有相同的结构和元素;或者引用其它的结果映射
- case – 基于某些值的结果映射
属性 | 描述 |
---|---|
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