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,如需转载请自行联系原作者

目录
打赏
0
0
0
0
51
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
59 0
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
162 70
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
180 29
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
40 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
110 0
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
148 2
Spring Boot 3 整合 Mybatis-Plus 实现数据权限控制
本文介绍了如何在Spring Boot 3中整合MyBatis-Plus实现数据权限控制,通过使用MyBatis-Plus提供的`DataPermissionInterceptor`插件,在不破坏原有代码结构的基础上实现了细粒度的数据访问控制。文中详细描述了自定义注解`DataScope`的使用方法、`DataPermissionHandler`的具体实现逻辑,以及根据用户的不同角色和部门动态添加SQL片段来限制查询结果。此外,还展示了基于Spring Boot 3和Vue 3构建的前后端分离快速开发框架的实际应用案例,包括项目的核心功能模块如用户管理、角色管理等,并提供Gitee上的开源仓库
665 11
深入探讨:Spring与MyBatis中的连接池与缓存机制
Spring 与 MyBatis 提供了强大的连接池和缓存机制,通过合理配置和使用这些机制,可以显著提升应用的性能和可扩展性。连接池通过复用数据库连接减少了连接创建和销毁的开销,而 MyBatis 的一级缓存和二级缓存则通过缓存查询结果减少了数据库访问次数。在实际应用中,结合具体的业务需求和系统架构,优化连接池和缓存的配置,是提升系统性能的重要手段。
224 4
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
272 3
实现跨域请求:Spring Boot后端的解决方案
本文介绍了在Spring Boot中处理跨域请求的三种方法:使用`@CrossOrigin`注解、全局配置以及自定义过滤器。每种方法都适用于不同的场景和需求,帮助开发者灵活地解决跨域问题,确保前后端交互顺畅与安全。
227 0