天天看点

[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] 根据实体类创建数据库