Mybatis使用注意事项-1

Mybatis使用注意事项-1

  1. 根据项目需求构建pojo , mapper , service ,serviceImp ,和 controller,为了方便梳理业务上下级调用关系,推荐先安装插件Free Mybatis plugin

这个插件可以轻松找出Mapper与 相关sql文的对应关系,点击箭头,可自动跳转至对应sql文所在的xml文件。

同样点击XML文件中的箭头,可找出这段SQL对应的Mapper接口

  1. 说白了,mybatis主要作用于数据库和Mapper中间,通过XML(有时候也可以通过注解的方式进行实现,如下图

)但一般情况下使用XML方式实现,现在重点介绍下XML实现SQL语句查询的注意事项。

  1. XML 文件通常对应Mapper (interface),在Mapper中声明对应的功能接口,比如说一个Mapper中有两个方法,那么对应的XML也应该有两个对应的SQL语句或方法
  2. XML和Mapper中的方法名称一一对应,大小写十分敏感,所以在影射的过程中开发者需严格检查拼写是否正确,大小写是否严格匹配。XML 和 Mapper的影射通过mybatis-generatorConfiguration自动生成影射文件,在pom文件中<plugins>中指定一个<plugin>,其配置大概如下图

指定后自动生成generatorConfig.xml配置文件,开发者可以根据自己的 实际情况来定义文件中的相关内容,在这个配置文件中,开发者需自行指定如数据库;连接jar包所在位置,如图2

包括在<jdbcConnection></jdbcConnection>中指定数据库的连接信息,驱动类,用户名和密码

还需要指定mapper(XML) 接口文件的生成位置,这里使用src/main/resources下,package为”mapper”,也就是说,在src/main/resource/mapper包下生成mapper.xml文件

3.XML

一般情况下XML中需要注意的如映射字段,传参类型,返回类型,和名称空间等等,如果你测试SQL可以正常从库中获取相关数据,但是在项目启动或测试类中无法使用,一般情况下需要注意以下几点

  1. XML文件头部的namespace是否和Mapper接口的名称相对应,且路径为com.xxx.xxx.mapper.xxxMapper的相对路径,也可以按住Ctrl同时点击namespace中配置的Mapper看看是否可以实现正常跳转,如果正常跳转,则配置无误,如不能,请检查相关路径以及拼写是否正确

  1. DML语句的相关标签,我们使用<select></select>来举例,通常select属于DML语句中最常用的语句,这里列举select中的相关注意事项,select 标签中通常会有如下几个property,如下图

<1> id:这个是这条SQL语句的方法名,通常以java中驼峰命名的标准来定义它,它对应mapper接口中的方法名称,大小写敏感。

<2>resultType: 这个属性为返回的结果类型。查到数据之后需要返回,所以需要定义接收返回数据的类型,一般情况下对应实体类,路径为src/main/java为根路径的相对路径,大小写敏感。

<3> parameterType: 这个属性指定传参类型,这里将传参类型指定为map集合,也有很多时候传参类型指定为实体类,如下图

或者传参类型指定为List集合等等,如果指定实体类需要指定相对路径(实体类在哪个包下)

<select >标签中的嵌套

比较困难的是SQL语句中表连表,各种判断,涉及where语句时,可以使用嵌套标签来完成,如下图所示

在<select>中嵌套了<where></where>,又在<where>中嵌套了if

在SQL 语句拼接时,and条件一般写在<if>中,在外部可拼一条“1=1”表示 “true”,以此来保证sql的正常执行。

  1. 从mapper中传进的参数是否有效被标签解析,如果不能正常被解析,SQL便无法正常被执行,所以需要确保Mapper中的传参类型是否和标签中的parameterType属性吻合,如下图

如方法1,已指定传入com.cfam.pojo.po.CapitalPlan类为入参类型,所以在以下的判断属性中直接声明即可,无需再由plan进行打点调用

如果依旧进行实体类打点调用,在SQL执行时会出现如下错误:

找不plan的getter ,导致方法报500

 同样,如果在参数中声明了map或List集合为入参类型,则需要对入参的实体类属性进行打点调用,如下图

入参类型指定为map

则需要进行打点调用

所有的判断属性及参数都需要进行打点调用,如否,也会出现类似无法识别的错误

。还有另外一种情况,在<if test=" a != null and a != ' '">中,如果a是字符串类型,这么写是没问题的,但是如果是Integer,Date等其他类型,再进行a !=' ' 的判断,就会出问题,可能不会报错,但是这个<if test></if>里面的内容就取不到了,例如进行查询操作,可能就会导致查询出来的结果不是所需的结果,因为漏掉了条件。  所以,一般String类型才加and a!=' '的判断。

  1. 关于一个方法传入多种不同类型的参数

假设需要做分页,需要实体类入参作为查询条件,同时需要在末尾追加计算出 LIMIT 的值(如 limit #{startPoint},#{EndPoint}),这时候需要在Mapper的上层(service层)中将入参的值封装,service 接口实现的同时调用Mapper,将封装的参数值传给Mapper,  如下图

之后在XML中接收,进行打点调用即可

即SQL语句中对于关键字的大小写并不敏感,只保证拼写正确即可

  1. 关于将SQL查询结果替换的问题

如查询status 1 或 0 的问题,需要将1或0替换为“是”或“否”的中文字符,可以在SQL中使用IF(status = 1, ”是” , ”否” )来完成类似查询结果的替换,如下图

查询结果如下:

 

后续在项目开发的过程中还会继续总结,欢迎大家一起来我的博客交流讨论~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值