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.方案整体一览

   由  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>

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

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

相关文章
|
29天前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
4月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
307 0
|
7月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
458 70
|
4月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
147 0
|
4月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
246 0
|
6月前
|
druid Java 关系型数据库
Spring Boot与Druid升级解决方案
好的,我需要帮助用户解决他们遇到的数据库连接问题,并升级项目的依赖。首先,用户提供的错误信息是关于Spring Boot应用在初始化数据源时抛出的异常,具体是Druid连接池验证连接失败。同时,用户希望升级项目的依赖版本。
596 10
|
7月前
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
315 5
|
7月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
312 0
|
7月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
486 0