SpringBoot集成sqlite,并用集成tk做baseservice封装

项目是用来做爬虫的,springboot项目,集成了mybatis、sqllite已经tkmapper,并简单封装了basemapper和baseservice,方便快速。

1. pom

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.cdchen.crawler</groupId>
	<artifactId>crawler</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<name>crawler</name>
	<description>crawler</description>

	<properties>
		<selenium.version>3.4.0</selenium.version>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<commons-io.version>2.4</commons-io.version>
		<poi.version>3.10-FINAL</poi.version>
		<mybatis.springboot.starter>1.3.0</mybatis.springboot.starter>
		<druid.version>1.1.2</druid.version>
		<mybatis.generator.version>1.3.5</mybatis.generator.version>
		<pagehelper.version>1.1.1</pagehelper.version>
		<swagger.ui.version>2.7.0</swagger.ui.version>
		<easy-poi-version>3.0.1</easy-poi-version>
	</properties>

	<dependencies>
		<!-- 使用sqllite作为数据库 -->
		<dependency>
			<groupId>org.xerial</groupId>
			<artifactId>sqlite-jdbc</artifactId>
			<version>3.21.0.1</version>
		</dependency>
		<!-- 爬虫jar -->
		<dependency>
			<groupId>org.seleniumhq.selenium</groupId>
			<artifactId>selenium-java</artifactId>
		</dependency>
		<!-- 验证码 -->
		<dependency>
			<groupId>net.java.dev.jna</groupId>
			<artifactId>jna</artifactId>
			<version>4.1.0</version>
		</dependency>

		<dependency>
			<groupId>net.sourceforge.tess4j</groupId>
			<artifactId>tess4j</artifactId>
			<version>3.4.0</version>
			<exclusions>
				<exclusion>
					<groupId>com.sun.jna</groupId>
					<artifactId>jna</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>${commons-io.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>${poi.version}</version>
		</dependency>

		<!--分页插件-->
		<dependency>
			<groupId>com.github.pagehelper</groupId>
			<artifactId>pagehelper-spring-boot-starter</artifactId>
			<version>${pagehelper.version}</version>
		</dependency>
		<!--Swagger2-->
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>${swagger.ui.version}</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>${swagger.ui.version}</version>
		</dependency>
		<!--第三方 swagger2 ui-->
		<dependency>
			<groupId>com.drore.cloud</groupId>
			<artifactId>swagger-bootstrap-ui</artifactId>
			<version>1.0</version>
		</dependency>
		<!-- mybatis-plus begin -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		<dependency>
			<groupId>tk.mybatis</groupId>
			<artifactId>mapper-spring-boot-starter</artifactId>
			<version>1.2.4</version>
		</dependency>
		<!-- mybatis-plus end -->
		<!--Gson-->
		<dependency>
			<groupId>com.google.code.gson</groupId>
			<artifactId>gson</artifactId>
			<version>2.8.1</version>
		</dependency>
		<!--Gson end-->
		<!--Excel导入导出相关START-->
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-base</artifactId>
			<version>${easy-poi-version}</version>
		</dependency>
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-web</artifactId>
			<version>${easy-poi-version}</version>
		</dependency>
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-annotation</artifactId>
			<version>${easy-poi-version}</version>
		</dependency>
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.6</version>
		</dependency>

		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>
		<!--Excel导入导出相关END-->
		<!--工具类-->
		<dependency>
			<groupId>com.xiaoleilu</groupId>
			<artifactId>hutool-all</artifactId>
			<version>3.1.1</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.18</version>
		</dependency>
		<dependency>
			<groupId>com.github.nintha</groupId>
			<artifactId>webp-imageio-core</artifactId>
			<version>0.4.2</version>
			<scope>system</scope>
			<systemPath>${project.basedir}/lib/webp-imageio-0.4.2.jar</systemPath>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.33</version>
		</dependency>
		<dependency>
			<groupId>javax.persistence</groupId>
			<artifactId>persistence-api</artifactId>
			<version>1.0</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!--mybatis 逆向工程插件-->
			<plugin>
				<groupId>org.mybatis.generator</groupId>
				<artifactId>mybatis-generator-maven-plugin</artifactId>
				<version>${mybatis.generator.version}</version>
				<configuration>
					<verbose>true</verbose>
					<overwrite>true</overwrite>
					<configurationFile>src/main/resources/generateConfig.xml</configurationFile>
				</configuration>
			</plugin>
		</plugins>
	</build>


</project>

2. 配置文件

## 数据源
spring.datasource.driver-class-name=org.sqlite.JDBC
spring.datasource.url=jdbc:sqlite:D:/crawler-plugin/my.s3db
spring.datasource.username=root
spring.datasource.password=root

##mybatis xml路径
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis-plus.mapper-locations=classpath:mapper/*.xml

3. 配置类


import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.sqlite.SQLiteDataSource;

import javax.sql.DataSource;

@Configuration
public class MyBatisConfig {
    @Autowired
    private DataSourceProperties dataSourceProperties;
    @Bean(name="dataSource")
    public DataSource dataSource() {
        SQLiteDataSource dataSource = new SQLiteDataSource();
        dataSource.setUrl(dataSourceProperties.getUrl());
        return dataSource;
    }

    public SqlSessionFactory sqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        return sqlSessionFactoryBean.getObject();
    }

}

3. 主类启动时配置mapperscan

这里的MapperScan 需要使用tkmapper jar包的,不要用错了

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import tk.mybatis.spring.annotation.MapperScan;

@SpringBootApplication
@MapperScan("com.cdchen.crawler.mapper")
public class Application extends WebMvcConfigurerAdapter{

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

	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
		registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
		registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
		super.addResourceHandlers(registry);
	}
}

4. BaseService

import com.cdchen.crawler.param.Query;
import com.cdchen.crawler.response.TableResultResponse;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;

import java.lang.reflect.ParameterizedType;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

public abstract class BaseService<M extends Mapper<T>, T> {
    @Autowired
    protected M mapper;

    public void setMapper(M mapper) {
        this.mapper = mapper;
    }

    /**
     * 返回单个对象
     * @param entity
     * @return
     */
    public T selectOne(T entity) {
        return mapper.selectOne(entity);
    }

    /**
     * 根据主键进行查询,必须保证结果唯一
     * 单个字段做主键时,可以直接写主键的值
     * 联合主键时,key可以是实体类,也可以是Map
     * @param id
     * @return
     */
    public T selectById(Object id) {
        return mapper.selectByPrimaryKey(id);
    }


    public List<T> selectList(T entity) {
        return mapper.select(entity);
    }

    /**
     * 查询所有记录
     * @return
     */
    public List<T> selectListAll() {
        return mapper.selectAll();
    }


    public Long selectCount(T entity) {
        return new Long(mapper.selectCount(entity));
    }

    /*插入一条数据 null的属性也会保存
       *支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
       *优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
       *
       **/
    public void insert(T entity) {
        // EntityUtils.setCreatAndUpdatInfo(entity);
        mapper.insert(entity);
    }

    /**
     *插入一条数据 null的属性不会保存
     *只插入不为null的字段,不会影响有默认值的字段
     *支持Oracle序列,UUID,类似Mysql的INDENTITY自动增长(自动回写)
     *优先使用传入的参数值,参数值空时,才会使用序列、UUID,自动增长
     */
    public T insertSelective(T entity) {
        // EntityUtils.setCreatAndUpdatInfo(entity);
        mapper.insertSelective(entity);
        return entity;
    }

    /**
     * 根据实体类中字段不为null的条件进行删除,条件全部使用=号and条件
     * @param entity
     * @return
     */
    public void delete(T entity) {
        mapper.delete(entity);
    }

    /**
     *通过主键进行删除,这里最多只会删除一条数据
     *单个字段做主键时,可以直接写主键的值
     *联合主键时,key可以是实体类,也可以是Map
     *
     */
    public void deleteById(Object id) {
        mapper.deleteByPrimaryKey(id);
    }

    /**
     * 根据主键id批量删除
     * @param ids
     * @return
     */
    public void deleteBatchIds(String[] ids){
        if(ids!=null && ids.length>0){
            List<String> idList= Arrays.asList(ids);
            for(String id:idList){
                mapper.deleteByPrimaryKey(Long.valueOf(id));
            }
        }
    }

    /**
     * 根据主键进行更新,这里最多只会更新一条数据
     * 参数为实体类
     */
    public int updateById(T entity) {
        // EntityUtils.setUpdatedInfo(entity);
        return mapper.updateByPrimaryKey(entity);
    }

    /**
     * 根据主键进行更新
     * 只会更新不是null的数据
     */
    public int updateSelectiveById(T entity) {
        // EntityUtils.setUpdatedInfo(entity);
        return mapper.updateByPrimaryKeySelective(entity);
    }


    public List<T> selectByExample(Object example) {
        return mapper.selectByExample(example);
    }

    public int selectCountByExample(Object example) {
        return mapper.selectCountByExample(example);
    }

    public TableResultResponse<T> selectByQuery(Query query) {
        Class<T> clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1];
        Example example = new Example(clazz);
        if(query.entrySet().size()>0) {
            Example.Criteria criteria = example.createCriteria();
            for (Map.Entry<String, Object> entry : query.entrySet()) {
                criteria.andLike(entry.getKey(), "%" + entry.getValue().toString() + "%");
            }
        }
        Page<Object> result = PageHelper.startPage(query.getPage(), query.getLimit());
        List<T> list = mapper.selectByExample(example);
        return new TableResultResponse<T>(result.getTotal(), list);
    }
}

5. 设置实体类自增Id key generator

因为sqllite插入插入的Id的语法不同,所以在需要插入后获取Id时,需要配置Id的generator


import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 *
 * @description: 目标网站
 *
 * @author: cdchen
 *
 * @create: 2019-05-08 10:48
 **/
@Table(name="target")
@Data
public class Target {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY,generator = "SELECT LAST_INSERT_ROWID()")
    private Integer id;
    private String name;
    private String indexUrl;
}

6. 使用示例

service

@Component
@Slf4j
public class TargetService extends BaseService<TargetMapper,Target>{
    @Autowired
    private  TargetMapper targetMapper;

    public Target getTarget(){
        Target target = targetMapper.selectByName(Constant.qiushibaikeName);
        if(target == null){
            log.info("=====> 初始化target");
            target = new Target();
            target.setIndexUrl(Constant.qiushibaikeIndexUrl);
            target.setName(Constant.qiushibaikeName);
            this.insertSelective(target);
        }
        return target;
    }
}

mapper

import com.cdchen.crawler.entity.Target;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import tk.mybatis.mapper.common.Mapper;

@Repository
public interface TargetMapper  extends Mapper<Target> {
    // 根据 ID 查询
    Target selectByName(@Param("name") String name);

}

项目放在了gitee上,地址:https://gitee.com/passionday/crawler

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值