Mybatis中mapper别名问题和maven依赖问题


又到一期挖坑填坑的时候啦,前段时间在开发一个新的项目,项目的框架逃不过三大件:Spring+Mybatis+Spring Boot。现在Spring Boot可谓是很有热度,如果是新开的项目基本都会是这个框架结构,用Spring MVC的已经很少(如果你说你们自己还在用,反驳我的说法,那我只能喊你一声杠精大哥啦)。之所以介绍一下这个基本架构,其实其中一个坑就出现在这内部。

1. Mybatis映射关系问题

在写mapper类和mapper.xml关联关系的时候,会在mapper里面的接口参数上加@Param注解来说明这个字段的名称,这个是没有问题的。
在业务代码中我们有时候会遇到一个数据表(A表)会关联另一个数据表(B表)的id,这个关联关系是在业务代码的时候,先插入B表的数据,然后拿到插入后的id,再设置到实体类中,插入到A表中,完成关联,这个时候就需要在插入B表的时候,将自增的id返回并赋值到B的实体类中。说的有点虚,那就不多废话,代码来说话。

//A表实体类
public class AModel{
    private Integer id;
    private String name;
    private String phone;
    private Integer bId;//关联B表的id
}
//B表实体类
public class BModel{
    private Integer id;
    private String address;
    private String city;
}
public interface BMapper{
    int insert(@Param("model") BModel model);
}
<insert id="insert" useGeneratedKeys="true" keyProperty="id">
insert into t_b 
(address,city) 
values 
(#{model.address},#{model.city});
</insert>

在insert语句上面加上useGeneratedKeys表示自增主键,keyProperty指定主键名称。这个看起来没有任何问题,但是运行起来就出现了异常问题。报出的错误日志也不是很明确,小伙伴很着急,定位不到问题位置。网上搜索也没有介绍过这种情况。(这里还是要吐槽一下一些博客,互相抄袭的情况真的很严重,能连续找到几篇文章是相同,而且是原创,还能是一字不差,错别字都是一样的。)
回到问题本身,其实这里就是对应关系的问题。在BMapper接口中,我们指定了实体类的名称是model,在插入数据的时候也是用model.属性的方式取值,但是却在keyProperty设置字段名时没有加model.
解决方案
方式一:最简单的方式就是不要用@Param设置别名,因为这里就一个参数,无所谓别名的设置,将sql语句中的model.去掉即可。
方式二:在keyProperty属性中将id改为model.id即可。
往往解决方案很简单,坑却很深,希望这个坑的解决方案能对被此坑坑过的小伙伴。

2. Maven依赖问题

一个项目下来是分很多模块,模块之间互相是有依赖的。前几天在公司同事写的项目上开发新的功能,项目拉下来以后,启动一直报错。提示信息是方法找不到,最后和同事讨论后和网上找解决方案。最终确定是jar包引入的问题。下面来说一下场景。

有ModuleA、ModuleB、ModuleC,在ModuleC引入了依赖jar包如下:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.46</version>
    <optional>true</optional>
</dependency>

然后ModuleB依赖ModuleC。

<dependency>
    <groupId>com.itcrud.blog</groupId>
    <artifactId>modulec</artifactId>
    <version>${project.parent.version}</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.46</version>
</dependency>

ModuleA依赖ModuleB,但是在ModuleA中没有在引用fastjson的依赖。

<dependency>
    <groupId>com.itcrud.blog</groupId>
    <artifactId>moduleb</artifactId>
    <version>${project.parent.version}</version>
</dependency>

项目启动是在ModuleA中main方法,在启动项目的时候,启动程序会调用到ModuleB中,ModuleB会调用ModuleC,ModuleC会使用到fastjson里面的工具。这个时候就一直报出fastjson中被调用的方法不存在。开始是以为jar包冲突,但是实际上检查并没有,最后才发现,是optional标签在作怪。

在maven中optional标签默认值是false,表示必须引入,也就是说ModuleA依赖ModuleB,ModuleB依赖ModuleC,C中引入了fastjson,A、B两个模块也必然要引入。但是把值设置为true就不一样了。如果此时A和B没有显示的引入fastjson,就会导致fastjson不会被引入,所以导致jar丢失问题。

总结下来就是optional标签要慎用,如果不能百分确定被引入的依赖关系不需要,就不要随意的设置optional标签的值为true,有可能就会埋下坑。


文章作者: 程序猿洞晓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 程序猿洞晓 !
评论
 上一篇
MySQL数据库系列(六):MySQL之索引数据结构分析 MySQL数据库系列(六):MySQL之索引数据结构分析
数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary search)……
2018-10-16
下一篇 
MySQL数据库系列(五):MySQL之SQL优化十大口诀了解一下 MySQL数据库系列(五):MySQL之SQL优化十大口诀了解一下
SQL优化,心中永远的痛,同事写的各种复杂SQL,各种坑,有时候想拿出来优化一下,但是总感觉力不从心,不知从哪里下手。……。全值匹配是最优,最左前缀原则要注意,乱在索引列上操作惹祸害,范围查询记得放后面,不等于使用要小心,空和非空要注意,模糊查询通配符勿乱放,字符串查询加引号,OR变UNION效率会更高,记得覆盖索引尽量用。
2018-10-11
  目录