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 SEQ_ID.nextval  from dual
</selectKey>
...
</insert>

update注意:

          批量更新:结合foreach实现,在下方动态sql那块  

delete注意:

          批量删除(侯的博客:)https://blog.csdn.net/benxiaohai888/article/details/78564751

多个接口参数的用法:

         基本参数,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">
...
</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=","> (#{it.userName}) </foreach> </insert>

  

        foreach实现批量更新

<update id="">
update sys_user
set
<!--item为从迭代取出的值。index为索引的属性名当迭代对象为map,则该值是map的key,key写表的字段名-->
<foreach  collection="_parameter" item="it" index="key"  separator=",">
${key}=#{it},
</foreach>
</update>

  

猜你喜欢

转载自www.cnblogs.com/lslshuo/p/9121295.html