springboot+mybatis通过实体类自动生成数据库表的方法

网友投稿 543 2022-12-01


springboot+mybatis通过实体类自动生成数据库表的方法

前言

本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表。

首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.0

com.gitee.sunchenbin.mybatis.actable

mybatis-enhance-actable

1.0.1

mysql

mysql-connector-java

runtime

com.alibaba

druid-spring-boot-starter

1.1.10

org.apache.commons

commons-lang3

3.4

net.sf.json-lib

json-lib

2.4

jdk15

commons-logging

commons-logging

添加数据库配置文件application.properties

application.properties这里是单独配置mybatis自动建表的相关信息。

mybatis.table.auto=update

mybatis.model.pack=com.xxx.xxx.entity//实体类的路径

mybatis.database.type=mysql

mybatis.table.auto=

create:

每次加载hibernate会自动创建表,以后启动会覆盖之前的表,所以这个值基本不用,严重会导致的数据的丢失。

create-drop :

每次加载hibernate时根据model类生成表,但是sessionFactory一关闭,表就自动删除,下一次启动会重新创建。

update:

加载hibernate时根据实体类model创建数据库表,这是表名的依据是@Entity注解的值或者@Table注解的值,sessionFactory关闭表不会删除,且下一次启动会根据实体。

model:

更新结构或者有新的实体类会创建新的表。

validate:

启动时验证表的结构,不会创建表 none:启动时不做任何操作

mybatis.model.pack=com.xxx.xxx.entity//你实体类的路径

个人项目配置文件,非统一,根据项目需求配置

进行生成数据库表相关配置

TestConfig配置文件

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.druid.driver-class-name}")

private String driver;

//连接数据库配置文件的地址,具体查阅配置文件的结构

@Value("${spring.datasource.druid.url}")

private String url;

//连接数据库配置文件的地址,具体查阅配置文件的结构

@Value("${spring.datasource.druid.username}")

private String username;

//连接数据库配置文件的地址,具体查阅配置文件的结构

@Value("${spring.datasource.druid.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"));//classpath*:application.properties是mybatis的生成表配置文件

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;

}

@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.xxx.xxx.entity.*");

//上述classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml固定的包路径

//com.xxx.xxx.entity.*替换成你的实体类地址

return sqlSessionFactoryBean;

}

}

MyBatisMapperScannerConfig配置文件

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 {

@Bean

public MapperScannerConfigurer mapperScannerConfigurer() throws Exception{

MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();

mapperScannerConfigurer.setBasePackage("com.xxx.xxx.mapper.*;com.gitee.sunchenbin.mybatis.actable.dao.*");

mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");

//com.xxx.xxx.mapper.*替换成你的mapper地址

//com.gitee.sunchenbin.mybatis.actable.dao.*固定的包

return mapperScannerConfigurer;

}

}

新建实体进行测试

注:@Table(name = “”)及@Column(name = “id”)注解使用,实体类继承BaseModel。

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;

@Table(name = "em_t")//新建表数据库表名

public class EmpAttr extends BaseModel{

private static final long serialVersionUID = 5199244153134426433L;

@Column(name = "id",type = MySqlTypeConstant.INT,length = 11,isKey = true,isAutoIncrement = true)

private String id;

@Column(name="ename",type= MySqlTypeConstant.VARCHAR)

private String ename;

@Column(name="sal",type= MySqlTypeConstant.VARCHAR)

private String sal;

@Column(name="job",type= MySqlTypeConstant.VARCHAR)

private String job;

//...省略get,set方法

}

运行项目

会控制台会显示说新建表完成

2020-07-08 11:02:13.895 INFO 48536 — [ main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 开始创建表:em_t

2020-07-08 11:02:13.983 INFO 48536 — [ main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 完成创建表:em_t

. ____ _ __ _ _

/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \

( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \

\\/ ___)| |_)| | | | | || (_| | ) ) ) )

' |____| .__|_| |_|_| |_\__, | / / / /

=========|_|==============|___/=/_/_/_/

:: Spring Boot :: (v2.1.8.RELEASE)

2020-07-08 11:02:11.264 INFO 48536 --- [ main] com.qiaoyuantest.WwwApplication : Starting WwwApplication on DD-HP with PID 48536 (E:\mysoft\kaifasoft\kaifa_code\idea\myiperf_springboot\target\classes started by DD in E:\mysoft\kaifasoft\kaifa_code\idea\myiperf_springboot)

2020-07-08 11:02:11.266 INFO 48536 --- [ main] com.qiaoyuantest.WwwApplication : The following profiles are active: prod

2020-07-08 11:02:12.207 INFO 48536 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!

2020-07-08 11:02:12.208 INFO 48536 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.

2020-07-08 11:02:12.228 INFO 48536 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 10ms. Found 0 repository interfaces.

2020-07-08 11:02:12.301 INFO 48536 --- [ main] o.s.c.a.ConfigurationClassPostProcessor : Cannot enhance @Configuration bean definition 'myBatisMapperScannerConfig' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static'.

2020-07-08 11:02:12.522 INFO 48536 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$54b62352] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2020-07-08 11:02:12.613 INFO 48536 --- [ main] trationDelegate$BeanPostProcessorChecker : Bean 'redisConfiguration' of type [com.qiaoyuantest.config.RedisConfiguration$$EnhancerBySpringCGLIB$$9518fca7] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)

2020-07-08 11:02:12.651 ERROR 48536 --- [ main] o.a.catalina.core.AprLifecycleListener : An incompatible version [1.2.7] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

2020-07-08 11:02:12.808 ERROR 48536 --- [ main] o.a.catalina.core.AprLifecycleListener : An incompatible version [1.2.7] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

2020-07-08 11:02:12.927 INFO 48536 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8910 (http)

2020-07-08 11:02:12.937 ERROR 48536 --- [ main] o.a.catalina.core.AprLifecycleListener : An incompatible version [1.2.7] of the APR based Apache Tomcat Native library is installed, while Tomcat requires version [1.2.14]

2020-07-08http:// 11:02:12.937 INFO 48536 --- [ main] o.a.coyote.http11.Http11NioProtctszIIdDocol : Initializing ProtocolHandler ["http-nio-8910"]

2020-07-08 11:02:12.944 INFO 48536 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]

2020-07-08 11:02:12.944 INFO 48536 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.24]

2020-07-08 11:02:13.035 INFO 48536 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext

2020-07-08 11:02:13.036 INFO 48536 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1732 ms

2020-07-08 11:02:13.623 INFO 48536 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'

2020-07-08 11:02:13.676 INFO 48536 --- [ main] c.g.s.m.a.m.handler.StartUpHandlerImpl : databaseType=mysql,开始执行mysql的处理方法

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

2020-07-08 11:02:13.829 INFO 48536 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited

file类型的扫描

2020-07-08 11:02:13.895 INFO 48536 --- [ main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 开始创建表:em_t

2020-07-08 11:02:13.983 INFO 48536 --- [ main] s.m.a.m.s.SysMysqlCreateTableManagerImpl : 完成创建表:em_t

2020-07-08 11:02:14.002 INFO 48536 --- [ main] c.q.config.RedisConfiguration : 自定义RedisCacheManager加载完成

2020-07-08 11:02:14.826 INFO 48536 --- [ main] o.a.coyote.http11.Http11NioProtocol : Starting ProtocolHandler ["http-nio-8910"]

2020-07-08 11:02:14.849 INFO 48536 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on ctszIIdDport(s): 8910 (http) with context path ''

2020-07-08 11:02:14.851 INFO 48536 --- [ main] com.qiaoyuantest.WwwApplication : Started WwwApplication in 4.162 seconds (JVM running for 4.863)

此时查看一下数据库表会发现新建有em_t表

新建表就这样完成。

如出现

Error creating bean with name ‘startUpHandlerImpl': Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/lang/ArrayUtils错误

说明pom缺省包或者包不正确

org.apache.commons

commons-lang3

3.4

net.sf.json-lib

json-lib

2.4

jdk15

commons-logging

commons-logging

如需要项目源码或者对代码有疑问的评论留言,下期会动手实现mybatis plus内嵌的CRUD自动增删改查


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:idea输入sout无法自动补全System.out.println()的问题
下一篇:IDEA 去除 mybatis.xml 文件黄色警告的图文教程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~