新聞中心
本篇文章為大家展示了Mybatis中怎么自動生成數(shù)據(jù)庫表結(jié)構(gòu),內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
專業(yè)從事成都網(wǎng)站設計、成都網(wǎng)站建設、外貿(mào)網(wǎng)站建設,高端網(wǎng)站制作設計,微信小程序開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團隊竭力真誠服務,采用H5場景定制+CSS3前端渲染技術(shù),成都響應式網(wǎng)站建設公司,讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。
一般情況下,用Mybatis的時候是先設計表結(jié)構(gòu)再進行實體類以及映射文件編寫的,特別是用代碼生成器的時候。
但有時候不想用代碼生成器,也不想定義表結(jié)構(gòu),那怎么辦?
這個時候就會想到Hibernate,然后想到它的hibernate.hbm2ddl.auto
配置項。
所以手工創(chuàng)表的問題可以很方便的迅速用Hibernate來解決。 那有人問啦:就是不想用Hibernate才換的Mybatis,你這又兜回去了嗎?
其實不是的,我們需要的就是單單一個hbm2ddl功能。
其實應該這么想:有一款工具能夠自動根據(jù)注解的實體類來生成各種數(shù)據(jù)庫相應的表結(jié)構(gòu),只需要加幾個jar包 (經(jīng)測試后只要7個)并且 少量配置(3個配置項)。
這款工具就是Hibernate。為什么不能是它呢?。?!
原理說來也是超級的簡單: 加入hibernate的包, 注解實體類,程序開始時初始化一下hibernate的SessionFactory并清除它。
示例:
需要的Hibernate相關(guān)的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文件:(去掉多余的,精簡后的內(nèi)容)
注解的實體類:
@Entity@Table(name = "t_user")@Data@NoArgsConstructor@ToStringpublic 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 默認會將枚舉轉(zhuǎn)化為字符串類型存儲,此時數(shù)據(jù)庫為varchar型 private State state; @Column @Enumerated(EnumType.ORDINAL) // 可以為mybatis設置枚舉類型存儲為其索引值存儲,此時數(shù)據(jù)庫為int型 private Level level; @Column(length = 10) @Enumerated(EnumType.ORDINAL) // mybatis 自定義類型轉(zhuǎn)換器將枚舉轉(zhuǎn)化為相應數(shù)字類型存儲,此時數(shù)據(jù)庫為int型 private Sex sex; @Column @Type(type = "string") // mybatis 自定義類型轉(zhuǎn)換器將列表轉(zhuǎn)化為相應字符串類型存儲,此時數(shù)據(jù)庫為varchar型 private List
注意:以上實體類用了Lombok插件來減少代碼量(只要是為了不寫setter/getter、toString等。Lombok插件的使用請參考其它地方。)
@Data
@NoArgsConstructor
@ToString
三個注解屬于Lombok插件注解,分別指示生成SETTER/GETTER、生成無參構(gòu)造器、生成ToString
其它注解都屬于Hibernate(JPA規(guī)范)的注解,生成DDL就靠它們了。
注解-說明:
@Entity@Table(name = "t_user")這里指實體類對應了t_user表@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id")這里指表主健自動增長@Column這里指表字段名稱與屬性同名,它可以另外指定長度,名稱。@Temporal(TemporalType.DATE)這里指表字段采用Date類型存儲@Enumerated(EnumType.STRING)這里指表字段采用varchar類型來存儲枚舉屬性這個簡短示例僅列出簡單的類型的注解,并不涉及表關(guān)聯(lián)之間的注解,幸好的是,注解并不多,更多注解可以參考Hibernate(JPA)注解相關(guān)內(nèi)容。
至此,只需要在使用SqlSessionFactory(Mybatis)之前就構(gòu)造SessionFactory(Hibernate)然后銷毀它就可以了。至于如何初始化Hibernate的SessionFactory,應該都知道。如下:
Mybatis與Spring整合時:簡單地配置一個hibernate的SessionFactory相關(guān)的BEAN了事。這里不談。
Mybatis不與Spring整合時:
Mybatis的工具類中添加新方法,用于自動構(gòu)造DDL:
package com.sunwii.mybatis.util;import java.io.IOException;import java.io.InputStream;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import com.sunwii.mybatis.constant.Constants;public class SessionFactoryUtil { public static SqlSessionFactory creat(String configFile) { SqlSessionFactory factory = null; InputStream inputStream; try { inputStream = Resources.getResourceAsStream(configFile); factory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return factory; } //這里是新方法,通過判斷標記決定是否要用于自動生成DDL public static SqlSessionFactory creat(String configFile, boolean hibernateAutoDdl) { if (hibernateAutoDdl) { String hibernateConfigFile = Constants.Hibernate_LOCATION; // 使用hibernate自動創(chuàng)建DDL HibernateUtil.buildSessionFactory(hibernateConfigFile); } return creat(configFile); }}
其中用到的Hibernate工具類為:
package com.sunwii.mybatis.util;import java.util.Properties;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import com.sunwii.mybatis.constant.Constants;public class HibernateUtil { public static void buildSessionFactory(String hibernateConfigFile) { String jdbcPropertiesLocation = Constants.JDBC_LOCATION; Properties jdbcProperties = PropertiesUtil.loadFromClassPath(jdbcPropertiesLocation); Properties hibernateJdbcProperties = new Properties(); hibernateJdbcProperties.setProperty("hibernate.connection.driver_class", jdbcProperties.getProperty("driver")); hibernateJdbcProperties.setProperty("hibernate.connection.url", jdbcProperties.getProperty("url")); hibernateJdbcProperties.setProperty("hibernate.connection.username", jdbcProperties.getProperty("user")); hibernateJdbcProperties.setProperty("hibernate.connection.password", jdbcProperties.getProperty("password")); final Configuration cfg = new Configuration(); cfg.addProperties(hibernateJdbcProperties); cfg.configure(hibernateConfigFile); SessionFactory sessionFactory = cfg.buildSessionFactory(); // 啟動后銷毀 sessionFactory.close(); sessionFactory = null; }}
PropertiesUtil工具類:
package com.sunwii.mybatis.util;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class PropertiesUtil { public static Properties loadFromClassPath(String fileName) { Properties props = new Properties(); while(fileName!=null && fileName.length()>0 && (fileName.startsWith("/") || fileName.startsWith("\\"))) { fileName = fileName.substring(1); } InputStream is = Class.class.getResourceAsStream("/"+fileName); try { props.load(is); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return props; }}
常量配置類Constant:
package com.sunwii.mybatis.constant;public class Constants { public static String JDBC_LOCATION = "jdbc.properties"; public static String Hibernate_LOCATION = "hibernate.cfg.xml";}
Mybatis配置文件:
連接池裝飾類(用于簡化Mybatis配置并統(tǒng)一jdbc配置文件路徑常量):
package com.sunwii.mybatis.pool;import java.util.Properties;import org.apache.ibatis.datasource.pooled.PooledDataSource;import org.apache.ibatis.datasource.pooled.PooledDataSourceFactory;import com.sunwii.mybatis.constant.Constants;import com.sunwii.mybatis.util.PropertiesUtil;public class MyPoolDataSourceFactory extends PooledDataSourceFactory { public MyPoolDataSourceFactory() { PooledDataSource dataSource = new PooledDataSource(); // 更多屬性可以通過
用到的幾個枚舉類:
package com.sunwii.mybatis.enums;public enum Level { LEVEL_0, LEVEL_1, LEVEL_2, LEVEL_3, LEVEL_4, LEVEL_5}package com.sunwii.mybatis.enums;import java.util.HashMap;public enum Sex { MAN("男", 0), WOMAN("女", 1); private String key; public String getKey() { return key; } public void setKey(String key) { this.key = key; } public Integer getValue() { return value; } public void setValue(Integer value) { this.value = value; } private Integer value; private static HashMap
用到的類型轉(zhuǎn)換器:
package com.sunwii.mybatis.typehandle;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.TypeHandler;import com.sunwii.mybatis.enums.Sex;/** * -必須實現(xiàn)所有方法,不然的話查詢有可能查詢到為null * @author Administrator * */public class SexEnumTypeHandler implements TypeHandler
package com.sunwii.mybatis.typehandle;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Arrays;import java.util.List;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.TypeHandler;import com.sunwii.mybatis.util.ArrayUtil;/** * -必須實現(xiàn)所有方法,不然的話查詢有可能查詢到為null * @author Administrator * */public class ListTypeHandler implements TypeHandler> { @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void setParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException { String[] strArr = ArrayUtil.fromList((List
用到的數(shù)組集合轉(zhuǎn)換工具類:
package com.sunwii.mybatis.util;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;public class ArrayUtil { @SuppressWarnings("unchecked") public static
Mapper接口:UserMapper.java
package com.sunwii.mybatis.mapper;import java.util.List;import com.sunwii.mybatis.bean.User;public interface UserMapper { public User selectById(int id); public List
映射文件:UserMapper.xml
日期工具:CurrentUtil.java
package com.sunwii.mybatis.util;import java.sql.Timestamp;import java.util.Date;public class CurrentUtil { public static long currentTime() { return new Date().getTime(); } public static Date currentDate() { return new Date(); } public static java.sql.Date currentSqlDate() { return new java.sql.Date(currentTime()); } public static Timestamp currentTimestamp() { return new java.sql.Timestamp(currentTime()); }}
測試示例:
package com.sunwii.mybatis.test.mapper;import java.util.Arrays;import java.util.List;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.junit.Test;import com.sunwii.mybatis.bean.User;import com.sunwii.mybatis.enums.Level;import com.sunwii.mybatis.enums.Sex;import com.sunwii.mybatis.enums.State;import com.sunwii.mybatis.mapper.UserMapper;import com.sunwii.mybatis.test.insert.TestInsert;import com.sunwii.mybatis.util.CurrentUtil;import com.sunwii.mybatis.util.SessionFactoryUtil;public class testMapper { private static Log log = LogFactory.getLog(TestInsert.class); private static SqlSessionFactory sf = SessionFactoryUtil.creat("mybatis-config.xml", true); @Test public void testMapperInsert() { User user = new User(); //user.setId(50); user.setName("sunwii"); user.setVip(1); user.setSalary(3333.00); user.setHeight(1.70f); user.setBirthday(CurrentUtil.currentDate()); user.setLastlogin(CurrentUtil.currentTimestamp()); user.setLevel(Level.LEVEL_3); user.setState(State.OK); user.setSex(Sex.WOMAN); user.setTels(Arrays.asList("133xxxxxxx", "159xxxxxxxx")); int rs = 0; SqlSession session = sf.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); try { rs = userMapper.insert(user); session.commit(); } catch (Exception e) { rs = 0; session.rollback(); e.printStackTrace(); } finally { session.close(); } log.info("操作結(jié)果:" + rs); } @Test public void testMapperUpdate() { User user = new User(); user.setId(1); user.setName("sunwii--55550"); user.setVip(1); user.setSalary(3333.00); user.setHeight(1.70f); user.setBirthday(CurrentUtil.currentDate()); user.setLastlogin(CurrentUtil.currentTimestamp()); user.setLevel(Level.LEVEL_2); user.setState(State.ERROR); user.setSex(Sex.MAN); user.setTels(Arrays.asList("136xxxxxx", "139xxxxxxx")); int rs = 0; SqlSession session = sf.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); try { rs = userMapper.update(user); session.commit(); } catch (Exception e) { rs = 0; session.rollback(); e.printStackTrace(); } finally { session.close(); } log.info("操作結(jié)果:" + rs); } @Test public void testMapperDelete() { User user = new User(50); int rs = 0; SqlSession session = sf.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); try { rs = userMapper.delete(user.getId()); session.commit(); } catch (Exception e) { rs = 0; session.rollback(); e.printStackTrace(); } finally { session.close(); } log.info("操作結(jié)果:" + rs); } @Test public void testMapperGetOne() { Integer id = 50; User user = null; SqlSession session = sf.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); user = userMapper.selectById(id); log.info(user); } @Test public void testMapperGetList() { String userName = "sunwii"; List
上述內(nèi)容就是Mybatis中怎么自動生成數(shù)據(jù)庫表結(jié)構(gòu),你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站欄目:Mybatis中怎么自動生成數(shù)據(jù)庫表結(jié)構(gòu)
網(wǎng)頁網(wǎng)址:http://ef60e0e.cn/article/jgishd.html