当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Mybatis如何自动生成数据库表结构总结

    栏目:Linux/apache问题 时间:2019-11-05 10:13

    一般情况下,用Mybatis的时候是先设计表结构再进行实体类以及映射文件编写的,特别是用代码生成器的时候。

    但有时候不想用代码生成器,也不想定义表结构,那怎么办?

    这个时候就会想到Hibernate,然后想到它的hibernate.hbm2ddl.auto配置项。

    所以手工创表的问题可以很方便的迅速用Hibernate来解决。 那有人问啦:就是不想用Hibernate才换的Mybatis,你这又兜回去了吗?

    其实不是的,我们需要的就是单单一个hbm2ddl功能。

    其实应该这么想:有一款工具能够自动根据注解的实体类来生成各种数据库相应的表结构,只需要加几个jar包  (经测试后只要7个)并且 少量配置(3个配置项)

    这款工具就是Hibernate。为什么不能是它呢!!!

    原理说来也是超级的简单:   加入hibernate的包, 注解实体类,程序开始时初始化一下hibernate的SessionFactory并清除它。

    示例:

    需要的Hibernate相关的JAR包 (本例基于Hibernate5.0.7,仅需要7个):

              hibernate-core-5.0.7.Final.jar

              hibernate-commons-annotations-5.0.1.Final.jar

              hibernate-jpa-2.1-api-1.0.0.Final.jar

              geronimo-jta_1.1_spec-1.1.1.jar

              jboss-logging-3.3.0.Final.jar

              dom4j-1.6.1.jar

              javassist-3.18.1-GA.jar

    Hibernate.cfg.xml文件:(去掉多余的,精简后的内容)

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
     <session-factory>
      <!--不采用InnoDB方式加快速度 -->
      <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
    
      <!-- 注意update方式时对于属性的删减并不会删除数据库字段 -->
      <property name="hibernate.hbm2ddl.auto">update</property>
    
      <!-- 注意注解的话,只能用class一个一个引用。除非与Spring整合才能扫描文件夹路径 -->
      <mapping class="com.sunwii.mybatis.bean.User" />
     </session-factory>
    </hibernate-configuration>

    注解的实体类:

    @Entity
    @Table(name = "t_user")
    @Data
    @NoArgsConstructor
    @ToString
    public class User implements Serializable {
     private static final long serialVersionUID = -4013951528313410972L;
    
     @Id
     @GeneratedValue(strategy = GenerationType.IDENTITY)
     @Column(name = "id")
     private Integer id;
    
     @Column(length = 30)
     private String name;
    
     @Column
     private Float height;
    
     @Column
     private Double salary;
    
     @Column
     private Integer vip;
    
     @Column
     @Temporal(TemporalType.DATE)
     private Date birthday;
    
     @Column
     @Temporal(TemporalType.TIMESTAMP)
     private Date lastlogin;
    
     @Column
     @Enumerated(EnumType.STRING)
     // mybatis 默认会将枚举转化为字符串类型存储,此时数据库为varchar型
     private State state;
     
     @Column
     @Enumerated(EnumType.ORDINAL)
     // 可以为mybatis设置枚举类型存储为其索引值存储,此时数据库为int型
     private Level level;
    
     @Column(length = 10)
     @Enumerated(EnumType.ORDINAL)
     // mybatis 自定义类型转换器将枚举转化为相应数字类型存储,此时数据库为int型
     private Sex sex;
     
     @Column
     @Type(type = "string")
     // mybatis 自定义类型转换器将列表转化为相应字符串类型存储,此时数据库为varchar型
     private List<String> tels;
     
    
     public User(int id) {
      super();
      this.id = id;
     }
    
     public User(int id, String name) {
      super();
      this.id = id;
      this.name = name;
     }
    
     public User(String name) {
      super();
      this.name = name;
     }
    }