注意:后面的代码修改,都是基于此篇文章中的demo进行修改的,大家可以根据这个Demo动手写写试试看...
顺便我将下面Demo的代码直接上传了,不想写的,直接下载跑就行。
首先插一个和映射器没有关系的内容...
MyBatis 数据库事务
数据库事务 mybatis是交由SqlSession进行控制,我们可以通过提交(commit)或者回滚(rollback)
在大部分工作环境下,都会使用Spring框架进行控制,这个后面再说。
事务控制 如下图:
MyBatis映射器
映射器是MyBatis最强大的工具,也是我们使用MyBatis时使用最多的工具。
MyBatis是针对 映射器构造的SQL 构建的轻量级框架,并且通过配置生成对应JavaBean返回给调用者,而这些配置主要便是
映射器。
映射器的配置
元素名称 | 描述 | 备注 |
select | 查询语句,最常用,最复杂的元素之一 | 可以自定义参数,返回结果集等。 |
insert | 插入语句 | 执行后返回一个整数,代表插入的条数 |
update | 更新语句 | 执行后返回一个整数,代表更新的条数 |
sql | 允许定义一部分的SQL,然后再各个地方引用它 | 例如:一张表列名,可以一次定义,在多个SQL语句中使用。 |
resultMap | 用来描述从数据库结果集中的加载对象,它是对复杂,最强大的元素 | 它将提供映射器的规则 |
cache | 给定命名空间的缓存配置 | - |
cache-ref | 其他命名空间缓存配置的引用 | - |
select元素
select元素的配置(列出常用的,其余的等要用再查资料吧)
元素 | 说明 | 备注 |
id | 它和Mapper的命名空间组合起来是唯一的,提供给MyBatis调用 说简单点就是Mapper接口中的方法名 和 Mapper.xml 中的id 必须保持一致,不能出现重复。 ①-------下面会有图例 | 如果命名空间和id组合起来不唯一,会抛出异常 |
parameterType | 传入参数的类型; 你可以给出类全名,也可以给出类别名,使用别名必须是MyBatis内部定义或自定义的
基本数据类型:int , String , long , date(不知是sql.date 还是 util.date) 复杂数据类型:类 和 Map
如何获取呢? 基本数据类型:接口方法中的参数值#{传参} 复杂数据类型:#{属性名},map中则是#{key} | 可以选择JavaBean,Map等复杂的参数类型传递给SQL |
resultType | 从这条语句中返回的期望类型的类的完全限定名或别名。 注意如果是集合情形,那应该是集合可以包含的类型,而不能是集合本身。 使用 resultType 或 resultMap,但不能同时使用
定义类的全路径,在允许自动匹配的情况下,结果集将通过JavaBean的规范映射; 或者定义为int,double,float等参数... 也可以使用别名,但是要符合别名规范,不能和resultMap同时使用。 | 它是我们常用的参数之一,比如我们总计总条数 就可以把它的值设为int |
resultMap | 外部 resultMap 的命名引用。 结果集的映射是 MyBatis 最强大的特性,对其有一个很好的理解的话,许多复杂映射的情形都能迎刃而解。 使用 resultMap 或 resultType,但不能同时使用
它是映射集的引用,将执行强大的映射功能,我们可以使用resultType或者resultMap其中的一个,resultMap可以给予我们自定义映射规则的机会 | 它是MyBatis最复杂的元素,可以配置映射规则,级联,typeHandler等 |
flushCache | 它的作用是在调用SQL后,是否要求MyBatis清空之前查询的本地缓存和二级缓存 | true/false,默认为false |
useCache | 启动二级缓存开关,是否要求MyBatis将此次结果缓存 | true/false,默认为true |
timeout | 设置超时时间,超时之后抛出异常,秒 | 默认值为数据库厂商提供的JDBC驱动所设置的秒数 |
fetchSize | 获取记录的总条数设定 | 默认值是数据库厂商提供的JDBC驱动所设的条数 |
①----如下图所示:
select之传递多个参数
之前的例子,我们都是传递一个参数,下面试试多个参数传递。
(仍旧使用之前的例子)
1. 使用Map传递参数
将Mapper中获取学生信息的接口方法的参数,修改为map
然后 修改映射的xml中,将getStudent的入参类型修改为map,并且修改sql语句
where 条件中参数的名字就是map中的key
这里要注意key对应....
查询结果
这个方式虽然简单易用,但是有一个弊端:这样设置的参数使用了Map,而Map需要key/value对应,由于业务关联性不强,
你需要深入到程序中看代码,造成可读性很差。
2. 使用注解方式传递参数(依旧使用之前的例子)
使用MyBatis参数注解:@Param来实现想要的功能。
首先将Mapper接口方法中方法传参修改为以下:
然后修改Mapper XML中传入的参数
注意和Mapper 接口方法传参中的名字保持一致哦...
最后修改方法调用
最后的查询结果
当我们将参数传递给后台的时候,通过@Param提供的名称,MyBatis就会知道#{student_id}代表studentName参数,参数的可读性提高,
但是这样会引起另一个麻烦,一条SQL中有10个参数需要查询,如果全部使用@Param方式,这样参数会十分复杂,我们换一种方式。
3. 使用JavaBean传递参数(依旧使用之前的例子)
在参数过多的情况下,MyBatis允许组织一个JavaBean,通过简单的setter和getter方法设置参数,这样可以提高可读性。
首先我们创建一个JavaBean(用来传递参数)
然后我们修改Mapper XML中传入的参数和参数类型
接着修改Mapper 接口方法中入参的参数类型
最后修改主调用方法
测试结果
以上,我们描述了三种传递多个参数的方式:
- 使用Map : 因为Map导致业务可读性变差,后续扩展和维护会很困难,应尽量少用
- 使用@Param : 这种方式收到参数个数的影响,当参数较多的时候,会给调用造成困难。
- JavaBean : 当传参数量较多的时候,还是JavaBean好用。
老话说的好,针对不同业务需求,选用最合适的技术(方式)。