生命不息,折腾不止。

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

两个月前自己倒腾了一套用开源框架构建的 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.方案整体一览

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

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

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

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

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>

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

Spring + SpringMVC + Druid + MyBatis 给你一个灵活的后端解决方案的更多相关文章

  1. Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案

    最近手头的工作不太繁重,自己试着倒腾了一套用开源框架组建的 JavaWeb 后端解决方案. 感觉还不错的样子,但实践和项目实战还是有很大的落差,这里只做抛砖引玉之用. 项目 git 地址:https: ...

  2. spring boot + druid + mybatis + atomikos 多数据源配置 并支持分布式事务

    文章目录 一.综述 1.1 项目说明 1.2 项目结构 二.配置多数据源并支持分布式事务 2.1 导入基本依赖 2.2 在yml中配置多数据源信息 2.3 进行多数据源的配置 三.整合结果测试 3.1 ...

  3. Spring SpringMVC和Mybatis整合

    1.引入所要的jar包 2.创建Mybatis的sqlMapConfig.xml配置文件,该文件中可以配置mybaits的相关参数,数据源不在这里配置. <?xml version=" ...

  4. spring boot druid mybatis多数据源

    一.关闭数据源自动配置(很关键) @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) 如果不关闭会报异常:o ...

  5. 基于Maven + SSM (Spring、SpringMVC、Mybatis)构建一个简单的测试项目

    最近在公司实习期间的培训交流中有机会接触到SSM,然后自己花费1周的时间投入学习.谈不上深刻理解其中原理,所以没有涉及理论知识,只是浅层次的学习如何使用,在此将学习过程记录整理出来,一方面自己备用:另 ...

  6. 整合spring,springmvc和mybatis

    我创建的是maven项目,使用到的依赖架包有下面这些: <dependencies> <dependency> <groupId>org.springframewo ...

  7. spring+springmvc+maven+mybatis整合

    jar包依赖:网址search.maven.org 1.spring :spring-core            2. myhabits:myhabits 3.整合spring和myhabits: ...

  8. Eclipse+Spring+SpringMVC+Maven+Mybatis+MySQL+Tomcat项目搭建

    ---恢复内容开始--- 1. 建表语句及插入数据 CREATE TABLE `book_user` ( user_id INT(11) NOT NULL AUTO_INCREMENT, user_n ...

  9. ssm框架(Spring Springmvc Mybatis框架)整合及案例增删改查

    三大框架介绍 ssm框架是由Spring springmvc和Mybatis共同组成的框架.Spring和Springmvc都是spring公司开发的,因此他们之间不需要整合.也可以说是无缝整合.my ...

随机推荐

  1. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  2. LinqToDB 源码分析——生成表达式树

    当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开I ...

  3. IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件

    ##安装插件步骤: 1.打开settings 2.选择plugins 3.点击"Browse repositories" 4.搜索对应内插件,点击"install&quo ...

  4. 常用JavaScript触发事件

    事件句柄 onclick=JavaScript:鼠标单击某个对象.3 ondblclick=JavaScript:鼠标双击某个对象.3 onmousedown=JavaScript:某个鼠标键被按下. ...

  5. JavaWeb_day07_JSP

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day07 JSP 全称 :Java Server P ...

  6. java抽象、接口 和final

    抽象 一.抽象类:不知道是具体什么东西的类. abstract class 类名 1.抽象类不能直接new出来. 2.抽象类可以没有抽象方法. public abstract class USB { ...

  7. Java常用的几种集合, Map集合,Set集合,List集合

    Java中  Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...

  8. 项目编码规范(Ali)

    一.研发流程规范 二.SQL编码规范 数据库命名规范:数据库名一律小写,必须以字母开头.库名包含多个单词的,以下划线“_”分隔.如果采用分库方案,分库编号从“0”开始,用“0”左补齐为四位. 表名规范 ...

  9. 从零开始学 Java - Spring 集成 Memcached 缓存配置(一)

    硬盘和内存的作用是什么 硬盘的作用毫无疑问我们大家都清楚,不就是用来存储数据文件的么?如照片.视频.各种文档或等等,肯定也有你喜欢的某位岛国老师的动作片,这个时候无论我们电脑是否关机重启它们永远在那里 ...

  10. 【原】JAVA SE编码规范

    /* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...