Spring Boot项目搭建流程(一)—— 搭建SpringBoot应用

本文详细介绍如何在SpringBoot项目中集成Mybatis框架,包括配置数据源、使用Mybatis插件、代码生成器以及实现通用Service层的方法。涵盖依赖引入、配置文件调整、自定义通用接口和实现类等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

搭建Spring Boot应用(数据层框架采用Mybatis,集成Mapper插件)

  • Spring Boot中使用Mybatis

    • 引入mybatis-spring-boot-starter依赖
    • 引入数据库连接驱动(Oracle:ojdbc6;Mysql:mysql-connector-java)
    • 引入druid-spring-boot-starter依赖(Druid数据源,功能:数据库连接池、监控)
    • 配置Druid数据源
      server:
        servlet:
          context-path: /makelocks
      
      spring:
        datasource:
          druid:
            # 数据库访问配置, 使用druid数据源
            db-type: com.alibaba.druid.pool.DruidDataSource
            driver-class-name: com.mysql.cj.jdbc.Driver
            url: jdbc:mysql://localhost.cn:3306/mysql?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
            username: root
            password: 123456
            # 连接池配置
            initial-size: 5
            min-idle: 5
            max-active: 20
            # 连接等待超时时间
            max-wait: 30000
            # 配置检测可以关闭的空闲连接间隔时间
            time-between-eviction-runs-millis: 60000
            # 配置连接在池中的最小生存时间
            min-evictable-idle-time-millis: 300000
            validation-query: select '1' from dual
            test-while-idle: true
            test-on-borrow: false
            test-on-return: false
            # 打开PSCache,并且指定每个连接上PSCache的大小
            pool-prepared-statements: true
            max-open-prepared-statements: 20
            max-pool-prepared-statement-per-connection-size: 20
            # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
            filters: stat,wall
            # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔
            aop-patterns: cn.makelocks.management.service.*
      
            # WebStatFilter配置
            web-stat-filter:
              enabled: true
              # 添加过滤规则
              url-pattern: /*
              # 忽略过滤的格式
              exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
      
            # StatViewServlet配置
            stat-view-servlet:
              enabled: true
              # 访问路径为/druid时,跳转到StatViewServlet
              url-pattern: /druid/*
              # 是否能够重置数据
              reset-enable: false
              # 需要账号密码才能访问控制台
              login-username: druid
              login-password: druid123
              # IP白名单
              allow: 127.0.0.1
              # IP黑名单(共同存在时,deny优先于allow)
              deny: 127.0.0.1
      
            # 配置StatFilter
            filter:
              stat:
                log-slow-sql: true
    
    • 使用Mybatis(根据数据库表创建实体、Dao层接口、Mapper映射文件、Service层接口及实现类、Controller接口)
    • Mybatis相关配置
    	mybatis:
    	    # 配置映射文件扫描路径
    	    mapper-locations: classpath:mapper/*.xml
    	    configuration:
    	      # 开启驼峰命名转换
    	      map-underscore-to-camel-case: true
    
    • 在Application类加入@MapperScan注解,自动扫描Dao层接口
  • Mybatis通用Mapper插件和PageHelper分页插件

    • 引入依赖:通用mapper及pagehelper分页插件
    	<!-- 通用mapper -->
    	<dependency>
    	    <groupId>tk.mybatis</groupId>
    	    <artifactId>mapper-spring-boot-starter</artifactId>
    	    <version>2.1.5</version>
    	</dependency>
    	<!-- pagehelper 分页插件 -->
    	<dependency>
    	    <groupId>com.github.pagehelper</groupId>
    	    <artifactId>pagehelper-spring-boot-starter</artifactId>
    	    <version>1.2.3</version>
    	</dependency>
    
    • 在pom中配置Mybatis Generator
      <!-- 配置 Mybatis Generator 插件 -->
      <plugin>
           <groupId>org.mybatis.generator</groupId>
           <artifactId>mybatis-generator-maven-plugin</artifactId>
           <version>1.3.5</version>
           <dependencies>
               <!-- mysql数据库连接驱动 -->
               <dependency>
                   <groupId>mysql</groupId>
                   <artifactId>mysql-connector-java</artifactId>
                   <version>8.0.17</version>
               </dependency>
               <dependency>
                   <groupId>tk.mybatis</groupId>
                   <artifactId>mapper</artifactId>
                   <version>3.4.4</version>
               </dependency>
           </dependencies>
           <executions>
               <execution>
                   <id>Generate MyBatis Artifacts</id>
                   <phase>package</phase>
                   <goals>
                       <goal>generate</goal>
                   </goals>
               </execution>
           </executions>
           <configuration>
               <!--允许移动生成的文件 -->
               <verbose>true</verbose>
               <!-- 是否覆盖 -->
               <overwrite>true</overwrite>
               <!-- 自动生成的配置 -->
               <configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
           </configuration>
       </plugin>
      
    • 配置Mybatis(在application.yml中)
    	mybatis:
    	  	# type-aliases扫描路径
    	  	type-aliases-package: cn.makelocks.management.po
    
    • 配置通用Mapper插件(在application.yml中):需要先自定义GenericMapper接口
    	mapper:
    	  mappers: cn.makelocks.management.common.GenericMapper
    	  not-empty: false
    	  identity: mysql
    
    • 配置PageHelper(在application.yml中)
    	pagehelper:
    	  dialect: com.github.pagehelper.PageHelper
    	  reasonable: true
    	  support-methods-arguments: true
    	  params: count=countSql
    
    • 配置Generator(src/main/resources/下新建mybatis-generator.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>
    	    <context id="mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
    	
    	        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
    	            <!-- 该配置会使生产的Mapper自动继承MyMapper -->
    	            <property name="mappers" value="cn.makelocks.management.common.GenericMapper" />
    	            <!-- caseSensitive默认false,当数据库表名区分大小写时,可以将该属性设置为true -->
    	            <property name="caseSensitive" value="false"/>
    	        </plugin>
    	
    	        <!-- 阻止生成自动注释 -->
    	        <commentGenerator>
    	            <property name="javaFileEncoding" value="UTF-8"/>
    	            <property name="suppressDate" value="true"/>
    	            <property name="suppressAllComments" value="true"/>
    	        </commentGenerator>
    	
    	        <!-- 数据库链接地址账号密码 -->
    	        <jdbcConnection
    	            driverClass="com.mysql.cj.jdbc.Driver"
    	            connectionURL="jdbc:mysql://mloveyh.cn:3306/makelock"
    	            userId="root"
    	            password="930725">
    	        </jdbcConnection>
    	
    	        <javaTypeResolver>
    	            <property name="forceBigDecimals" value="false"/>
    	        </javaTypeResolver>
    	
    	        <!-- 生成Model类存放位置 -->
    	        <javaModelGenerator targetPackage="cn.makelocks.management.po" targetProject="src/main/java">
    	            <property name="enableSubPackages" value="true"/>
    	            <property name="trimStrings" value="true"/>
    	        </javaModelGenerator>
    	
    	        <!-- 生成映射文件存放位置 -->
    	        <sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources">
    	            <property name="enableSubPackages" value="true"/>
    	        </sqlMapGenerator>
    	
    	        <!-- 生成Dao类存放位置 -->
    	        <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件的代码
    	            type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
    	            type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
    	        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.makelocks.management.dao" targetProject="src/main/java">
    	            <property name="enableSubPackages" value="true"/>
    	        </javaClientGenerator>
    	
    	        <!-- 配置需要生成的表 -->
    	        <table tableName="m_area" domainObjectName="AreaPO" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
    	            <generatedKey column="id" sqlStatement="mysql" identity="true"/>
    	        </table>
    	    </context>
    	</generatorConfiguration>
    
    • 在IDEA的右侧栏点击Maven,选中添加的Mybatis-generator插件并运行,就可以得到相应的代码
    • 代码生成后,最好将pom.xml中刚刚开启的插件重新注释掉。因为在项目打包的时候会自动运行该插件,这样如果生成的代码后续有修改的话,将会被覆盖掉。所以通常的做法是只有在需要生成代码的时候才将该插件开启。
    • 自定义一个通用的Service接口(GenericService接口)
    	@Service
    	public interface GenericService<T> {
    	
    	    List<T> selectAll();
    	
    	    T selectByKey(Object key);
    	
    	    int save(T entity);
    	
    	    int delete(Object key);
    	
    	    int updateAll(T entity);
    	
    	    int updateNotNull(T entity);
    	
    	    List<T> selectByExample(Object example);
    	
    	}
    
    • 实现通用的Service接口(BaseService类)
    	public abstract class BaseService<T> implements GenericService<T> {
    	
    	    @Autowired
    	    protected Mapper<T> mapper;
    	
    	    public Mapper<T> getMapper() {
    	        return mapper;
    	    }
    	
    	    /**
    	     * 查询所有数据
    	     * @return
    	     */
    	    @Override
    	    public List<T> selectAll() {
    	        return mapper.selectAll();
    	    }
    	
    	    /**
    	     * 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号
    	     * @param key 主键值
    	     * @return
    	     */
    	    @Override
    	    public T selectByKey(Object key) {
    	        return mapper.selectByPrimaryKey(key);
    	    }
    	
    	    /**
    	     * 保存一个实体,null的属性也会保存,不会使用数据库默认值
    	     * @param entity 待保存的实体
    	     * @return
    	     */
    	    @Override
    	    public int save(T entity) {
    	        return mapper.insert(entity);
    	    }
    	
    	    /**
    	     * 根据主键字段进行删除,方法参数必须包含完整的主键属性
    	     * @param key 主键值
    	     * @return
    	     */
    	    @Override
    	    public int delete(Object key) {
    	        return mapper.deleteByPrimaryKey(key);
    	    }
    	
    	    /**
    	     * 根据主键更新实体全部字段,null值会被更新
    	     * @param entity 待更新的实体
    	     * @return
    	     */
    	    @Override
    	    public int updateAll(T entity) {
    	        return mapper.updateByPrimaryKey(entity);
    	    }
    	
    	    /**
    	     * 根据主键更新实体不为null的字段
    	     * @param entity 待更新实体
    	     * @return
    	     */
    	    @Override
    	    public int updateNotNull(T entity) {
    	        return mapper.updateByPrimaryKeySelective(entity);
    	    }
    	
    	    /**
    	     * 根据Example条件进行查询
    	     * 重点:这个查询支持通过Example类指定查询列,通过selectProperties方法指定查询列
    	     * @param example
    	     * @return
    	     */
    	    @Override
    	    public List<T> selectByExample(Object example) {
    	        return mapper.selectByExample(example);
    	    }
    	}
    
    • 后续各功能模块中的Service接口只需要继承自GenericService接口即可;对应Service接口的实现类只需要继承自BaseService类并实现对应的Service接口即可
    • 注意点:
      • 异常:java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider;
      • 解决:使用@MapperScan注解时应该导入import tk.mybatis.spring.annotation.MapperScan这个包。
      • 异常:com.github.pagehelper.PageException: java.lang.ClassNotFoundException: mysql;
      • 解决:PageHelper版本差异导致的dialect加载问题,需要将dialect的值设置为com.github.pagehelper.PageHelper。
    • PageHelper插件的使用:
	@GetMapping("/selectByPage/{pageNum}/{pageSize}")
    public PageInfo<LockTypePO> selectByPage(@PathVariable int pageNum, @PathVariable int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<LockTypePO> lockTypes = lockTypeService.selectAll();
        return new PageInfo<>(lockTypes);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值