天天看點

[Mybatis] 根據實體類建立資料庫

生成資料庫

  • ​​pom檔案​​
  • ​​Spring配置檔案​​
  • ​​配置檔案​​
  • ​​實體類​​
  • ​​運作結果​​

首先說一下,研究這個的契機是什麼,今天剛從github上clone下來一個項目,想跑一下,結果發現沒有sql,而這個開源項目又已經很久沒更新了,也不太好找維護者,是以,沒有辦法,隻能想辦法自己建立資料庫,而當我看到成堆的實體類時,,emmm,算了,找個簡單的辦法吧。

​ 是以,就找到了這個jar包 ​

​mybatis-enhance-actable​

那麼就開始實戰吧。

pom檔案

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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.0.1</version>
        </dependency>

    <!-- 生成資料庫 -->
        <dependency>
            <groupId>com.gitee.sunchenbin.mybatis.actable</groupId>
            <artifactId>mybatis-enhance-actable</artifactId>
            <version>1.4.1.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.18</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.22</version>
        </dependency>

    </dependencies>      

Spring配置檔案

​ 首先是配置sql資訊的配置類​

​MyTableConfig.java​

package com.yeafel.evaluation.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 MyTableConfig {
  // mysql所有的配置來自第二章,配置檔案
    @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 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;
    }

  /**
  *   
  */
    @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.yeafel.evaluation.dataobject.entity.*");
        //上述classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml固定的包路徑
        //com.xxx.xxx.entity.*替換成你的實體類位址
        return sqlSessionFactoryBean;
    }
}      
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(MyTableConfig.class)//上面第一點配置檔案類
public class MyBatisMapperScannerConfig {

    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() throws Exception{
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
            mapperScannerConfigurer.setBasePackage("com.yeafel.evaluation.dataobjet.mapper.*;com.gitee.sunchenbin.mybatis.actable.dao.*");
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        //com.xxx.xxx.mapper.*替換成你的mapper位址
        //com.gitee.sunchenbin.mybatis.actable.dao.*固定的包
        return mapperScannerConfigurer;
    }

}      

上述配置類中,主要注意的就是兩個類中的entity和mapper位址,尤其是mapper位址,隻傳*mapper.java的位置就可以。

配置檔案

配置類中用到的配置,直接放在預設的​

​application.yml​

​中即可

# mysql 配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    url: jdbc:mysql://localhost:3307/eval_teac?characterEncoding=utf-8&useSSL=false
# mybatis 生成資料庫配置
mybatis:
  table:
    auto: update
  model:
    pack: com.**.**.entity // 你的實體類路徑
  database:
    type: mysql      

mysql的配置是普通的mysql标準配置,不做解釋,那麼詳細說一下mybatis的配置。

​mybatis.table.auto=update​

​自動生成表的方式,其中包含:

update: 每次加載hibernate時根據實體類生成資料庫,并且參數屬性更新時,表中的屬性會同步更新,但是不會覆寫表(不會删除原資料)
create: 每次加載hibernate時根據實體類生成資料庫,并且會删除原表重建新表
none: 不做任何操作
add: 隻對新增做處理,不會更新原有資料      

​mybatis.model.pack=com.**.**.entity​

​實體類的路徑,如項目在java下有com.exccedy.test.entity,那麼這裡就要替換為上述路徑,該配置的作用時指明實體類的位置,加載時進行加載,同時需要注意,實體類中也需要做配置,配置稍後在實體類代碼時标注。

​mybatis.database.type=mysql​

​表明要建立的是什麼類型的資料庫,還有很多可以選擇,這裡簡單說一下,畢竟是以mysql為主的文章。

oracle
sqlserver
postgresql
mysql      

實體類

實體類主要是注解的配置

import com.gitee.sunchenbin.mybatis.actable.annotation.IsAutoIncrement;
import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
import com.gitee.sunchenbin.mybatis.actable.annotation.Table;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Table(name = "test")
@Data // lombok
public class Test{

  
    @Column(name="action_id",type=MySqlTypeConstant.BIGINT, length = 11, isKey = true, isAutoIncrement = true,isNull = false)
    private Long actionRoleId;

    /** 角色id */
    private Long roleId;

    /** 功能id */
    private Long actionId;
}      

這是第一種使用方式,是比較直覺的。那麼說一下配置的含義。

  • @Table 表明這是需要掃描的類,并生成name中的表,如name=“test”,那麼就會生成test的資料庫表。
  • @Column 顯而易見這是列,其中的參數有很多,就不一一列舉,隻說一下文中用到。
  • name 列名
  • type 參數類型
  • length 參數長度,預設255
  • isKey 是否是主鍵,預設false
  • isAutoIncrement 是否自增,預設false
  • isNull 是否為空,預設true

還有第二種方式,注解拆分

import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
import com.gitee.sunchenbin.mybatis.actable.annotation.ColumnType;
import com.gitee.sunchenbin.mybatis.actable.annotation.IsAutoIncrement;
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 javax.persistence.Id;
import java.util.Date;

/**
 * 第二種定義方式,使用@Table和@Column定義字段,具體内容用具體注解定義
 * 例如@Id,@IsNotNull,@isAutoIncrement等等
 * 如果沒有設定name,會直接把變量名按照駝峰規則轉換,如果沒有設定類型也會自動轉換Java的類型到SQL類型
 *
 */
@Table(name = "test1")
public class Test1 extends BaseModel {

    @Id
    @IsAutoIncrement
    @Column
    private Integer    id;
  
    @Column
    private String name;
  
    @Column
    @ColumnType(value = MySqlTypeConstant.VARCHAR, length=11)
    private String address;
}      
  • @Column 表明是列
  • @ColumnType 表明參數類型,不使用後自動加載,
  • value 類型
  • length 長度,預設255

第三種方式,是最簡單的方式,全部交給自動加載,自動加載會更佳駝峰規則轉換

import com.gitee.sunchenbin.mybatis.actable.annotation.IsAutoIncrement;
import com.gitee.sunchenbin.mybatis.actable.annotation.IsKey;
import com.gitee.sunchenbin.mybatis.actable.annotation.Table;

/**
 * 第三種定義方式,懶人定義,按照駝峰規則轉換
 * 不需要對每個字段設定@Column
 * 這裡沒有繼承BaseModel,因為BaseModel離有OrderBy等參數,也會對其進行建構字段
 *
 * @author 徐森威
 * @date 2020/12/24
 */

@Table(isSimple = true)
public class UserLogin {

   @IsKey
   @IsAutoIncrement
   private Integer    id;

   private String name;

   private String type;
}      

運作結果

日志列印如下,即為成功

[Mybatis] 根據實體類建立資料庫

同時觀察資料庫

[Mybatis] 根據實體類建立資料庫