Spring + SpringMVC + Druid + MyBatis 给您一个心灵手巧的后端化解方案

   生命不息,折腾不止。

 
 折腾能赶上重重坑,填坑我明白为成人。

   三个月前协调倒腾了一套用开源框架打造的
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.方案总体一览

图片 1

   由  Controller 层接受前端参数并响应请求,指点数量跳转页面。

   Controller 层注入 ServiceInter, ServiceImpl 层协会事务数据。

   ServiceImpl 层注入 Mybatis Mapper, Mapper 进行多少的访问。

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

图片 2web.xml

图片 3pom.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>

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

 

网站地图xml地图