錯誤演示
第一步:導入jar包 省略
第二部:創建Person類
package cn.hibernate.bean;
import java.util.Date;
public class Person {
private Integer pId;
private String pName;
private int age;
private Date brithdayDate;
private boolean gender;
private byte[] photo;
private String desc; //描述
public Integer getpId() {
return pId;
}
public void setpId(Integer pId) {
this.pId = pId;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public Date getBrithdayDate() {
return brithdayDate;
}
public void setBrithdayDate(Date brithdayDate) {
this.brithdayDate = brithdayDate;
}
public boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
public byte[] getPhoto() {
return photo;
}
public void setPhoto(byte[] photo) {
this.photo = photo;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
第三步:創建Person的映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.hibernate.bean">
<!--
<class>標簽:配置對象與表 之間關系
*name:默認情況,確定對象全限定類名
如果在<hibernate-mapping>配置package,確定javabean所在的包,可以只簡單類名
*table:數據庫的表名
*catalog:使用的數據庫名稱,默認值:hibernate.cfg.xml配置url設置的數據庫名稱
url # jdbc:mysql://localhost:3306/minemysql
<id>標簽配置主鍵,要求每一個表都應該存在主鍵
* name :確定javabean那個屬性作為主鍵
<property>標簽 配置javabean的普通屬性
* name: 確定屬性名稱
* type: 確定屬性類型
java類型:type="java.lang.String"
hibernate類型:type="string"
timestamp:時間戳,數據更改,當前字段內容將自動使用系統時間
time:時間
date:日期
binary:二進制,大數據類型
數據庫類型: 使用子標簽<column>
name:列名
sql-type:數據庫類型。例如:varchar(50)
* column: 數據庫的列名:默認值與name的取值相同
* length: 確定列的大小
* unique:唯一(添加唯一約束)
* not-null:不為空
-->
<class name="Person" table="t_person">
<id name="pId">
<!-- 主鍵生成策略:固定值 -->
<generator class="native"></generator>
</id>
<property name="pName" >
<column name="pName" sql-type="varchar(50)"></column>
</property>
<property name="age" type="integer" column="age"></property>
<property name="brithdayDate" type="date"></property>
<property name="gender" type="boolean"></property>
<property name="photo" type="binary" not-null="true" unique="false" length="350000"></property>
<property name="desc" column="`desc`"></property>
</class>
</hibernate-mapping>
第四步:創建核心配置文件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>
<!-- #1 基本的四項
property.name 取值如果以‘hibernate’開頭,可以省略
以“hibernate.connection.driver_class”與“connection.driver_class”相同
-->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/minemysql
</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- #2方言 -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<!-- #3 sql -->
<!-- 是否顯示sql語句 -->
<property name="hibernate.show_sql">true</property>
<!-- 是否格式化sql語句 不格式化顯示一行 格式化顯示多行 -->
<property name="hibernate.format_sql">true</property>
<!-- 是否顯示注釋,提供當前sql語句操作對象 -->
<property name="hibernate.use_sql_comments">true</property>
<!-- #4如何創建表(不重要)
create:每一次加載cfg.xml文件都將創建表,程序關閉時,表不進行刪除 [初始化,測試時使用]
如果表存在則先刪除后創建
create-drop:每一次加載cfg.xml文件都將創建表,程序關閉時,表進行刪除
必須執行factory.close()才能刪除
update:如果表不存在則創建,如果表存在,先回檢查*.hbm.xml文件是否和表匹配,
如果不匹配將更新表結構(只添加,不刪除)
validate:加載cfg.xml進效驗,映射文件和數據表是否匹配,如果匹配正常操作,如果不匹配則拋出異常
### 顯示的開發中先有的表,再有的映射文件
* 表 由DBA創建
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- #5取消bean效驗 -->
//省略下面會給講解什么時候需要配置<property name="javax.persistence.validation.mode">none</property>
</session-factory>
</hibernate-configuration>
第五步:創建測試類
package cn.hibernate.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.hibernate.bean.Person;
public class TestApp {
@Test
public void demo01() throws IOException{
FileInputStream is = new FileInputStream(new File("1.jpg"));
byte[] photo = new byte[is.available()];
is.read(photo);
is.close();
Person son = new Person();
son.setpName("傑克1");
son.setAge(19);
son.setBrithdayDate(new Date());
son.setGender(true);
son.setPhoto(photo);
son.setDesc("這個家伙有頭像");
Configuration configuration = new Configuration().configure();
//采用手動方式添加
configuration.addClass(Person.class);
SessionFactory sessionFactory = configuration.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(son);
transaction.commit();
session.close();
sessionFactory.close();
}
}
測試時出現的錯誤如下解決
如果出現圖片太大可以在映射文件中來修改所能保存圖片的大小
出現:org.hibernate.HibernateException: Unable to get the default Bean Validation factory 錯誤
分析:在javaweb6.0項目中添加一個jar
解決:hibernate.cfg.xml中配置取消
特殊字符
分析:sql數據不能使用關鍵字(desc,order等)
解決方法:在列名的左右添加重音符 ("``")