mapper.xml

  • Mapper映射文件是在实际开发过程中使用最多的,也是我们学习的重点。
  • Mapper文件中包含的元素有:
  • cache – 配置给定命名空间的缓存。
  • resultMap – 映射复杂的结果对象,解决字段不统一
  • sql – 可以重用的 SQL块,也可以被其他语句引用。
  • insert – 映射插入语句
  • update – 映射更新语句
  • delete – 映射删除语句
  • select – 映射查询语句

select

  • id: 必须属性,并且在同一个命名空间下唯一,动态代理实现中id的值必须和接口中的方法名一致
  • resultType:结果集映射成对象(POJO)类型
  • sql: 标签内容,获取传入参数:#{}、${}; - 记住(面试题)

 

  • 如果使用$的话。会默认将值封装到value中,需要这样来取值:${value}
  • 如果需要指定特殊的变量的话,需要在接口的方法声明中使用@param注解在方法参数之前指定参数封装的变量如:@Param(“id ”)
  • 记住:
    • #{} 作用:预编译占位符,sql语句用 ? 号代替
    • ${} 作用:sql语句的拼接,需要判断参数类型,做具体的处理
    • #{} 获取参数时和参数名无关。
    • ${} 获取参数通过${value}获取,如果指定参数名需要通过 @Param("xxx")在接口的方法声明中指定
    • #{} 可以防止sql注入,${}不能防止sql注入

parameterType的传入参数

  • parameterType支持三种类型:
    • 简单类型,string、long、integer等,注意多个参数时的参数封装
    • Pojo类型,User等
    • HashMap类型。如果使用hashMap作为参数类型的话,一定要保证sql语句中的#{}变量与map中的key保证一致
  • parameterType 不是必须指定,如果不指定Mybatis自动识别传入参数类型;

parameterType传入多个参数

  • 使用@Param注解指定参数名称 ,简单的查询,删除
  • 如果只有一个参数的时候,可以不使用@param注解,mybatis会到对象中去查找对应的属性值
  • 当有2个以上的参数的时候,mtbatis会自动将参数封装在param中,取值的时候可以使用#{param}进行取值
  • 如果需要自己指定参数名称则必须要使用@param注解声明。在取值的时候就可以使用#{封装的变量},此時param1,param2 仍然会封装数据

将参数封装为Pojo对象传入

  • 如果将参数封装在user对象中,此时可以使用@param注解,也可以不使用注解,xml的parameterType可以写,也可以不写,没有什么影响
  • 不使用注解时候,xml文件中可以直接使用#{user类中的属性}取值即可;
  • 使用注解时,在xml中取值的时候,则必须要使用对象名.属性名的方式,如:#{user.address}

将参数封装HashMap传入

  • 使用HashMap进行参数的封装时,使用和封装到pojo对象中一样,可以使用注解也可以不使用注解,xml的parameterType可以写,也可以不写
  • hashMap.put{“address”,“南京”}
  • 不使用注解的时候,xml文件中可以直接使用hashMap中的key进行取值,如:#{address}
  • 使用注解的时候,在xml中则必须要使用hashMap.key来获取封装在map中的值,如:#{hashMap.address}

ResultType结果输出

 

  • 增删改没有resultType的结果类型

ResultMap - 最核心 - 可以用来解决什么问题

 

  • resultMap中的属性详解
  • Id:要保证唯一
  • Type:最终要映射的对象类型,可以使用对象别名,也可以使用HashMap
  • autoMapping:自动映射没有指定的属性字段,默认位true
  • resultMap下的标签详解:
  • Id : 表的主键,column:数据库中的列名,property:对象中的属性名,或者map中的key
  • Result:数据库中与实体中不同的属性对应关系,column:数据库中的列名,property:对象中的属性名或者map中的key

动态sql

  • MyBatis 的强大特性之一便是它的动态 SQL 能力。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 字符串有多么痛苦
  • 拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦

 

if

  • 在进行多条件查询的时候,如果用户输入了某个条件我们就可以按照某个条件查询,如果用户没有指定按照某个条件去查询,那么就按照预先定义好的语句执行。
  • 特点:如果sql语句后面有多个if的话,那么只要满足条件,那么这个条件就会添加到sql中。If的条件是一个and 的关系
  • 只要满足条件,就会将sql语句,拼接在主语句后面
  • 如:查询所有男性用户信息,如果输入了姓名,则按照姓名模糊查询进行查找,如果输入了年龄,查询大于这个年龄的用户
  • 使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断,特别是针对多条件时的判断,增加灵活性。

choose, when, otherwise

  • 有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。
  • 而使用if标签时,只要test中的表达式为true,就会执行if标签中的条件,就会将if中的条件语句拼接到主语句的后面。MyBatis提供了choose 元素用于多选一。
  • if标签是与(and)的关系,而choose标签是或(or)的关系.
  • choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。
  • 类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
  • 如:查询男性用户,如果输入了姓名则按照姓名模糊查找,如果输入了年龄则按照年龄查找,如果都没有输入就查询年龄 小于18岁的用户
  • 特点:多选一的场景使用choose , 多选多的场景使用if

where

  • 当有这样的一个场景时,用户可能会输入条件也有可能不会输出条件时,我们可以使用where标签
  • 作用 : 构建where 关键字,
  • 如:查找所有的用户,如果输入了姓名则进行模糊查询,如果又输入了年龄,把这个条件添加进去,则查询小于这个年龄的用户
    • -- 查询所有的用户信息
    • -- 如果输入了性别则按照性别查询
    • -- 如果输入了姓名,则按照姓名模糊查询进行查找,
    • -- 如果输入了年龄,查询大于这个年龄的用户

set

  • 更新用户表数据时,若某个参数为null时,会导致更新错误
  • 当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。
  • 使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号
  • 如:修改用户信息

foreach

  • Delete from emp where empno in(1,5,10)
  • foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。
  • Foreach( int item : arr)
    • Collection 表示即将要遍历的容器
    • item表示集合中每一个元素进行迭代时的别名;
    • index指定一个名字,用于表示在迭代过程中,每次迭代到的位置;
    • open表示该语句以什么开始;
    • separator表示在每次进行迭代之间以什么符号作为分隔符;
    • close表示以什么结束;
  • 如:根据多个id查询用户信息, 批量删除用户信息
  • Select * from user where id in (1,3,5)
  • Delete from user where id in (1,2,3,4,5)
  • 需求 : 查询用户编号在1001 - 1005之间的用户信息

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐