Mybatis知识点汇总.docx
《Mybatis知识点汇总.docx》由会员分享,可在线阅读,更多相关《Mybatis知识点汇总.docx(26页珍藏版)》请在冰点文库上搜索。
![Mybatis知识点汇总.docx](https://file1.bingdoc.com/fileroot1/2023-6/9/f13806b1-fd82-4b5b-829f-c991cf3579b9/f13806b1-fd82-4b5b-829f-c991cf3579b91.gif)
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
frombase.tb_user
whereid=#{id,jdbcType=INTEGER}
对于简单数据类型,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文件配置中添加
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 *