实验五Hibernate基础实验Part one Hibernate对表的添加实验目的:掌握Hibernate的基本功能和基本用法实验要求:通过Hibernate将一个Java对象插入到数据库表中实验原理:(1)Hibernate是一个面向Java环境的对象/关系数据库映射工具,Hibernate不仅管理Java类型到数据库表的映射,还提供查询数据和操作数据的OO方法。
(2)Hibernate对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲地使用OO编程思想来处理数据库。
(3)Hibernate采用映射元数据来描述对象-关系的映射细节,元数据通常采用XML。
(4)关系数据库中的元组通过ORM转换成应用程序中的对象;反之,应用程序中的对象通过ORM持久化成关系数据库中的元组。
(5)可以利用Hibernate框架根据配置和类及映射文件生成数据库表结构,反过来,也可以根据数据库表结构生成持久化类和映射文件。
实验准备:安装SQL Server20XY(如果是Windows XP上的SQL Server2000版,需要加补丁程序SP3)。
实验步骤:一.创建Java Project TestH3_2二.创建数据库及数据源1.在test数据库中创建表NewsUse testCREATE TABLE news (id int IDENTITY (1, 1) primary key ,title varchar (20) NOT NULL ,content text)Gocontext的长度在Hibernate中可能闲长,不能插入,需改成较短的类型!设计表结构的图形界面如图5-1所示。
图5-1 设计News表结构的图形化界面2.打开MyEclipse的Database Explore透视图,如图5-2所示。
图5-2 打开Database Explore透视图3.创建数据库连接驱动,如图5-3所示。
找到jtds-1.2.jar包所在位置。
点击Add JARS,把该包包含进去即可。
注意:SQL Server的Driver template 选Microsoft SQL Server(jTDS Driver)。
图5-3 创建数据库连接三.添加Hibernate功能1.转到Java透视图,添加Hibernate使能功能,如果要用到连接池技术,则选择增加Hibernate Advanced Support Libraries。
图5-4 添加Hibernate能力,选择Hibernate3.3版本图5-5 选择通过新建来创建Hiberntae配置文件图5-6 选择创建会话工厂类2.设置反向工程的有关操转到数据库浏览透视图,选择相应的数据库/DBO中的表,进行反向工程。
注意同一个数据源可以被多个工程共享,持久化映射的时候通过项目的src文件夹建立绑定关系。
设置反向工程的有关操作,如图5-7所示。
图5-7 设置反向工程的操作3.生成映射文件配置类型映射和主键产生方式后,生成映射文件。
图5-8 配置类型映射和主键产生方式注意ID的生成方式为increment。
四.创建测试程序import org.hibernate.*;import org.hibernate.cfg.Configuration;import com.dao.News;public class TestH3_2 {public static void main(String[] args) {Configuration conf = new Configuration().configure();SessionFactory sf = conf.buildSessionFactory();Session sess = sf.openSession();Transaction tx = sess.beginTransaction();News n = new News();n.setTitle("第3条消息");n.setContent("今天天晴了");sess.save(n);mit();sess.close();}}}}五.运行并观察运行结果1.运行后,在数据库表插入数据。
sess.save(n)被转换成如下一条SQL语句insert into news_table (title, content) values ("第一条消息", "今天天晴了"),其主键由系统自动产生。
2.注意观察系统产生的持久类和配置、映射文件。
Part 2 Hibernate对单表的各种操作技术实验目的:掌握通过Hibernate操作数据库的各种技术。
实验要求:通过Hibernate的查询语言HQL对一个数据库表进行插入、检索、更新和删除操作,即CRUD操作。
实验原理:Hibernate的核心接口类关系图如下:Hibernate的核心接口类关系图其中的Query和Criteria接口用于执行各种数据库查询。
Session的Query实例封装一个HQL(Hibernate Query Language)查询语句,查询语句与SQL查询语句有些相似,但HQL查询语句是面向对象的,它引用类名及类的属性名,而不是表名及表的字段名。
Session的Criteria接口完全封装了基于字符串形式的查询语句,比Query 接口更加面向对象,Criteria接口擅长于执行动态查询。
Session接口自己的find()方法也具有数据查询功能,但它只是执行一些简单HQL查询语句的快捷方法,它的功能远没有Query接口强大。
一.通过Query实例进行查询实验步骤:1.先完成实验一,建立环境和数据库。
2.使用Session的Query接口查询,将TestH3_2.java改为:import org.hibernate.*;import org.hibernate.cfg.Configuration;import java.util.*;import com.dao.News;public class TestH3_2 {/***@param args*/public static void main(String[] args) {Configuration conf = new Configuration().configure();SessionFactory sf = conf.buildSessionFactory();Session sess = sf.openSession();Transaction tx = sess.beginTransaction();/* News n = new News();n.setTitle("第3条消息");n.setContent("今天天晴了");sess.save(n); */Query query= sess.createQuery("from News");List l = query.list();for (Iterator it = l.iterator(); it.hasNext(); ){News n = (News)it.next();System.out.println(n.getTitle());}mit();sess.close();}}带参数的查询Hibernate采用参数绑定机制以保证安全:非常安全,防止恶意的用户非法调用数据库系统的存储过程;能够利用底层数据库的预编译SQL语句的功能(语句只被编译一次,然后被缓存)HQL有两种绑定参数的方式:(1)按参数名字绑定如:下列的查询语句定义了以:开头的命名参数Query query= sess.createQuery("from News as n where n.title=:NewsTitle");调用Query的setXXX()方法绑定参数query.setString("NewsTitle",title);(2)按参数位置绑定在HQL查询语句中用“?”定义参数位置,如Query query= sess.createQuery("from News as n where n.title=?");绑定方式:query.setString(0,title);二.使用Session的Criteria接口查询将TestH3_2.java改为://TestH3_2.javaimport org.hibernate.cfg.*;import org.hibernate.*;import java.util.*;import org.hibernate.criterion.*;import com.dao.News;public class TestH3_2 {public static void main(String[] args) throws Exception {Configuration conf = new Configuration().configure(); SessionFactory sf = conf.buildSessionFactory();Session sess = sf.openSession();Transaction tx = sess.beginTransaction();Criteria criteria= sess.createCriteria(News.class); criteria=criteria.add(Restrictions.lt("id" , newInteger(30)));List l =criteria.list();//遍历查询到的记录for (Iterator it = l.iterator(); it.hasNext(); ){ News n = (News)it.next();System.out.println(n.getTitle()); }mit();sess.close();}}可以通过如下方式增加条件为Criteria对象增加Criterion查询条件:Criterion criterion1=Expresion.like(”title”, ”第%”);criteria= criteria.add(criterion1);三.使用原生的SQL将TestH3_2.java改为:import org.hibernate.cfg.*;import org.hibernate.*;import com.dao.News;import java.util.*;public class TestH3_2{public static void main(String[] args) throws Exception {Configuration conf = new Configuration().configure();SessionFactory sf = conf.buildSessionFactory();Session sess = sf.openSession();Transaction tx = sess.beginTransaction();Query query= sess.createSQLQuery("select n.* from news n"); List<News> l=query.list();System.out.println(l.size());mit();sess.close();}}四.级联操作对象图(1)创建部门表depaert和雇员表employeeCREATE TABLE [dbo].[depaert] ([id] [int] IDENTITY (1, 1) primary key ,[Dname] [varchar] (20) NOT NULL ,[man] [varchar] (10),[tele] [varchar] (8))CREATE TABLE [dbo].[employee] ([id] [int] IDENTITY (1, 1) primary key ,[Did] [int] references [depaert](id),[Ename] [varchar] (10) NOT NULL ,[sex] [varchar] (2),[Email] [varchar] (20))(2)建立映射文件注意级联设置。