博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring + SpringMVC + Druid + MyBatis 给你一个灵活的后端解决方案
阅读量:6299 次
发布时间:2019-06-22

本文共 3082 字,大约阅读时间需要 10 分钟。

  生命不息,折腾不止。

   折腾能遇到很多坑,填坑我理解为成长。

   两个月前自己倒腾了一套用开源框架构建的 JavaWeb 后端解决方案。

   

   引入到项目组后经过几番打磨,现在也出落的有模有样。

   最近将工程中的 Hibernate 换了换 Mybatis 试试,毕竟人都需要新鲜感。

   我 Hibernate 接触的要比 MyBatis 早,作为最流行的两 ORM 框架,个人认为其中很多思想都相通。

   但 MyBatis 特有的 ResultMap 构想,能进行更为细致的 SQL 调整和优化。

   在开发社区、版本更新速度、支持的工具上,Hibernate 比 MyBatis 更胜一筹。

   项目 Git 地址:

1.方案整体一览

   由  Controller 层接受前端参数并响应请求,携带数据跳转页面。

   Controller 层注入 ServiceInter, ServiceImpl 层组织业务数据。

   ServiceImpl 层注入 Mybatis Mapper, Mapper 进行数据的访问。

   和 Hibernate 类似整个 dao 层,都可以由工具生成,工程中使用的是 org.mybatis.generator 插件。

web.xml
pom.xml

2.遇到的坑

   浅坑这里就不说了,下面梳理比较深的几个坑。

   如果你以前遇到过这些问题,并且有比我还完美的解决方法,请赐教。

a. MapperScannerConfigurer 提前初始化导致 spring 注入配置文件失效

  因为希望 Spring 能扫描 Mapper 接口类加载 Mapper.xml 并自动生成实现代理类,注入到相应的 ServiceImpl 中。

  刚开始配置如上,但是发现 Spring 无法正常加载配置文件中的信息。

  也就是用 ${jdbc.username} 这样之类的表达式,无法获取到 properties 文件里的内容。

  几次尝试未果之后,发现 MapperScannerConigurer 实际是在解析加载 bean 定义阶段,这个时候设置 sqlSessionFactory 的话。

  会导致提前初始化一些类,PropertyPlaceholderConfigurer 还没来得及替换定义中的变量,导致把表达式当作字符串复制了。

  将 sqlSessionFactory 替换为 sqlSessionFactoryBeanName 问题解决,配置如下:

b. dao 层数据表主键自动生成

   在编写工程例子运行后,发现提示错误 UUID 不为 NUll。

   自动生成的 mapper.xml 中,对于主键(自增序列/uuid)需要自己配置,这点确实有点 low。

   自己配置就自己配置吧,mapper.xml 中 UUID 配置如下:

select replace(uuid(),'-','') UUID

  假设项目推进中,生成数据表配置文件后需要研发手动在 mapper.xml 的新增方法中添加主键生成策略,不仅繁琐而且出问题的概率极大。

  试着摸索有没有什么统一配置的地方,发现了一种但还是不够完美。统一配置在 generatorConfig.xml 生成表的地方:

   主键生成策略使用 SQL 语句这点,就注定 Mybatis 在数据库移植方面无法尽善尽美。

c. maven 编译后未将 xml 文件编译到 class文件夹下

   工程中需要输出到编译目录的配置文件有两部分,各数据表 mapper.xml 和 框架之间的各种各种的 .xml/.properties。

   编译运行时报错:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

   说是未绑定? 辗转半天,发现 mapper.xml 没有被编译到对应的文件夹下。

   maven build --> resources 节点下新增子 resource 子节点:

src/main/java
**/*.xml
true

   添加子节点后,mapper.xml 确实编译到对应的文件夹下了,但工程中原 Resources 下的文件没有像以前一样编译到 classes 下。

   maven build --> resources 节点下继续新增子 resource 子节点后解决:

src/main/resources
**/*.xml
**/*.properties
true

d. jetty 插件启动web 项目时,会同时启动 mybatis 逆向工程插件

   当使用 jetty:run 启动 web 项目后,总会有莫名其妙的问题。

   报错君是这样的:java.lang.IllegalArgumentException: Result Maps collection already contains value for com.rambo.sdm.dao.inter.UserPOMapper.BaseResultMap

   顺着启动日志发现,每次 jetty:run 时,mybatis.generator 插件会先运行,并逆向数据库工程。

   逆向生成就逆向生成吧,按道理需要生成的东西已经存在的话,跳过即可。

   generator 插件运行机制还是有点问题的,生成的类它跳过,但配置文件会将内容追加进去,所以才有了上述那个报错。

   移除 generator 插件 executions --> execution 下 goals 子节点问题得以解决。

Generate MyBatis Artifacts

  需要逆向工程时,手动启动插件即可。

本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/6229920.html,如需转载请自行联系原作者

你可能感兴趣的文章
Oracle 内存一 手动内存管理,自动内存管理
查看>>
我的友情链接
查看>>
Mysql学习笔记【原创】
查看>>
ssm配置多数据库支持
查看>>
JVM内存分配与垃圾回收浅析
查看>>
centOS下为PHP安装Xdebug
查看>>
配置tomcat支持ssl
查看>>
解决win2003下IIS中建立ASP网站出现500内部错误的方法(BUG)
查看>>
sfdisk和parted 使用说明
查看>>
linux常用操作命令
查看>>
select下拉框
查看>>
Oracle11.2.0.4 windows32+64bit path补丁21+11.2.0.4.160419 p22064588 p22839608
查看>>
ssh隧道 学习总结
查看>>
resin安装与配置
查看>>
每天一个linux命令-touch
查看>>
gdb跟踪堆栈
查看>>
我的友情链接
查看>>
验证文件切分实验
查看>>
【Python】卸载完Python3 之后 Python2 无法打开IDLE
查看>>
sql 增加字段
查看>>