Advertisement

手把手教你springboot集成mybatis

阅读量:

手把手教你springboot集成mybatis

熟悉职场多年的普通员工,在每启动一个新项目时都需要从头开始搭建;同时,在这个群体中也存在不少疑问与困惑——许多新手在面对项目的搭建时仍然存在诸多疑问;幸运的是,在这篇教程中我们正好全面解答了这两个关键问题。

这个项目的GitHub地址如下所示:
https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fzw201913%2Fawesome_spring
欢迎访问并使用!
请尽快开始使用项目!

首先,我们需要创建一个springboot项目。创建方式分为两种:

1. 创建springboot项目

  • 使用企业版idea创建

直接选择【Finish】完成。此时创建了一个空的springboot项目。

springboot官网创建

单击跳转至[springboot官网](https://link.juejin.cn/?target=https%3A%2F%2Fstart.spring.io/ springboot官网)

最终下载到一个zip文件,解压缩后通过idea导入

2. 添加Maven依赖

打开新生成的springboot项目,可以看到pom.xml里面只有少数几个依赖:

复制代码
 <?xml version="1.0" encoding="UTF-8"?>

    
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
     <modelVersion>4.0.0</modelVersion>
    
     <parent>
    
     <groupId>org.springframework.boot</groupId>
    
     <artifactId>spring-boot-starter-parent</artifactId>
    
     <version>2.7.2</version>
    
     <relativePath/> <!-- lookup parent from repository -->
    
     </parent>
    
     <groupId>com.example</groupId>
    
     <artifactId>demo1</artifactId>
    
     <version>0.0.1-SNAPSHOT</version>
    
     <name>demo1</name>
    
     <description>demo1</description>
    
     <properties>
    
     <java.version>11</java.version>
    
     </properties>
    
     <dependencies>
    
     <dependency>
    
         <groupId>org.springframework.boot</groupId>
    
         <artifactId>spring-boot-starter</artifactId>
    
     </dependency>
    
  
    
     <dependency>
    
         <groupId>org.springframework.boot</groupId>
    
         <artifactId>spring-boot-starter-test</artifactId>
    
         <scope>test</scope>
    
     </dependency>
    
     </dependencies>
    
  
    
     <build>
    
     <plugins>
    
         <plugin>
    
             <groupId>org.springframework.boot</groupId>
    
             <artifactId>spring-boot-maven-plugin</artifactId>
    
         </plugin>
    
     </plugins>
    
     </build>
    
  
    
 </project>
    
  
    
 复制代码

为了让项目功能相对完善,我们需要补充以下依赖:

基本的Spring和Spring MVC功能

复制代码
        1. <!--   spring + spring mvc一套     -->

    
        2. <dependency>
    
        3.     <groupId>org.springframework.boot</groupId>
    
        4.     <artifactId>spring-boot-starter-web</artifactId>
    
        5. </dependency>
    
        6. 复制代码

引入了这个依赖项后,则支持使用Spring及Spring MVC的各项功能。例如RestController类、@Service注解、@Autowired配置、以及Chef ballistic annotation @RequestMapping等其他功能。同时还可以应用IoC(注入式开发)与AOP(面向切面编程)的相关技术。

数据库引擎 mysql driver

复制代码
        1. <!--  【数据库】mysql driver  -->

    
        2. <dependency>
    
        3.     <groupId>mysql</groupId>
    
        4.     <artifactId>mysql-connector-java</artifactId>
    
        5.     <version>8.0.29</version>
    
        6. </dependency>
    
        7. 复制代码

目前普遍采用的是MySQL 8版本,在本场景中建议使用MySQL 8版本的driver。如果需要引入其他数据库引擎,则可访问maven repository获取相应的依赖项。

数据库链接池

复制代码
        1. <!--【数据库】数据库连接池-->

    
        2. <dependency>
    
        3.     <groupId>com.alibaba</groupId>
    
        4.     <artifactId>druid</artifactId>
    
        5.     <version>1.2.11</version>
    
        6. </dependency>
    
        7. 复制代码

通常情况下,在使用数据库时会遇到一些资源消耗较多的情况。即创建和销毁数据库链接的过程会消耗大量资源。此外,在实际应用中频繁地创建和销毁数据库链接也是常见操作。针对这种情况,则是选择Druid技术的主要原因之一。如果我们有其他需求或偏好,则可以选择其他类似的池化工具如dbcp、c3p0或HikariCP等进行替代配置。

mybatis依赖

复制代码
        1. <!--【数据库】持久层框架 mybatis-->

    
        2. <dependency>
    
        3.     <groupId>org.mybatis.spring.boot</groupId>
    
        4.     <artifactId>mybatis-spring-boot-starter</artifactId>
    
        5.     <version>2.2.2</version>
    
        6. </dependency>
    
        7. 复制代码

mybatis本质上就是一个通过数据库driver实现数据增删查改功能,并且能更友好地将操作结果传递给Java应用层的工具。如果没有Myatis的话, 我们也可以自行基于Driver去操作数据库, 但其效果差强人意. 或者我们可以尝试模仿这样的框架来构建一个类似的Myatis工具.

分页依赖

复制代码
        1. <!--【数据库】分页插件-->

    
        2. <dependency>
    
        3.     <groupId>com.github.pagehelper</groupId>
    
        4.     <artifactId>pagehelper-spring-boot-starter</artifactId>
    
        5.     <version>1.4.3</version>
    
        6. </dependency>
    
        7. 复制代码

为了满足业务需求,在涉及数据分页查询功能的列表模块中通常会遇到这样的问题

lombok工具

复制代码
        1. <!--【工具】lombok -->

    
        2. <dependency>
    
        3.     <groupId>org.projectlombok</groupId>
    
        4.     <artifactId>lombok</artifactId>
    
        5.     <optional>true</optional>
    
        6. </dependency>
    
        7. 复制代码

这个工具非常有用,并非徒劳无功。它帮助我们省去了编写大量重复性的get和set方法的时间成本,并能够自动生成构造函数代码等其他方法。这正是提高效率的一种典型工具,请予以采纳。

3. 添加插件

mybatis-generator插件

复制代码
        1. <!--     mybatis-generator maven插件,用于生成DAO代码       -->

    
        2. <plugin>
    
        3.     <groupId>org.mybatis.generator</groupId>
    
        4.     <artifactId>mybatis-generator-maven-plugin</artifactId>
    
        5.     <version>1.4.1</version>
    
        6.     <configuration>
    
        7.         <verbose>true</verbose>
    
        8.         <overwrite>true</overwrite>
    
        9.       <!-- mybatis-generator配置文件路径 --><configurationFile>${basedir}/src/main/resources/mybatis/generator/generatorConfig.xml
    
        10.     </configuration>
    
        11. </plugin>
    
        12. 复制代码

它是一个能够自动生成大量mybatis代码的工具。它通常能帮我们快速生成大量的mybatis相关代码,并且包括但不限于处理单表的基本 CRUD 操作以及处理单表较为复杂的条件查询操作。这也体现了其作为高效开发工具的核心价值。

插件添加完成后,可以在maven视图中可以看到mybatis-generator插件:

但是这个插件还不能正常运行,需要后面我们配置好后才行。

4. 配置项目

在配置完成后(即依赖和插件已成功安装的情况下),我们需要完成相应的项目设置以确保整个系统能够顺利运行。

在配置文件方面,我目前使用的是yml格式的应用文件application.yml。另外建议将项目中的application.properties文件改名为application.yml。

数据库配置

复制代码
        1. spring:

    
        2.   # 数据库链接配置
    
        3.   datasource:
    
        4.     url: jdbc:mysql://数据库ip:数据库端口/数据库名称?useUnicode=true&characterEncoding=UTF8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
    
        5.     driver-class-name: com.mysql.cj.jdbc.Driver
    
        6.     username: 数据库用户名
    
        7.     password: 数据库密码
    
        8.     # 链接池
    
        9.     type: com.alibaba.druid.pool.DruidDataSource
    
        10.     druid:
    
        11.       # 链接池初始化大小
    
        12.       initial-size: 8
    
        13.       # 最大活跃数
    
        14.       max-active: 16
    
        15.       # 最小空闲数
    
        16.       min-idle: 1
    
        17.       # 最大等待时间
    
        18.       max-wait: 60000
    
        19. 复制代码

博客中难以对外公开自己数据库的相关信息(如ip地址、端口等),于是采用中文字符来代替这些关键数据。朋友们可以根据自身数据库的具体配置进行相应的调整。

配置完毕后,在完成数据库连接的同时,我们也实现了链接池化功能。

mybatis配置

复制代码
        1. # mybatis配置

    
        2. mybatis:
    
        3.   check-config-location: true
    
        4.   #  mybatis框架配置文件,对mybatis的生命周期起作用
    
        5.   config-location: "classpath:mybatis/mybatis-config.xml"
    
        6.   #  配置xml路径
    
        7.   mapper-locations: "classpath:mybatis/mapper/*Mapper.xml"
    
        8.   #  配置model包路径
    
        9.   type-aliases-package: "com.example.awesomespring.dao.entity.*"
    
        10. 复制代码

此外还需要基于上述配置要求,在resources目录下建立mybatis目录结构,并存储相应的mybatis-config.xml配置文件以及Mapper.xml映射文件。

mybatis-config.xml文件是用来配置mybatis框架如何运行的配置;

Mapper.xml文档基于mybatis-generator插件被用来自动生成数据库操作配置。

mybatis-config.xml:

复制代码
 <?xml version="1.0" encoding="UTF-8" ?>

    
 <!DOCTYPE configuration PUBLIC
    
     "-//mybatis.org//DTD Config 3.0//EN"
    
     "http://mybatis.org/dtd/mybatis-3-config.dtd">
    
 <configuration>
    
     <settings>
    
     <!-- 全局的映射器启用或禁用缓存。 -->
    
     <setting name="cacheEnabled" value="true"/>
    
     <!-- 全局启用或禁用延迟加载 -->
    
     <setting name="lazyLoadingEnabled" value="true"/>
    
     <!-- 允许或不允许多种结果集从一个单独的语句中返回 -->
    
     <setting name="multipleResultSetsEnabled" value="true"/>
    
     <!-- 使用列标签代替列名 -->
    
     <setting name="useColumnLabel" value="true"/>
    
     <!-- 允许JDBC支持生成的键 -->
    
     <setting name="useGeneratedKeys" value="false"/>
    
     <!-- 配置默认的执行器 -->
    
     <setting name="defaultExecutorType" value="SIMPLE"/>
    
     <!-- 设置超时时间 -->
    
     <setting name="defaultStatementTimeout" value="60"/>
    
     <!-- 设置驼峰标识 -->
    
     <setting name="mapUnderscoreToCamelCase" value="true"/>
    
     </settings>
    
     <plugins>
    
     <!-- 分页插件 -->
    
     <plugin interceptor="com.github.pagehelper.PageInterceptor" />
    
     </plugins>
    
 </configuration>
    
 复制代码

mybatis-generator配置

在我们添加mybatis-generator插件的过程中就已经明确了配置文件的位置设置;接下来我们需要建立generatorConfig.xml文件。

generatorConfig.xml:

复制代码
 <?xml version="1.0" encoding="UTF-8"?>

    
 <!DOCTYPE generatorConfiguration
    
     PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    
     "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
  
    
 <generatorConfiguration>
    
     <!--参数配置-->
    
     <properties resource="mybatis/generator/generator.properties"/>
    
     <!-- 配置mysql 驱动jar包路径.用了绝对路径 -->
    
     <classPathEntry location="${classPathEntry}" />
    
  
    
     <context id="mysql_tables" targetRuntime="MyBatis3">
    
     <!-- 防止生成的代码中有很多注释,加入下面的配置控制 -->
    
     <commentGenerator>
    
         <property name="suppressAllComments" value="true" />
    
         <property name="suppressDate" value="true" />
    
     </commentGenerator>
    
  
    
     <!-- 数据库连接 -->
    
     <jdbcConnection driverClass="${driverClass}"
    
                     connectionURL="${connectionURL}"
    
                     userId="${userId}"
    
                     password="${password}">
    
     </jdbcConnection>
    
  
    
     <javaTypeResolver >
    
         <property name="forceBigDecimals" value="false" />
    
     </javaTypeResolver>
    
  
    
     <!-- 数据表对应的model层  -->
    
     <javaModelGenerator targetPackage="${modelTargetPackage}" targetProject="src/main/java">
    
         <property name="enableSubPackages" value="true" />
    
         <property name="trimStrings" value="true" />
    
     </javaModelGenerator>
    
  
    
     <!-- sql mapper 映射配置文件 -->
    
     <sqlMapGenerator targetPackage="${sqlMapTargetPackage}"  targetProject="src/main/resources">
    
         <property name="enableSubPackages" value="true" />
    
     </sqlMapGenerator>
    
  
    
     <!-- mybatis3中的mapper接口 -->
    
     <javaClientGenerator type="XMLMAPPER" targetPackage="${javaClientTargetPackage}"  targetProject="src/main/java">
    
         <property name="enableSubPackages" value="true" />
    
     </javaClientGenerator>
    
  
    
     <!-- 数据表进行生成操作 schema:相当于库名; tableName:表名; domainObjectName:对应的DO -->
    
     <table schema="${schema}" tableName="${tableName}" domainObjectName="${domainObjectName}">
    
     </table>
    
  
    
     </context>
    
 </generatorConfiguration>
    
 复制代码

这个文件头如果有报红,没有关系,不用管,不影响功能。

采用生成器配置文件的方式进行参数化处理后发现了一些需要进一步优化的地方

复制代码
 # 我们需要提供一个driver包所在的路径,一般在.m2文件夹里面,因为所有maven下载的依赖包都会放在这里;

    
 # 不知道.m2文件夹位置的可以找一下相关资料
    
 classPathEntry=~/.m2/repository/mysql/mysql-connector-java/8.0.29/mysql-connector-java-8.0.29.jar
    
 driverClass=com.mysql.cj.jdbc.Driver
    
 # 一定要改成自己的数据库ip、端口和名称
    
 connectionURL=jdbc:mysql://数据库ip:数据库端口/数据库名称?useUnicode=true&characterEncoding=UTF8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
    
 # 一定要修改成自己的数据库用户名
    
 userId=数据库用户名
    
 # 一定要修改成自己的数据库密码
    
 password=数据库密码
    
 # 实体类所放的包名,根据自己的项目包名修改,记住要提前把包名创建好
    
 modelTargetPackage=com.example.awesomespring.dao.entity
    
 # Mapper.xml存放的路径,在resources里面,记住要提前创建好;要和application.yml里面的mapper-locations路径对上,两个配置的表达方式不同,这个里面不需要加classpath。
    
 sqlMapTargetPackage=mybatis/mapper
    
 # mapper类所放的包名,根据自己的项目包名修改,记住要提前把包名创建好
    
 javaClientTargetPackage=com.example.awesomespring.dao.mapper
    
 # 哪个数据库
    
 schema=awesome_spring
    
 # 哪个表
    
 tableName=account
    
 # 生成的实体类名称
    
 domainObjectName=Account
    
 复制代码

目前我们可以顺利运行mybatis-generator插件。接下来,请您在Maven视图中右键点击mybatis-generator插件并选择将其打开。

完成之后
我们能够发现项目中已经自动生成了相关数据表实体类
Mapper接口以及Mapper.xml等文件

需要注意的是,在项目的打包流程中,默认情况下会将位于resourcess目录中的Mapper.xml一并整合到主包中以避免路径冲突的问题。然而,在实际部署过程中可能会遇到构建依赖项的问题。因此,在配置pom.xml时应特别关注build阶段的相关参数设置以确保所有依赖关系都能正确处理

复制代码
 <!--需要打包的资源-->

    
 <resources>
    
     <resource>
    
     <directory>src/main/resources</directory>
    
     <includes>
    
         <include>**/*.properties</include>
    
         <include>**/*.yml</include>
    
         <include>**/*.xml</include>
    
     </includes>
    
     <filtering>true</filtering>
    
     </resource>
    
 </resources>
    
 复制代码

项目已基本完成配置。最后一步任务是指导Spring Boot对所有MyBatis接口进行扫描。为此,在Spring Boot启动类中添加注解:@MapperScan(basePackages = "mapper类存放的位置");经过该操作后, Spring Boot将识别并整合所有相关的Mapper接口以达成目标

全部配置完毕后,我们就可以写代码开始一天的crud了,哈哈!

最后,把application.yml和pom.xml展示出来:

application.yml:

复制代码
 spring:

    
   # 数据库链接配置
    
   datasource:
    
     url: jdbc:mysql://数据库ip:数据库端口/数据库名称?useUnicode=true&characterEncoding=UTF8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=UTC
    
     driver-class-name: com.mysql.cj.jdbc.Driver
    
     username: 数据库用户名
    
     password: 数据库密码
    
     # 链接池
    
     type: com.alibaba.druid.pool.DruidDataSource
    
     druid:
    
       # 链接池初始化大小
    
       initial-size: 8
    
       # 最大活跃数
    
       max-active: 16
    
       # 最小空闲数
    
       min-idle: 1
    
       # 最大等待时间
    
       max-wait: 60000
    
 # mybatis配置
    
 mybatis:
    
   check-config-location: true
    
   #  mybatis框架配置文件,对mybatis的生命周期起作用
    
   config-location: "classpath:mybatis/mybatis-config.xml"
    
   #  配置xml路径
    
   mapper-locations: "classpath:mybatis/mapper/*Mapper.xml"
    
   #  配置model包路径
    
   type-aliases-package: "com.example.awesomespring.dao.entity.*"
    
  
    
 # 日志配置
    
 logging:
    
   pattern:
    
     # 日志输出格式
    
     console: "%d{yyyy-MM-dd HH:mm:ss} %clr(%5p) [%thread] %clr(%logger){cyan} : %msg%n"
    
   level:
    
     #    trace < debug < info < warn < error < fatal
    
     # 全局日志级别
    
     root: info
    
     # 指定包日志级别
    
     com.example.awesomespring: warn
    
 复制代码

pom.xml

复制代码
 <?xml version="1.0" encoding="UTF-8"?>

    
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    
     <modelVersion>4.0.0</modelVersion>
    
     <parent>
    
     <groupId>org.springframework.boot</groupId>
    
     <artifactId>spring-boot-starter-parent</artifactId>
    
     <version>2.7.2</version>
    
     <relativePath/> <!-- lookup parent from repository -->
    
     </parent>
    
     <groupId>com.example</groupId>
    
     <artifactId>awesome-spring</artifactId>
    
     <version>0.0.1-SNAPSHOT</version>
    
     <name>awesome-spring</name>
    
     <description>awesome-spring</description>
    
     <properties>
    
     <java.version>11</java.version>
    
     </properties>
    
     <dependencies>
    
     <!--   spring + spring mvc一套     -->
    
     <dependency>
    
         <groupId>org.springframework.boot</groupId>
    
         <artifactId>spring-boot-starter-web</artifactId>
    
     </dependency>
    
     <!--【工具】lombok -->
    
     <dependency>
    
         <groupId>org.projectlombok</groupId>
    
         <artifactId>lombok</artifactId>
    
         <optional>true</optional>
    
     </dependency>
    
     <!--【数据库】DAO框架 mybatis-->
    
     <dependency>
    
         <groupId>org.mybatis.spring.boot</groupId>
    
         <artifactId>mybatis-spring-boot-starter</artifactId>
    
         <version>2.2.2</version>
    
     </dependency>
    
     <!--【数据库】DAO框架分页插件-->
    
     <dependency>
    
         <groupId>com.github.pagehelper</groupId>
    
         <artifactId>pagehelper-spring-boot-starter</artifactId>
    
         <version>1.4.3</version>
    
     </dependency>
    
     <!--  【数据库】mysql driver  -->
    
     <dependency>
    
         <groupId>mysql</groupId>
    
         <artifactId>mysql-connector-java</artifactId>
    
         <version>8.0.29</version>
    
     </dependency>
    
     <!--【数据库】数据库连接池-->
    
     <dependency>
    
         <groupId>com.alibaba</groupId>
    
         <artifactId>druid</artifactId>
    
         <version>1.2.11</version>
    
     </dependency>
    
     <!--测试-->
    
     <dependency>
    
         <groupId>org.springframework.boot</groupId>
    
         <artifactId>spring-boot-starter-test</artifactId>
    
         <scope>test</scope>
    
     </dependency>
    
     </dependencies>
    
  
    
     <build>
    
     <!--需要打包的资源-->
    
     <resources>
    
         <resource>
    
             <directory>src/main/resources</directory>
    
             <includes>
    
                 <include>**/*.properties</include>
    
                 <include>**/*.yml</include>
    
                 <include>**/*.xml</include>
    
             </includes>
    
             <filtering>true</filtering>
    
         </resource>
    
     </resources>
    
     <plugins>
    
         <!--     mybatis-generator maven插件,用于生成DAO代码       -->
    
         <plugin>
    
             <groupId>org.mybatis.generator</groupId>
    
             <artifactId>mybatis-generator-maven-plugin</artifactId>
    
             <version>1.4.1</version>
    
             <configuration>
    
                 <verbose>true</verbose>
    
                 <overwrite>true</overwrite>
    
                 <configurationFile>${basedir}/src/main/resources/mybatis/generator/generatorConfig.xml
    
                 </configurationFile>
    
             </configuration>
    
         </plugin>
    
         <!--     maven编译插件       -->
    
         <plugin>
    
             <groupId>org.springframework.boot</groupId>
    
             <artifactId>spring-boot-maven-plugin</artifactId>
    
             <configuration>
    
                 <excludes>
    
                     <exclude>
    
                         <groupId>org.projectlombok</groupId>
    
                         <artifactId>lombok</artifactId>
    
                     </exclude>
    
                 </excludes>
    
             </configuration>
    
         </plugin>
    
     </plugins>
    
     </build>
    
 </project>

999

持续更新中

全部评论 (0)

还没有任何评论哟~