设为首页 收藏本站
查看: 888|回复: 0

[经验分享] Spring + SpringMVC + Druid + MyBatis 给你一个灵活的后端解决方案

[复制链接]

尚未签到

发表于 2017-3-1 09:20:55 | 显示全部楼层 |阅读模式
     生命不息,折腾不止。
     折腾能遇到很多坑,填坑我理解为成长。
     两个月前自己倒腾了一套用开源框架构建的 JavaWeb 后端解决方案。
     Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案
     引入到项目组后经过几番打磨,现在也出落的有模有样。
     最近将工程中的 Hibernate 换了换 Mybatis 试试,毕竟人都需要新鲜感。
     我 Hibernate 接触的要比 MyBatis 早,作为最流行的两 ORM 框架,个人认为其中很多思想都相通。
     但 MyBatis 特有的 ResultMap 构想,能进行更为细致的 SQL 调整和优化。
     在开发社区、版本更新速度、支持的工具上,Hibernate 比 MyBatis 更胜一筹。
     项目 Git 地址:https://git.oschina.net/LanboEx/sdm

1.方案整体一览
DSC0000.png

  由  Controller 层接受前端参数并响应请求,携带数据跳转页面。
  Controller 层注入 ServiceInter, ServiceImpl 层组织业务数据。
  ServiceImpl 层注入 Mybatis Mapper, Mapper 进行数据的访问。
  和 Hibernate 类似整个 dao 层,都可以由工具生成,工程中使用的是 org.mybatis.generator 插件。


DSC0001.gif web.xml

pom.xml
2.遇到的坑
     浅坑这里就不说了,下面梳理比较深的几个坑。
     如果你以前遇到过这些问题,并且有比我还完美的解决方法,请赐教。
  a. MapperScannerConfigurer 提前初始化导致 spring 注入配置文件失效



    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.rambo.sdm.dao.inter"/>
<property name="sqlSessionFactory " ref="sessionFactory"/>
</bean>
    因为希望 Spring 能扫描 Mapper 接口类加载 Mapper.xml 并自动生成实现代理类,注入到相应的 ServiceImpl 中。
    刚开始配置如上,但是发现 Spring 无法正常加载配置文件中的信息。
    也就是用 ${jdbc.username} 这样之类的表达式,无法获取到 properties 文件里的内容。
    几次尝试未果之后,发现 MapperScannerConigurer 实际是在解析加载 bean 定义阶段,这个时候设置 sqlSessionFactory 的话。
    会导致提前初始化一些类,PropertyPlaceholderConfigurer 还没来得及替换定义中的变量,导致把表达式当作字符串复制了。
    将 sqlSessionFactory 替换为 sqlSessionFactoryBeanName 问题解决,配置如下:



    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.rambo.sdm.dao.inter"/>
<property name="sqlSessionFactoryBeanName" value="sessionFactory"/>
</bean>
  b. dao 层数据表主键自动生成
     在编写工程例子运行后,发现提示错误 UUID 不为 NUll。
     自动生成的 mapper.xml 中,对于主键(自增序列/uuid)需要自己配置,这点确实有点 low。
     自己配置就自己配置吧,mapper.xml 中 UUID 配置如下:



    <selectKey keyProperty="uuid" resultType="String" order="BEFORE">
select replace(uuid(),'-','')  UUID
</selectKey>
    假设项目推进中,生成数据表配置文件后需要研发手动在 mapper.xml 的新增方法中添加主键生成策略,不仅繁琐而且出问题的概率极大。
    试着摸索有没有什么统一配置的地方,发现了一种但还是不够完美。统一配置在 generatorConfig.xml 生成表的地方:



        <table tableName="user" domainObjectName="UserPO">
<generatedKey column="uuid" sqlStatement="SELECT REPLACE(UUID(),'-','') UUID FROM DUAL"/>
</table>
     主键生成策略使用 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 子节点:



            <resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
     添加子节点后,mapper.xml 确实编译到对应的文件夹下了,但工程中原 Resources 下的文件没有像以前一样编译到 classes 下。
     maven build --> resources 节点下继续新增子 resource 子节点后解决:



            <resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
  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 子节点问题得以解决。



                <executions>
<execution>
<id>Generate MyBatis Artifacts</id>
</execution>
</executions>
    需要逆向工程时,手动启动插件即可。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-348612-1-1.html 上篇帖子: ActiveMQ入门实例 下篇帖子: Tomcat一个BUG造成CLOSE_WAIT
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表