Mybatis知识点汇总.docx
- 文档编号:25488825
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:26
- 大小:34.26KB
Mybatis知识点汇总.docx
《Mybatis知识点汇总.docx》由会员分享,可在线阅读,更多相关《Mybatis知识点汇总.docx(26页珍藏版)》请在冰豆网上搜索。
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映射:
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(Map 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(List sql动态语句映射: SELECT* FROMUSER WHEREIDin open="("separator=","close=")"> #{item} 5.对象类型中的集合属性 对于单独传递的List或Array,在SQL映射文件中映射时,只能通过list或array(数组)来引用。 但是如果对象类型有属性的类型为List或Array,则在sql映射文件的foreach元素中,可以直接使用属性名字来引用。 mapper接口: List 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 *
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mybatis 知识点 汇总