MyBatis_4 - MyBatis映射器(1)_select

注意:后面的代码修改,都是基于此篇文章中的demo进行修改的,大家可以根据这个Demo动手写写试试看...

MyBatis_3 - MyBatis第一个Demo


顺便我将下面Demo的代码直接上传了,不想写的,直接下载跑就行。

MyBatis_Select示例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}

可以选择JavaBeanMap等复杂的参数类型传递给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,通过简单的settergetter方法设置参数,这样可以提高可读性。

  首先我们创建一个JavaBean(用来传递参数)

  

然后我们修改Mapper XML中传入的参数和参数类型

接着修改Mapper 接口方法中入参的参数类型

最后修改主调用方法

测试结果

以上,我们描述了三种传递多个参数的方式:


  • 使用Map 因为Map导致业务可读性变差,后续扩展和维护会很困难,应尽量少用
  • 使用@Param 这种方式收到参数个数的影响,当参数较多的时候,会给调用造成困难。
  • JavaBean 当传参数量较多的时候,还是JavaBean好用。


老话说的好,针对不同业务需求,选用最合适的技术(方式)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值