mybatis——xml⽅式与动态sql
mybatis的真正强⼤之处在于它的映射语句,所以映射器的xml⽅式就显得相对简单
为啥⼦Mapper接⼝没有实现类,却可以被调⽤那?
mybatis使⽤java动态代理可以直接调⽤接⼝来调⽤相应的⽅法,不需要提供接⼝的实现类。当调⽤⼀个接⼝的⽅法时,会调⽤接⼝的全限定名称和当前调⽤⽅法的名称组成⼀个⽅法id,这个id就是xml映射⽂件中的namespace和具体⽅法的id,这样接⼝和xml就关联了。当调⽤mapper接⼝,通过代理转化成对xml⾥对应⽅法的调⽤。
mybatis使⽤预编译参数的⼀种⽅式。
select⽤法注意
resultMap标签⽤于配置java对象属性和查询结果列的对应关系,通过property和column来进⾏映射。
接⼝中定义⽅法的返回值必须和xml中resultType的类型⼀致。
数据库中,下划线命名很常见。java中,⼀般使⽤驼峰命名。可以通过设置全局属性mapUnderscoreToCamelCase为true可以⾃动将下划线⽅式的数据库列映射到驼峰命名的属性中。
多表进⾏关联查询时,若返回的结果不⽌⼀个表的信息咋办?例如:⽤户表和⾓⾊表关联查询,返回的既要role,还要user的⼀些,返回类型为role
1.可以在role实体类增加⽤户表要返回列对应的属性
2.若返回⾓⾊表中的信息多了,那1的就显得⿇烦了。我们可以在role定义user类的属性。修改xml中的⽅法
浙江特斯拉事件<select  id=""  resultType="role">
select
...
u.user_name as "user.userName",
u.user_email  as "user.userEmail"
from sys_user u
...
</select>
  通过user.属性名来设置别名,user是在role⾥增加的属性,属性名是user的,这样就可以将值赋给user的属性
3.还可以通过在role实体类⾥定义user,修改xml,使⽤resultMap来进⾏映射
insert注意:
如何获取主键⾃增的值?
1.使⽤jdbc⽅式(⽀持主键⾃增的数据库):通过在insert标签设置userGeneratedKeys="true"  keyProperty="id"  ,mybatis会根据jdbc的getGeneratedKeys的⽅法来取出数据库内部⽣成的主键,将主键赋给keyProperty配置的id属性。多个属性,使⽤逗号隔开,这时还需设置keyColumn属性按顺序指定列,和设置的属性⼀⼀对应。
2.使⽤selectKey返回主键的值(主键⾃增不⾃增都适合):
mysql:
<insert id="">
...
<!--因为主键值是在insert执⾏成功后获得,所以order为after-->
<selectKey keyColumn="" resultType=""  keyProperty="" order="AFTER">
select LAST_INSERT_ID()
</selectKey>
</insert>
oracle
<insert id="">
<!--从序列获取值作为主键插⼊数据库中,所以order为before-->
<selectKey keyColumn="" resultType=""  keyProperty=""  order="BEFORE">
select val  from dual
抖音baby this love</selectKey>
...
</insert>
update注意:
批量更新:结合foreach实现,在下⽅动态sql那块 
delete注意:
多个接⼝参数的⽤法:
基本参数,javaBean,Map类型,@param
注解⽅式:通过注解将sql语句直接写在接⼝上
优点:需求简单的系统,效率⾼。
缺点:sql变化时,需要重新编译代码,不⽅便维护。不推荐使⽤.
动态sql
if标签:通过判断参数值来决定是否使⽤某个查询条件
与where标签配合:where标签:该标签包含的元素内有返回值,就插⼊⼀个where。如果where后⾯的字符串是以and和or开头,就将他们剔除
与set标签配合使⽤:set标签:该标签内有返回值,就插⼊⼀个set,如果set后⾯的字符串是以逗号结尾,就剔除
trim标签:替换where和set的功能
<trim  prefix="where" prefixOverrides="AND | OR">iferror函数的使用教程
...
</trim>
or
<trim  prefix="set" suffixOverrides=",">
...
</trim>
  choose  when otherwise 标签:if ..else..    if..else
foreach:主要⽤在构建in条件中.
⼊参为数组类型的foreach迭代:
<select  id=""  resultType="">
select * from . where . in
<foreach collection="array" item="item"
open="("  separator=","  close=")">
#{item}
</foreach>
</select>
  collection取值决定于接⼝中⽅法的参数类型:⼊参为List类型:取值为list。为Map类型:取值为map的key        foreach实现批量插⼊:
<insert id="">
insert into sys_user(
user_name)
values
<!--⼊参为list-->
<foreach collection="list"  item="it" separator=",">rar文件怎么解压
(#{it.userName})select round函数
</foreach>
</insert>
foreach实现批量更新
<update id="">
update sys_user
set
<!--item为从迭代取出的值。index为索引的属性名当迭代对象为map,则该值是map的key,key写表的字段名-->
mysql语句的执行顺序<foreach  collection="_parameter" item="it" index="key"  separator=",">
${key}=#{it},
</foreach>
</update>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。