Mybatis知识点汇总.docx

上传人:b****6 文档编号:12902541 上传时间:2023-06-09 格式:DOCX 页数:26 大小:34.26KB
下载 相关 举报
Mybatis知识点汇总.docx_第1页
第1页 / 共26页
Mybatis知识点汇总.docx_第2页
第2页 / 共26页
Mybatis知识点汇总.docx_第3页
第3页 / 共26页
Mybatis知识点汇总.docx_第4页
第4页 / 共26页
Mybatis知识点汇总.docx_第5页
第5页 / 共26页
Mybatis知识点汇总.docx_第6页
第6页 / 共26页
Mybatis知识点汇总.docx_第7页
第7页 / 共26页
Mybatis知识点汇总.docx_第8页
第8页 / 共26页
Mybatis知识点汇总.docx_第9页
第9页 / 共26页
Mybatis知识点汇总.docx_第10页
第10页 / 共26页
Mybatis知识点汇总.docx_第11页
第11页 / 共26页
Mybatis知识点汇总.docx_第12页
第12页 / 共26页
Mybatis知识点汇总.docx_第13页
第13页 / 共26页
Mybatis知识点汇总.docx_第14页
第14页 / 共26页
Mybatis知识点汇总.docx_第15页
第15页 / 共26页
Mybatis知识点汇总.docx_第16页
第16页 / 共26页
Mybatis知识点汇总.docx_第17页
第17页 / 共26页
Mybatis知识点汇总.docx_第18页
第18页 / 共26页
Mybatis知识点汇总.docx_第19页
第19页 / 共26页
Mybatis知识点汇总.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Mybatis知识点汇总.docx

《Mybatis知识点汇总.docx》由会员分享,可在线阅读,更多相关《Mybatis知识点汇总.docx(26页珍藏版)》请在冰点文库上搜索。

Mybatis知识点汇总.docx

Mybatis知识点汇总

Mybatis知识点汇总

Mybatis 是一个 ORM 框架可以说 Mybatis 是一个半自动的 ORM 框架,Hibernate 是全自动的

Mapper映射文件

Selectconfig_key,config_value,create_date,update_datefromwechat_configwhereconfig_key='${config_key}'

1.namespace:

是相应mapper接口的文件路径

2.id:

是mapper接口的方法名

3.parameterType:

有基本数据类型和复杂数据类型,基本数据类型:

包含int,String,Date等。

基本数据类型作为传参,只能传入一个。

通过#{参数名}即可获取传入的值,复杂数据类型:

包含JAVA实体类、Map。

通过#{属性名}即可获取传入的值,用于对应的mapper接口方法接受的参数类型。

可以接受的参数类型有基本类型和复杂类型.例如:

parameterType="String"

mapper接口方法一般接受一个参数,可以通过使用@Param注释将多个参数绑定到一个map做为输入参数。

1.简单数据类型

mapper接口方法:

UserselectByPrimaryKey(Integerid);

sql映射:

//SQL语句块

id,tname,tpwd

对于简单数据类型,sql映射语句中直接#{变量名}这种方式引用就行了,其实这里的”变量名”可以是任意的。

mapper接口方法传递过来的值,至于其叫什么名字其实是不可考也没必要知道的。

而且JAVA反射只能获取方法参数的类型,是无从得知方法参数的名字的。

比如上面这个示例中,使用#{id}来引用只是比较直观而已,使用其他名字来引用也是一样的。

所以当在if元素中test传递的参数时,就必须要用_parameter来引用这个参数了。

像这样:

select

fromtb_user

=0">

whereid=#{id,jdbcType=INTEGER}

如果test测试条件中使用id就会提示错误,因为这个参数其实没有名字,只是一个值或引用而已,只能使用_parameter来引用。

(正确)

如果:

=0">andcmpid=#{cmpid}

则报错:

Thereisnogetterforpropertynamed'cmpid'in'classjava.lang.Integer'

原因:

Mybatis默认采用ONGL解析参数,所以会自动采用对象树的形式取Integer.cmpid。

Integer对象没有cmpid属性。

如果不解析参数,mybatis自动识别传入的参数,不会报错。

解决办法:

方法1:

=0">andcmpid=#{_parameter}

参数名全部改为_parameter

方法2:

接口类:

Campusinfosel_campusinfo(intcmpid);

改为:

Campusinfosel_campusinfo(@Param(value="cmpid")intcmpid);

方法3:

可以将参数包装在hashmap或者对象中作为参数

2.对象类型

传入JAVA复杂对象类型的话,sql映射语句中就可以直接引用对象的属性名了,这里的属性名是实实在在的真实的名字,不是随意指定的。

mapper接口方法:

1

intinsert(Useruser);

sql映射:

  insertintotb_user(name,sex)

  values(#{name,jdbcType=CHAR},#{sex,jdbcType=CHAR})用#号取

虽然可以明确的引用对象的属性名了,但如果要在if元素中测试传入的user参数,仍然要使用_parameter来引用传递进来的实际参数,因为传递进来的User对象的名字是不可考的。

如果测试对象的属性,则直接引用属性名字就可以了。

测试user对象:

1

=null">

测试user对象的属性:

1

=null">

3.map类型

传入map类型,直接通过#{keyname}就可以引用到键对应的值。

使用@param注释的多个参数值也会组装成一个map数据结构,和直接传递map进来没有区别。

mapper接口:

intupdateByExample(@Param("user")Useruser,@Param("example")UserExampleexample);

sql映射:

  updatetb_user

  setid=#{user.id,jdbcType=INTEGER},

  ...

  

=null">

    

  

注意这里测试传递进来的map是否为空,仍然使用_parameter

如果map存的是对象

map.put("orgClass",entity);

='%%'">

andclass_namelike#{orgClass.className}

=nullandorgClass!

=''">

andemployee_realNamelike#{classTeacher}

例子2

voidupdatePayRecordAfterPay(MapreqMap);

update${currentSchema}.WECHAT_PAY_RECORD

=null">

ORDER_NO=#{orderNo,jdbcType=VARCHAR},

=null">

OPENID=#{openid,jdbcType=VARCHAR},

=null">

APPID=#{appid,jdbcType=VARCHAR},

whereSERIAL_NO=#{serialNo,jdbcType=VARCHAR}

动态SQL

MyBatis官方文档对动态SQL中使用trim标签的场景及效果介绍比较少。

事实上trim标签有点类似于replace效果。

trim属性

prefix:

前缀覆盖并增加其内容

suffix:

后缀覆盖并增加其内容

prefixOverrides:

前缀判断的条件

suffixOverrides:

后缀判断的条件

比如:

Java代码

selectb.*fromsys_menubwhere1=1

=nullandid!

=''">

ANDb.id=#{id}

=null">

ANDb.menu_namelike#{name}

selectb.*fromsys_menubwhere1=1

=nullandid!

=''">

ANDb.id=#{id}

=null">

ANDb.menu_namelike#{name}

最终sql打印为:

selectb.*fromsys_menubwhere1=1ANDb.menu_namelike''WHERE

从结果可以发现:

Java代码

suffix是针对符合suffixOverrides的SQL语句追加后缀suffix值。

总而言之:

Java代码

Andsqlxxx

最终结果是:

AndsqlxxxWHERE

Map类型

Mapmap = newHashMap();

   map .put( "name" , "%张 %" );

   map .put( "age1" ,0);

   map .put( "age2" ,100);

    select*fromt_person

   

=null">

      wherenamelike#{name}

   

   

=0">

      andage=#{age}

   

 

choose

    select*fromt_person

   

     

=null" >

         wherenamelike#{name}

     

     

         wherenamelike'%%'

     

   

    

=0">

      andage=#{age}

   

 

foreach

如 in 操作

程序代码

    Listl = newArrayList();

   l .add

(1);

   l .add

(2);

   l .add(3);

   l .add(4);

Spring整合就省去这一部分

SqlSessionsession=factory.openSession();

Listpersons=session.selectList(Person.class.getName()+".selectFor",l )

);

session.close();

映射文件

    select*fromt_personwhereidin

   

    #{p}

   

 

 

$

相当于转义,字符串替换

程序代码   

    Mapparams=newHashMap();

   //params.put("name","%张 %");

   params.put( "instr", "(1,2,3,4)" );

映射文件

    select*fromt_personwhereidin${instr}

 

 orderby

程序代码

Mapparams=newHashMap();

 params.put( "by", "agedesc" );

映射文件

    select*fromt_person  orderby  ${by}

 

 

   

   

 

4.集合类型

可以传递一个List或Array类型的对象作为参数,MyBatis会自动的将List或Array对象包装到一个Map对象中,List类型对象会使用list作为键名,而Array对象会用array作为键名。

集合类型通常用于构造IN条件,sql映射文件中使用foreach元素来遍历List或Array元素。

mapper接口:

1UserselectUserInList(Listidlist);

sql动态语句映射:

  SELECT*

  FROMUSER

  WHEREIDin

  

      open="("separator=","close=")">

        #{item}

  

5.对象类型中的集合属性

对于单独传递的List或Array,在SQL映射文件中映射时,只能通过list或array(数组)来引用。

但是如果对象类型有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。

mapper接口:

ListselectByExample(UserExampleexample);

sql映射文件:

  

    

在这里,UserExample有一个属性叫oredCriteria,其类型为List,所以在foreach元素里直接用属性名oredCriteria引用这个List即可。

item=”criteria”表示使用criteria这个名字引用每一个集合中的每一个List或Array元素

4.resultMap

 

MyBatis会自动创建一个ResultMap对象,然后基于查找出来的属性名进行键值对封装,然后再看到返回类型是Blog对象,再从ResultMap中取出与Blog对象对应的键值对进行赋值。

当返回类型直接是一个ResultMap的时候也是非常有用的,这主要用在进行复杂联合查询上,因为进行简单查询是没有什么必要的。

    

        

        

       

       

  

    

      select * from t_blog where id = #{id}    

  

 id–一个ID结果;标记结果作为ID可以帮助提高整体效能

  result–注入到字段或JavaBean属性的普通结果

如果是主键是自动生成,需要用到id时,在mapper文件配置中添加

user对象中组件属性resulttype=”主键的数据类型”order:

获取主键语句的执行顺序,可以选择insert执行之前执行或者之后执行

resultType与resultMap区别

在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,

值则是其对应的值。

当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给

resultType所指定的对象对应的属性。

所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,

只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType

所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,

我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

  

    select id, username, hashedPassword  

    from some_table  

    where id = #{id}  

  

  

5.association

 

association关联元素处理“有一个”类型的关系,即一对一关联。

它有两种关联方式

 

嵌套查询:

通过执行另外一个SQL映射语句来返回预期的复杂类型。

 

嵌套结果:

使用嵌套结果映射来处理重复的联合结果的子集。

 

嵌套查询

  

    

      

      

     

      

  

  

     

    select * from User where id =#{id}     

   

  

     

   select * from Role where id =#{id}     

   

这里有两个查询,一个查询加载User,一个查询加载Role.

这里select为另外一个映射语句的ID,可以加载这个属性映射需要的复杂类型。

获取的在列属性中指定的列的值将被传递给目标select语句作为参数。

注意:

而select为selectRole的SQL输入参数可以随便给名称,只要是输入参数与压入进去的值类型相同就行了,可以写成:

1.select * 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2