springboot-多模块构建-2

三个标签完成springboot定时任务配置

1. 问题描述

Java项目定时任务是必备模块,月高风黑夜跑个批处理,记录或者统计一些系统信息。

2. 解决方案:

结合springboot,只需三个标签就能完成定时任务配置。

2.1 标签1

用在springboot的启动类上,@EnableScheduling标签。

@EnableScheduling
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2.2 标签2和3

2.2.1 具体代码
@Configuration
public class BatchJobService {

    @Scheduled(cron = "0 10 0 * * ? ") ////月高风黑夜的12点10分执行
    public void demoService() {
          System.out.println(demo);
    }
2.2.2 代码解析

示例代码删除了不必要的真实代码,用了最简答的代码,尽量把问题说清楚。

标签2,@Configuration用在定时类上;
标签3,@Scheduled用在定时方法上;

定时正则说明:

示例中:cron = "0 10 0 * * ? " ,表示:12点10分执行

  • 第一位,表示秒,取值0-59 *

  • 第二位,表示分,取值0-59 *

  • 第三位,表示小时,取值0-23 *

  • 第四位,日期天/日,取值1-31 *

  • 第五位,日期月份,取值1-12 *

  • 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思另外:1表示星期天,2表示星期一。

  • 第7为,年份,可以留空,取值1970-2099

springboot +mybatis分页插件PageHelper

1.问题描述

JAVA界ORM的两位大佬Hibernate和Mybatis,hb自带分页(上手挺快,以前用了好几年hb,后期运维及优化快疯了),mybatis没有分页功能,需要借助第三方插件来完成,比较流行的三方框架:PageHelper,今天结合springboot做下介绍,直接贴线上配置,保证可用(如有遗漏,朋友们可以指正下)。

2. 解决方案

2.1 配置项目pom.xml

        <!--分页-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.8</version>
        </dependency>

2.2 配置PageHelper参数

方式比有很多,这里只介绍使用过的两种吧。

方式一,使用标签Configuration:


public class PageHelperConfig {

​    @Bean

​    public PageHelper getPageHelper(){

​        PageHelper pageHelper=new PageHelper();

​        Properties properties=new Properties();

​        properties.setProperty("helperDialect","mysql");

​        properties.setProperty("reasonable","true");

​        properties.setProperty("supportMethodsArguments","true");

​        properties.setProperty("params","count=countSql");

​        pageHelper.setProperties(properties);

​        return pageHelper;

​    }

}

方式二,因为我们当时mybatis插件自动生成了一个xml,就直接放xml里了。跟sp的无配置文件概念是不是有点冲突? 这里简单啰嗦一句,其实软件的过程有点三十年河东三十年河西的味道,以前是要配置集中化,都由几个中心配置文件管理;现在是去中心化,全部通过标签来定义;看个人习惯吧,我们项目中除了application.yml也还有两个配置文件,一个是数据库和事务aop那个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="false"/>
        <!-- 查询时,关闭关联对象即时加载以提高性能 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 -->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->
        <setting name="multipleResultSetsEnabled" value="true"/>
        <!-- 允许使用列标签代替列名 -->
        <setting name="useColumnLabel" value="true"/>
        <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值),数据表的PK生成策略将被覆盖 -->
        <setting name="useGeneratedKeys" value="true"/>
        <!-- 给予被嵌套的resultMap以字段-属性的映射支持 -->
        <setting name="autoMappingBehavior" value="FULL"/>
        <!-- 对于批量更新操作缓存SQL以提高性能  但是返回id有问题-->
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <!-- 数据库超过36000秒仍未响应则超时 -->
        <setting name="defaultStatementTimeout" value="36000"/>
        <!-- 日志使用logback实现 -->
        <!--<setting name="logImpl" value="LOGBACK"/>-->
        <!--是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN 到经典 Java 属性名 aColumn 的类似映射。 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>

    </settings>
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">

            <property name="offsetAsPageNum" value="false"/>
            <property name="rowBoundsWithCount" value="false"/>
            <property name="pageSizeZero" value="true"/>
            <property name="reasonable" value="false"/>
            <property name="supportMethodsArguments" value="false"/>
            <property name="returnPageInfo" value="none"/>
        </plugin>
    </plugins>
</configuration>

2.3 项目中使用

使用示例:

public Object getAppUsers(ShareAppsVO shareAppsVO) {
//分页就这一行就可以了两个参数,一是当前页,一是每页显示的条数
        PageHelper.startPage(shareAppsVO.getCurrentPage(), shareAppsVO.getPageSize());  
           List<DmaAppUser> dmaAppUsers = dmaAppUserMapper.getAppUsers(shareAppsVO);
        PageInfo<DmaAppUser> pageInfo = new PageInfo<DmaAppUser>(dmaAppUsers);

        Page page = new Page();
        page.setData(dmaAppUsers);
        //这里注意下,正常情况下,只需要上一页下一页的话,就不用PageInfo,info主要用于获取总页数了。PageHelper自带的类
        page.setTotal(pageInfo.getTotal()); 
        return page;
    }
TYPESCRIPT 复制 全屏

注意: PageHelper.startPage(shareAppsVO.getCurrentPage(), shareAppsVO.getPageSize()); 需要放到执行mybatis代码前一页,否则会有问题,网上也有解决该问题的方案,该场景没碰到就不测试了。

springboot打war包

问题描述

因springboot默认的打包方式为jar,需要通过java -jar test.jar来完成部署,而一般服务器是要采用tomcat或者weblogic等web容器进行部署的,需要将jar改成打war包

解决方案

其实改成war包只需要更改几个地方的配置就行了,也比较简单。

1.更改pom.xml文件

一般多模块开发的话,就web下面的pom.xml

   <packaging>war</packaging>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>8</source>
                <target>8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

2.更改启动类Application即可

@SpringBootApplication
public class Application extends SpringBootServletInitializer {
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
		return application.sources(Application.class);
	}

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

springboot不加载mapper文件问题解析

1. 场景描述

启动的时候报”springboot available: expected at least 1 bean which qualifies as autowire candidate“。

2. 解决方案

该错误一眼看过去,简单说就是bean无效,无法注入,使用的@Autowired或者@Resource注入bean有问题。

才想起来昨天从其他地方新加入一个mapper文件,为了区分现在的mapper,就单独放到一个文件夹里了。

2.1 问题定位

(1)首先确认新建文件夹是否启动类Application在同级或者下级目录,检查后发现在,那为什么没有加载?

(2)然后检查了启动类上的标签:@SpringBootApplication

看了下@SpringBootApplication源码,其中@ComponentScan就是扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。

但是我们使用的mybatis-genarator自动生成的Mapper和mapper.xml,是没有用@Repository标签,我们使用的mapperLocations的方式指定包加载进来的,所以说新加的文件夹是里面的mapper文件是不会自动加入到IOC容器的。

2.2 问题解决

在启动类上新增标签@MapperScan("com.laowang.newmapper")或者使用mapperLocations,将新的mapper文件夹加入进来就会自动扫描到IOC中了。

 

posted @ 2021-03-11 21:12  hanease  阅读(80)  评论(0编辑  收藏  举报