生成資料庫
- 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;
}
運作結果
日志列印如下,即為成功
同時觀察資料庫