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

   日期:2020-07-10     浏览:108    评论:0    
核心提示:springboot+mybatis通过实体类自动生成数据库表前言本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表。首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis.spring.boot mybatis-spring-boot-starter

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

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

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

    <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>
    
  • 添加数据库配置文件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//你实体类的路径

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

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

  1. 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固定的包路径
            //com.xxx.xxx.entity.*替换成你的实体类地址
            return sqlSessionFactoryBean;
        }
    }
    
  2. 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方法
    }
    
  • 运行项目

  1. 会控制台会显示说新建表完成
    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.www.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.www.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.www.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-08 11:02:12.937  INFO 48536 --- [           main] o.a.coyote.http11.Http11NioProtocol      : 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.www.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 port(s): 8910 (http) with context path ''
    2020-07-08 11:02:14.851  INFO 48536 --- [           main] com.qiaoyuantest.www.WwwApplication      : Started WwwApplication in 4.162 seconds (JVM running for 4.863)
    


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

    新建表就这样完成。

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

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

    <!--以下两个类需要加入,否则报错无法注入-->
    	<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>
    
  • 如需要项目源码或者对代码有疑问的评论留言,下期会动手实现mybatis plus内嵌的CRUD自动增删改查
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服