天天看點

SpringBoot+Mybatis實作通過實體類生成資料庫表

借鑒部落格springboot通過mybatis的插件實作自動建立或更新表做了一點注釋

今天從碼雲上clone了一個項目想看一下,發現源碼中沒有提供對應的sql檔案,隻好自己通過插件生成對應的資料庫表

通過各種排坑終于實作,以作記錄

demo的目錄結構

SpringBoot+Mybatis實作通過實體類生成資料庫表

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.5.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.tao</groupId>
    <artifactId>book</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>book</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
<!--        spring boot 核心依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

<!--        lombok支援-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
<!--      測試子產品-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

<!--        mybatis依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
<!--        這個是生成資料庫表的核心依賴-->
        <dependency>
            <groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
            <artifactId>mybatis-enhance-actable</artifactId>
            <version>1.0.1</version>
        </dependency>
<!--        資料庫驅動-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--        資料庫連接配接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>

        <!--以下兩個類需要加入,否則報錯無法注入-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
            <exclusions>
                <exclusion>
                    <artifactId>commons-logging</artifactId>
                    <groupId>commons-logging</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
           

application.properties

資料庫的資訊需要按照實際情況修改

# 資料庫連接配接、資料源配置
spring.datasource.url=jdbc:mysql://localhost:3306/boot_nbbook?&characterEncoding=UTF-8&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.test-on-borrow=true
spring.datasource.druid.stat-view-servlet.allow=true

#用于生成資料庫表的mybatis配置
#當mybatis.table.auto=create時,系統啟動後,會将所有的表删除掉,然後根據model中配置的結構重建立表,該操作會破壞原有資料。
#當mybatis.table.auto=update時,系統會自動判斷哪些表是建立的,哪些字段要修改類型等,哪些字段要删除,哪些字段要新增,該操作不會破壞原有資料。
#當mybatis.table.auto=none時,系統不做任何處理。
mybatis.table.auto=update
mybatis.model.pack=com.tao.book.entity
mybatis.database.type=mysql
           

編寫配置類

1、TestConfig

package com.tao.book.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration
@ComponentScan(basePackages = {"com.gitee.sunchenbin.mybatis.actable.manager.*"})
public class TestConfig {

    @Value("${spring.datasource.driver-class-name}")
    private String driver;

    @Value("${spring.datasource.url}")
    private String url;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Bean
    public PropertiesFactoryBean configProperties() throws Exception{
        PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        propertiesFactoryBean.setLocations(resolver.getResources("classpath*:application.properties"));
        return propertiesFactoryBean;
    }

    @Bean
    public DruidDataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setMaxActive(30);
        dataSource.setInitialSize(10);
        dataSource.setValidationQuery("SELECT 1");
        dataSource.setTestOnBorrow(true);
        return dataSource;
    }

    @Bean
    public DataSourceTransactionManager dataSourceTransactionManager() {
        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(dataSource());
        return dataSourceTransactionManager;
    }

    // com.tao.book.entity.* 需要換成自己項目中實體類的包名
    @Bean
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource());
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml"));
        sqlSessionFactoryBean.setTypeAliasesPackage("com.tao.book.entity.*");
        return sqlSessionFactoryBean;
    }

}
           

2、MyBatisMapperScannerConfig

package com.tao.book.config;

import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@AutoConfigureAfter(TestConfig.class)
public class MyBatisMapperScannerConfig {

    //com.tao.book.mapper.* 需要換成自己項目中持久層的路徑
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() throws Exception{
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.tao.book.mapper.*;com.gitee.sunchenbin.mybatis.actable.dao.*");
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        return mapperScannerConfigurer;
    }

}
           

編寫實體類

@Table(name = "book_info")和@Column(name="book_id") 中name的值分别對應資料庫的表名和字段名      
package com.tao.book.entity;

import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
import com.gitee.sunchenbin.mybatis.actable.command.BaseModel;
import com.gitee.sunchenbin.mybatis.actable.constants.MySqlTypeConstant;
import lombok.*;

import java.math.BigDecimal;
import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
@Table(name = "book_info")
public class BookInfo extends BaseModel {
    @Column(name="book_id", type= MySqlTypeConstant.INT, isKey = true,isAutoIncrement = true)
    private Integer bookId;

    @Column(name="book_isbn",type = MySqlTypeConstant.VARCHAR)
    private String bookIsbn;

    @Column(name="book_name",type = MySqlTypeConstant.VARCHAR)
    private String bookName;

    @Column(name="book_author",type = MySqlTypeConstant.VARCHAR)
    private String bookAuthor;

    @Column(name="book_publish",type = MySqlTypeConstant.VARCHAR)
    private String bookPublish;

    @Column(name="book_state",type = MySqlTypeConstant.INT)
    private Integer bookState;

    @Column(name="book_type",type = MySqlTypeConstant.INT)
    private Integer bookType;


    @Column(name="book_create_time",type = MySqlTypeConstant.DATETIME)
    private Date bookCreateTime;

    @Column(name="book_last_modify_time",type = MySqlTypeConstant.DATETIME)
    private Date bookLastModifyTime;

    @Column(name="book_introduction",type = MySqlTypeConstant.VARCHAR)
    private String bookIntroduction;

    @Column(name="types",type = MySqlTypeConstant.VARCHAR)
    private String types;

}
           

運作項目

日志中會顯示如圖字樣

SpringBoot+Mybatis實作通過實體類生成資料庫表

日志記錄已建立對應的資料庫表

檢視結果

SpringBoot+Mybatis實作通過實體類生成資料庫表