Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,它将 POJO 与数据库表建立映射关系,是一个全自动的 orm 框架,hibernate 可以自动生成 SQL 语句,自动执行,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。
开发环境搭建
软件
版本
DM 数据库
DM 8.0 及以上版本
JDK
JDK 8
Eclipse
2018-12 (4.10.0)
hibernate
3.0
安装 DM 数据库 请参考 DM 数据库快速上手指南 。
数据库安装过程中,请勾选创建 BOOKSHOP,DMHR 示例库,作为数据库模拟环境,如下图所示:
安装 Java 开发工具包–JDK 双击安装包进行安装,安装步骤简单,点击【下一步】安装即可。以安装目录 D:\java\jdk1.8.0_111 为例,安装完成如下图所示:
安装成功后需要配置 JDK 环境变量,即将 JDK 安装路径的 bin 路径复制到环境变量 path 里,如下图所示:
环境变量配置成功后,可使用 win+R 打开命令提示符,输入 java -version 命令,可以正常出现 JDK 版本号,即环境变量配置成功,如下图所示:
注意 JDK 安装完成后还需配置环境变量 ,环境变量配置不正确会导致项目启动报错。
因环境变量配置错误导致的常见错误代码如下:
Unable to find a javac compiler; Perhaps JAVA_HOME does not point to the JDK;
安装集成开发环境 eclipse 正确配置 Java 环境变量后,eclipse 可正常打开。
开发示例 Hibernate框架的引入
准备项目所需 jar 包 。
新建项目 JAVA_Hibernate,并导入项目所需 jar 包,如下图所示:
注意 复制 jar 包到 lib 文件夹后,要选择所有 jar 包,鼠标右键,Build path–>Add to Build path。
在 src 源码目录下创建如下包名,完整项目目录结构如下图所示:
书写 Hibernate 的主配置文件:hibernate.cfg.xml.xml,存放在 src 目录下。hibernate.cfg.xml 文件如下所示:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd" ><hibernate-configuration > <session-factory > <property name ="hibernate.dialect" > org.hibernate.dialect.DmDialect</property > <property name ="hibernate.connection.driver_class" > dm.jdbc.driver.DmDriver</property > <property name ="hibernate.connection.url" > jdbc:dm://localhost:5236</property > <property name ="hibernate.connection.username" > SYSDBA</property > <property name ="hibernate.connection.password" > SYSDBA</property > <property name ="hibernate.show_sql" > true</property > <property name ="hibernate.format_sql" > true</property > <property name ="hibernate.hbm2ddl.auto" > update</property > <property name ="hibernate.connection.autocommit" > true</property > <property name ="hibernate.connection.SetBigStringTryClob" > true</property > <mapping resource ="com/pojo/BigDate.hbm.xml" /> <mapping resource ="com/pojo/ProductCategory.hbm.xml" /> </session-factory > </hibernate-configuration >
基础操作示例代码 基本操作使用的数据表为示例库中 Product 的 PRODUCT_CATEGORY 表,对应于数据库表添加实体类 PRODUCT_CATEGORY,其位置放于 com.pojo 下。
操作数据库对应的实体类 PRODUCT_CATEGORY.java 文件如下所示:
package com.pojo;public class ProductCategory { private Long productCategoryId; private String name; public Long getProductCategoryId () { return productCategoryId; } public void setProductCategoryId (Long productCategoryId) { this .productCategoryId = productCategoryId; } public String getName () { return name; } public void setName (String name) { this .name = name; } @Override public String toString () { return "ProductCategory [productCategoryId=" + productCategoryId + ", name=" + name + "]" ; } public ProductCategory (Long productCategoryId, String name) { super (); this .productCategoryId = productCategoryId; this .name = name; } public ProductCategory () { super (); } }
配置实体类与数据库映射的配置文件 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping > <class name ="com.pojo.ProductCategory" table ="PRODUCTION.PRODUCT_CATEGORY" > <id name ="productCategoryId" type ="java.lang.Long" > <column name ="PRODUCT_CATEGORYID" /> <generator class ="identity" /> </id > <property name ="name" type ="java.lang.String" > <column name ="NAME" length ="50" not-null ="true" /> </property > </class > </hibernate-mapping >
测试类 TestProduct.java 文件如下所示:
package com.test;import java.util.List;import org.hibernate.Query;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.classic.Session;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.pojo.ProductCategory;public class TestProductCategory { SessionFactory sf = null ; Session session = null ; @Before public void before () { Configuration config = new Configuration().configure(); sf = config.buildSessionFactory(); session = sf.openSession(); } @Test public void testInsert () { ProductCategory pCategory = new ProductCategory(null , "美术" ); session.save(pCategory); } @Test public void testUpdate () { ProductCategory pCategory = null ; pCategory = (ProductCategory)session.get(ProductCategory.class,new Long(4 )); System.out.println(pCategory); pCategory.setName("英语" ); System.out.println(pCategory); session.update(pCategory); } @Test public void testSelectAll () { String hql = "from ProductCategory" ; Query query = session.createQuery(hql); List<ProductCategory> list = query.list(); for (ProductCategory pCategory:list) { System.out.println(pCategory); } } @Test public void testDelete () { ProductCategory pCategory = null ; pCategory = (ProductCategory)session.get(ProductCategory.class,new Long(5 )); if (pCategory!=null ) { session.delete(pCategory); } } @After public void after () { if (session != null ) { session.flush(); session.clear(); session.close(); sf.close(); } } public static void main (String[] args) { TestProductCategory test = new TestProductCategory(); test.before(); test.testInsert(); test.testUpdate(); test.testSelectAll(); test.testDelete(); test.after(); } }
运行后控制台截图:
运行后数据库表截图:
大字段操作示例
创建需要操作的含大字段类型的数据表。
CREATE TABLE "PRODUCTION" ."TEST_BIG_DATE" ( "ID" INT IDENTITY (1 , 1 ) NOT NULL ,"PHOTO" IMAGE,"DESCRIBE" BLOB ,"TXT" CLOB ,NOT CLUSTER PRIMARY KEY ("ID" )) STORAGE (ON "BOOKSHOP" , CLUSTERBTR) ;
在 D 盘根目录下,创建 DM8 特点.jpg、达梦产品简介.txt 两个文件,作为大字段存储,如下图所示:
操作数据库对应的实体类 BigDate.java 文件如下所示:
package com.pojo;import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.TableId;import com.baomidou.mybatisplus.annotation.TableName;@TableName(value="PRODUCTION.TEST_BIG_DATE") public class BigDate { @TableId(value = "id",type = IdType.AUTO) private Long id; private byte [] photo; private byte [] describe; private String txt; public Long getId () { return id; } public void setId (Long id) { this .id = id; } public byte [] getPhoto() { return photo; } public void setPhoto (byte [] photo) { this .photo = photo; } public byte [] getDescribe() { return describe; } public void setDescribe (byte [] describe) { this .describe = describe; } public String getTxt () { return txt; } public void setTxt (String txt) { this .txt = txt; } @Override public String toString () { return "TestBigDate [id=" + id + ", txt=" + txt + "]" ; } public BigDate (Long id, byte [] photo, byte [] describe, String txt) { super (); this .id = id; this .photo = photo; this .describe = describe; this .txt = txt; } public BigDate () { super (); } }