背景介绍

由于项目需求,要求能用一款不需要部署,并且可以跨平台使用,并且支持事务管理的关系型数据,我的第一问题就是为啥不能采用类似MySQL或者Oracle这一类的关系型数据库,并且它们的部署其实也不是很繁琐,他们说服务器不需要额外部署数据库,我的第一反映就是SQLite。

至于是JAP或者MyBatis还是什么其他的ORM框架,这些都是无所谓的。

SQLite安装以及生成db库

SpringBoot整合JPA+SQLite_sqlite

由于本人使用的是window环境,具体其他的操作系统,均可按照包名下载,下载完成后,解压到桌面

SpringBoot整合JPA+SQLite_spring_02

进入dos窗口后,输入

C:\Users\xxxxx\Desktop\sqlite-tools-win32-x86-3390400>sqlite3
SQLite version 3.39.4 2022-09-29 15:55:41
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .open demo.db
sqlite>
  • sqlite3 打开SQLite数据库工具(窗口)
  • .open demo.db(生成并打开一个叫demo的db库)在返回sqlite安装包的目录下就会成一个一个db文件

SpringBoot整合JPA+SQLite_spring_03

注意

SQLite一些特性可以研究一下,比如免费开源版本是不支持数据库登录和密码的

db文件不能随便打开,可以通过数据库可视化工具打开,一般工具都是支持的,如果强行打开,里面的数据就GG了

db文件随处使用,只要有驱动均可使用并且实现CRUD

它的亮点是轻量以及便捷,自然和大型关系型数据库相比那就是蚂蚁和大象的区别,不过麻雀虽小,五脏基本齐全,说这个的原因是告诉各位选它的话,可能它的某一些特性是阉割的。


创建SpringBoot项目

具体创建项目过程不说了,直接上代码吧,在创建勾选依赖的时候,只需要勾选一个web就可以了,其他都不需要

POM文件所需要的依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.enigmabridge</groupId>
            <artifactId>hibernate4-sqlite-dialect</artifactId>
            <version>0.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.21.0.1</version>
        </dependency>

其他的基础依赖包就不展示了,比如lombok这些,Junit等等。

配置数据源

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.sqlite.SQLiteDataSource;

import javax.sql.DataSource;


@Configuration
public class DataSourceConfig {
    @Value("${db.url}")
    private String dbUrl;

    @Bean(destroyMethod = "", name = "EmbeddedDataSource")
    public DataSource dataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.sqlite.JDBC");
        dataSourceBuilder.url(dbUrl);
        dataSourceBuilder.type(SQLiteDataSource.class);
        return dataSourceBuilder.build();
    }
}

配置文件中配置DB文件的url

db:
  url: jdbc:sqlite::resource:db/simpleio.db

注意了,看见我的路径的了,:resource 是指在项目工程下的resources下的db文件下的一个db文件

SpringBoot整合JPA+SQLite_sqlite_04

配置JAP

我们这里就不采取yml的配置方式


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

@Configuration
@EnableJpaRepositories(
		// 扫描 Repository 文件 (接口)
        basePackages = Repository 文件 (接口)文件路径,
        transactionManagerRef = "jpaTransactionManager",
        entityManagerFactoryRef = "localContainerEntityManagerFactoryBean"
)
@EnableTransactionManagement
public class JpaConfig {
    @Autowired
    @Bean
    public JpaTransactionManager jpaTransactionManager(@Qualifier(value = "EmbeddedDataSource") DataSource dataSource, EntityManagerFactory entityManagerFactory) {
        JpaTransactionManager jpaTransactionManager
                = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        jpaTransactionManager.setDataSource(dataSource);

        return jpaTransactionManager;
    }

    @Autowired
    @Bean
    LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(@Qualifier(value = "EmbeddedDataSource") DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
                = new LocalContainerEntityManagerFactoryBean();
        localContainerEntityManagerFactoryBean.setDataSource(dataSource);
		// 这里要跟你自己设定的pojo类包路径
        localContainerEntityManagerFactoryBean.setPackagesToScan(pojo类包路径);
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(jpaVendorAdapter);
        return localContainerEntityManagerFactoryBean;
    }

    @Bean
    public JpaVendorAdapter jpaVendorAdapter() {
        HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
        hibernateJpaVendorAdapter.setGenerateDdl(true); // 是否支持ddl
        hibernateJpaVendorAdapter.setShowSql(true); // 是否控制台输入打印执行SQL语句
        hibernateJpaVendorAdapter.setDatabasePlatform("com.enigmabridge.hibernate.dialect.SQLiteDialect");
        return hibernateJpaVendorAdapter;
    }
}

测试效果

创建pojo类


import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.*;
import org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration;

import javax.persistence.*;

/**
 * 账户
 *
 * @author lvxiwei
 * @since 2022-11-11
 */
@Entity
@Table(name = "account")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class Account extends JpaRepositoriesAutoConfiguration {
    /**
     * 自增主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @JsonSerialize(using = ToStringSerializer.class)
    private Long id;
    /**
     * 登录用户名
     */
    private String username;
    /**
     * 登录密码
     */
    private String password;
    /**
     * 用户邮箱
     */
    private String email;
    /**
     * 用户类型 1 系统账户 2 自定义账户
     */
    private Long type;
    /**
     * 用户状态
     */
    private Long status;

    /**
     * 创建人
     */
    private Long creator;

    /**
     * 最近一次修改人
     */
    private Long modifier;

    /**
     * 创建日期
     */
    private Long createDate;
    /**
     * 最近一次修改日期
     */
    private Long modificationDate;

}

创建Repository 接口文件


import com.personloger.model.pojo.Account;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface AccountRepo extends JpaRepository<Account, Long>, JpaSpecificationExecutor {
}

业务层


import com.personloger.dao.AccountRepo;
import com.personloger.model.pojo.Account;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
@Slf4j
public class AccountService {

    @Resource
    private AccountRepo accountRepo;


    public void save() {
        Account account = new Account();
        account.setUsername("admin");
        account.setPassword("123456");
        account.setEmail("louis0523@foxmail.com");
        account.setType(1L);
        account.setStatus(1L);
        account.setCreator(1L);
        account.setModifier(1L);
        account.setCreateDate(System.currentTimeMillis());
        account.setModificationDate(System.currentTimeMillis());
        Account save = accountRepo.save(account);
        System.out.println("==================>" + save.toString());
    }

    public List<Account> getList() {
      return   accountRepo.findAll();
    }
}

建表语句

create table account
(
    id               integer not null
        primary key autoincrement,
    username         TEXT,
    password         TEXT,
    email            TEXT,
    type             integer,
    status           integer,
    createDate       integer,
    modificationDate integer,
    creator          bigint,
    modifier         bigint
);

测试结果展示

SpringBoot整合JPA+SQLite_spring_05