hibernate初學,根據視頻教程寫好代碼后,發現無論執行多少次main函數,數據庫中只有一條數據,嘗試多次,后來終於發現問題。。。
使用的工具是:MYSQL 5.7.13 eclipse 4.5.2 hibernate 4.0.5
第一步:
在mysql中新建一個數據庫 名為DEMO01,然后再創建一個test表:
USE DEMO01; CREATE TABLE test( TEST_ID int auto_increment, name varchar(20), TEST_DATE date, primary key(TEST_ID) )engine=InnoDB default charset=utf8 auto_increment=1;
第二步:
新建一個Java project,添加持久化類
package com.hibernate.demo; /* *持久化類test */ import java.util.Date; public class test { private int id; private String name; private Date time; public test(){} 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; } public Date getTime() { return time; } public void setTime(Date time) { this.time = time; } @Override public String toString() { return "test [id=" + id + ", name=" + name + ", time=" + time + "]"; } }
第三步:
創建Hibernate的映射文件,其中property中的name對應持久化類中的屬性,column中的name對應數據庫中的字段名
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2016-8-13 17:46:08 by Hibernate Tools 3.5.0.Final --> <hibernate-mapping> <class name="com.hibernate.demo.test" table="TEST"> <id name="id" type="int"> <column name="TEST_ID" /> <generator class="assigned" /> </id> <property name="name" type="java.lang.String"> <column name="NAME" /> </property> <property name="time" type="java.util.Date"> <column name="TEST_DATE" /> </property> </class> </hibernate-mapping>
第四步:
創建Hibernate配置文件:
<?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> <property name="connection.username">root</property> <property name="connection.password">123456</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql:///demo01?useUnicode=true&characterEncoding=UTF-8</property> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <property name="hbm2ddl.auto">update</property> <mapping resource="com/hibernate/demo/test.hbm.xml"/> </session-factory> </hibernate-configuration>
Hibernate配置文件內容都是以鍵值對的形式進行配置:
connection.driver_class指連接數據庫的驅動,對不同的關系數據庫,驅動不同,需要根據實際情況修改;
connection.url指對應的數據庫的url;
dialect指對應的數據庫方言;
show_sql指程序運行時是否在控制台輸出SQL語句,true 輸出,false 不輸出。默認false,在調試程序時一般設為true,發布程序前改為false,因為輸出SQL語句會影響程序的運行速度;
format_sql指程序運行時,是否在SQL語句中輸出便於調試的注釋信息。true 輸出,false 不輸出,默認false。該屬性只有當show_sql為true時才有效。
hbm2dd.auto指對數據庫的數據進行的操作類型:
create:每次加載hibernate,重新創建數據庫表結構
create-drop:加載hibernate時創建,退出時刪除表結構
update:加載hibernate自動更新數據庫結構
validate:加載hibernate時,驗證創建數據庫表結構
嗯。。。。我的問題就出現在這里。。。一開始是寫的create,后來改為update就沒問題了。。。一旦發現數據庫表丟失,首先看這里設置的值。。。
第五步:
創建會話工廠以及測試實例,增刪查改都有,不過可能方案不全(按道理應該分開來寫,我這里寫一起了,偷了個懶~)
package com.hibernate.demo; import java.util.Date; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.Configuration; public class testManage { private static final SessionFactory sessionFactory=buildSessionFactory(); private static SessionFactory buildSessionFactory() { //創建配置對象 Configuration cfg = new Configuration().configure(); //創建服務注冊對象 StandardServiceRegistryBuilder srb = new StandardServiceRegistryBuilder().applySettings(cfg.getProperties()); StandardServiceRegistry sr = srb.build(); //創建工廠會話對象 return cfg.buildSessionFactory(sr); } public static void main(String[] args) { Session session=sessionFactory.openSession(); session.beginTransaction(); //新增 test theTest=new test(); theTest.setName("mist332!"); theTest.setTime(new Date()); session.save(theTest); //更新 /*test uTest=new test(); uTest.setId(1);//id不能少,Hibernate是根據ID來查詢數據進行更新的 uTest.setName("全宇宙我最帥啦~~~"); session.update(uTest);*/ //刪除 /*test dTest=new test(); dTest.setId(1);//hibernate先進行查詢,再刪除 test dTest1=(test)session.get(test.class, 1); session.delete(dTest1); */ //查詢 //HQL查詢,是Hibernate主推的查詢方式,和SQL比較像,但是form后面是Java類名,不是數據庫表名, //如果查詢全字段 select * 可以省略不寫 /*Query query=session.createQuery("from test"); List<test> list=query.list(); for(test t:list){ System.out.println(t.toString()); }*/ //當不是查詢全字段,或者是從兩張表中聯合查詢數據時,返回的是一個數組: /*Query query=session.createQuery(" select s.name,t.name from Student s ,test t "); List<Object[]> list=query.list();//這里的每一行都是一個一維數組 for(int i=0;i<list.size();i++){ Object []o=(Object[]) list.get(i);//轉型為數組 String name1=(String) o[0];//與select中順序的類型相對應,可以是類 String name2=(String) o[1]; System.out.println("Student中的name:"+name1+"test中的name:"+name2); System.out.println("查出來了~~~~~~~~"); }*/ session.getTransaction().commit(); session.close(); sessionFactory.close();; } }
如果我們把設置為create,那么執行的SQL就會是:
INFO: HHH000227: Running hbm2ddl schema export Hibernate: drop table if exists TEST Hibernate: create table TEST ( TEST_ID integer not null, NAME varchar(255), TEST_DATE datetime, primary key (TEST_ID) ) 八月 13, 2016 6:20:03 下午 org.hibernate.tool.hbm2ddl.SchemaExport execute INFO: HHH000230: Schema export complete Hibernate: insert into TEST (NAME, TEST_DATE, TEST_ID) values (?, ?, ?) 八月 13, 2016 6:20:04 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH000030: Cleaning up connection pool [jdbc:mysql:///demo01?useUnicode=true&characterEncoding=UTF-8] 插入成功!
如果設置為update:
八月 13, 2016 6:44:24 下午 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema update complete Hibernate: insert into TEST (NAME, TEST_DATE) values (?, ?) 八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning WARN: SQL Warning Code: 1292, SQLState: 22007 八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.spi.SqlExceptionHelper$StandardWarningHandler logWarning WARN: Incorrect date value: '2016-08-13 18:44:24.789' for column 'TEST_DATE' at row 1 八月 13, 2016 6:44:24 下午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop INFO: HHH000030: Cleaning up connection pool [jdbc:mysql:///demo02?useUnicode=true&characterEncoding=UTF-8] 插入成功!
從打印的SQL語句中很容易就可以看出區別啦~