l模型不匹配(阻抗不匹配)
Java面嚮對象語言,對象模型,其主要概念有:繼承、關聯、多態等;
數據庫是關係模型,其主要概念有:表、主鍵、外鍵等。
l解決辦法
1使用JDBC手工轉換。
2使用ORM(Object Relation Mapping對象關係映射)框架來解決,主流的ORM框架有Hibernate、TopLink、OJB。
安裝配置
l下載地址http://www.hibernate.org,本教程使用3.2.5。3.3對緩存做了些處理,其他沒有什麼變化
l將下載目錄/hibernate3.jar和/lib下的hibernate運行時必須的包加入classpath中:
antlr.jar,cglib.jar,asm.jar,commons-collections.jar,commons-logging.jar,jta.jar,dom4j.jar
l配置文件hibernate.cfg.xml和hibernate.properties,XML和properties兩種,這兩個文件的作用一樣,提供一個即可,推薦XML格式,下載目錄/etc下是示例配置文件。
可以在配置文件指定:
數據庫的URL、用戶名、密碼、JDBC驅動類、方言等。
啓動時Hibernate會在CLASSPATH裏找這個配置文件。
l映射文件(hbm.xml,對象模型和關係模型的映射)。在/eg目錄下有完整的hibernate示例。
l快速開始小例子
package myk; import java.util.Date; public class User { private int id; private String name; private Date birthday; /** * Domain Object限制 1.默認的構造方法(必須的)。 * 2有無意義的標示符id(主鍵)(可選) * 3非final的,對懶加載有影響(可選),final的無法繼承 */ // hibernate 需要一個缺省的構造函數,你不寫是可以的,編譯器會給你加一個默認的無參構造函數, // 如果你寫了一個帶參數的構造函數,hibernate是無法完成映射的,因爲hibernate是通過反射來完成對象的 // 創建的 public User() { } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package myk; import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class Base { /** * @param args */ public static void main(String[] args) { Configuration cfg = new Configuration(); cfg.configure(); SessionFactory sf = cfg.buildSessionFactory(); Session s = sf.openSession(); //如果引擎是InnoDB則需要打開實務然後提交 Transaction tx = s.beginTransaction(); User user = new User(); user.setBirthday(new Date()); user.setName("name"); s.save(user); tx.commit(); s.close(); /** * * mysql 缺省引擎是ENGINE=MyISAM ,該引擎不支持事務,所以開啓事務和不開啓是一樣的, * 插入之後不能回滾 mysql> show create table user; +-------+--------------------------------------- ------------------------------------------------ ---------------------------------------------+ | Table | Create Table | +-------+--------------------------------------- ------------------------------------------------ ---------------------------------------------+ | user | CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `name` varchar(255) default NULL, `birthday` datetime default NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 | +-------+--------------------------------------- ------------------------------------------------ ---------------------------------------------+ mysql支持下面幾種引擎 mysql> show engines; +------------+---------+------------------------------------------------------- --------+ | Engine | Support | Comment | +------------+---------+------------------------------------------------------- --------+ | MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | | MEMORY | YES | Hash based, stored in memory, useful for temporary tab es | | InnoDB | YES | Supports transactions, row-level locking, and foreign eys | | BerkeleyDB | NO | Supports transactions and page-level locking | | BLACKHOLE | NO | /dev/null storage engine (anything you write to it dis ppears) | | EXAMPLE | NO | Example storage engine | | ARCHIVE | YES | Archive storage engine | | CSV | NO | CSV storage engine | | ndbcluster | NO | Clustered, fault-tolerant, memory-based tables | | FEDERATED | NO | Federated MySQL storage engine | | MRG_MYISAM | YES | Collection of identical MyISAM tables | | ISAM | NO | Obsolete storage engine | +------------+---------+------------------------------------------------------- --------+ 12 rows in set (0.00 sec) */ } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="myk"> <!-- 如果不寫table缺省和類名是相同的 --> <class name="User" table="user"> <id name="id"> <!-- native其實是一個類名的簡寫 --> <generator class="native" /> </id> <property name="name"/> <property name="birthday" /> </class> </hibernate-mapping>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- 如果連接的是本機而且缺省端口是3306就可以用///來代替 --> <property name="connection.url">jdbc:mysql:///test</property> <property name="connection.username">root</property> <property name="connection.password"></property> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <!-- 它包含4個屬性: create:會根據你的model類來生成表,但是每次運行都會刪除上一次的表,重新生成表,哪怕2次沒有任何改變 create-drop : 根據model類生成表,但是sessionFactory一關閉,表就自動刪除 update : 最常用的屬性,也根據model類生成表,即使表結構改變了,表中的行仍然存在,不會刪除以前的行 validate : 只會和數據庫中的表進行比較,不會創建新表,但是會插入新值 --> <property name="hbm2ddl.auto">create</property> <property name="show_sql">true</property> <mapping resource="myk/User.hbm.xml" /> </session-factory> </hibernate-configuration>