Hibernate框架是比较流行的持久化框架,是一个完整的持久化层解决方案,通过Hibernate的支持,可以以面向对象的方式进行各种数据库操作,从而取代传统的JDBC数据库操作。
ORM的全称是Object/Relation Mapping,即对象/关系映射,对象是指使用的编程语言是面向对象的,而关系则是指使用的数据库是关系型数据库。对象/关系映射是指完成面向对象到关系型数据库的映射,通过映射后,用户可以像操作对象一样来操作自己的数据库。
使用了Hibernate框架的ORM设计思想之后,就可以不用写SQL语句了,通过创建一个持久化类来映射一个数据库表。当使用面向对象的方式来操作持久化对象时,ORM框架能自动将这些操作转换成SQL语句从而完成对数据库的操作。
项目首先要配置Hibernate框架支持,如下,应该在Hibernate官网下载Hibernate 3.jar。在我的网盘可以下载http://pan.baidu.com/s/1jG1li9S
这里使用Hibernate和MySQL来创建一个数据库表,使用数据库表的创建,插入,更新,删除,查询等来进行Hibernate框架ORM设计的实例练习
创建好项目之后,将MySQL数据库连接驱动mysql-connector-java-5.0-nightly-20071116-bin.jarhttp://pan.baidu.com/s/1pJ3cPuF 以及Hibernate框架支持hibernate3.jar等JAR包加入到项目支持。
然后创建Hibernate配置文件。文件中存储和数据库又换的信息,这里使用.xml文件来进行配置,该文件应该命名为hibernate.cfg.xml,在配置文件中可以配置数据库连接URL和数据库驱动与数据库用户名以及用户密码。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 数据库连接URL --> <property name="connection.url"> jdbc:mysql://localhost/mystruts2 </property> <!-- 数据库连接驱动 --> <property name="connection.driver_class"> com.mysql.jdbc.Driver </property> <!-- 数据库用户名 --> <property name="connection.username">root</property> <!-- 数据库用户密码 --> <property name="connection.password">lybcyy.</property> <!-- 数据库方言 --> <property name="dialect"> org.hibernate.dialect.MySQLDialect </property> <!-- 使得映射文件起作用 --> <mapping resource="Product.hbm.xml"/> </session-factory> </hibernate-configuration>
然后创建持久化类。持久化类市一个POJO类,不用继承和实现任何类或接口。
package com.lyb.hibernate; public class Product { //产品ID private String id; //产品名称 private String name; //产品价格 private double price; //各属性的setter和getter方法 public String getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public void setId(String id) { this.id = id; } }
接着创建对象关系映射文件。该文件用来映射持久化类和数据库表,从而将持久化类中的属性和数据库表中的字段关联起来。一般采用持久化类名加上"hbm.xml"的形式
<?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对应一个持久化对象 --> <class name="com.lyb.hibernate.Product"> <!-- id元素用来定义主键标示,并制定主键生成策略 --> <id name="id"> <generator class="assigned"></generator> </id> <!-- 定义其他属性 --> <property name="name"></property> <property name="price"></property> </class> </hibernate-mapping>
注意,为了使得映射文件起作用,必须在hibernate.cfg.xml文件中配置
<!-- 使得映射文件起作用 --> <mapping resource="Product.hbm.xml"/>
在进行数据库表的操作时,需要实现在MySQL数据库中创建一个数据库。
下面就可以创建Java程序来进行数据库表的创建,插入,更新,删除,查询等操作。
数据库表的创建操作。
package com.lyb.hibernate; import org.hibernate.cfg.Configuration; import org.hibernate.tool.hbm2ddl.SchemaExport; public class CreateDB { public static void main(String args[]){ //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SchemaExport实例 SchemaExport sExport=new SchemaExport(cfg); //创建数据库表 sExport.create(true, true); } }
运行结果
在控制台中已经打出创建数据库表的SQL语句
插入数据操作
package com.lyb.hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class InsertProduct { public static void main(String args[]){ //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SessionFactory SessionFactory factory=cfg.buildSessionFactory(); //创建Session Session session=factory.openSession(); //开启事务 session.beginTransaction(); //实例化一个Product Product product=new Product(); product.setId("0511237"); product.setName("喷气机"); product.setPrice(1222.88); //保存数据 session.save(product); //事务提交 session.getTransaction().commit(); //关闭session if(session.isOpen()){ session.close(); } } }
运行之后,在MySQL数据库控制台中输入SELECT * FROM product
结果如下
更新操作
package com.lyb.hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class UpdateProduct { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SessionFactory SessionFactory factory=cfg.buildSessionFactory(); //创建Session Session session=factory.openSession(); //开启事务 session.beginTransaction(); //实例化一个Product Product product=new Product(); product.setId("0511234"); product.setName("采油机"); product.setPrice(777.77); //更新数据 session.update(product); //提交事务 session.getTransaction().commit(); //关闭session if(session.isOpen()){ session.close(); } } }
运行程序之后,在MySQL数据库控制台输入SELECT * FROM product
结果如下
删除操作
package com.lyb.hibernate; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class deleteProduct { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SessionFactory SessionFactory factory=cfg.buildSessionFactory(); //创建Session Session session=factory.openSession(); //开启事务 session.beginTransaction(); //实例化一个Product Product product=new Product(); product.setId("0511234"); product.setName("采油机"); product.setPrice(777.77); //删除数据 session.delete(product); //事务提交 session.getTransaction().commit(); //关闭session if(session.isOpen()){ session.close(); } } }
也可以根据id进行删除
package com.lyb.hibernate; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class deleteProductByid { public static void main(String args[]){ // TODO Auto-generated method stub //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SessionFactory SessionFactory factory=cfg.buildSessionFactory(); //创建Session Session session=factory.openSession(); //开启事务 session.beginTransaction(); //使用HQL查询 String hql="DELETE Product WHERE id=?"; Query q=session.createQuery(hql); q.setString(0, "0511234"); q.executeUpdate(); //事务提交 session.getTransaction().commit(); //关闭session if(session.isOpen()){ session.close(); } } }
运行程序之后,在MySQL数据库控制台输入SELECT * FROM product
结果如下
查询操作
package com.lyb.hibernate; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class QueryAllProduct { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SessionFactory SessionFactory factory=cfg.buildSessionFactory(); //创建Session Session session=factory.openSession(); Product p=null; //使用HQL查询 String hql="FROM Product as pro"; //通过Query方法查询 Query q=session.createQuery(hql); //查询结果保存到list中 List list=q.list(); //遍历是否存在该id的产品,如果存在则进行输出 Iterator iter=list.iterator(); while(iter.hasNext()){ p=(Product)iter.next(); System.out.println("id:"+p.getId()+" name:"+p.getName()+" price:"+p.getPrice()); } //关闭session if(session.isOpen()){ session.close(); } } }
也可以根据id进行查询
package com.lyb.hibernate; import java.util.Iterator; import java.util.List; import org.hibernate.Query; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class QueryProductByid { public static void main(String args[]){ /** * @param args */ // TODO Auto-generated method stub //读取配置文件hibernate.cfg.xml Configuration cfg=new Configuration().configure(); //创建SessionFactory SessionFactory factory=cfg.buildSessionFactory(); //创建Session Session session=factory.openSession(); Product p=null; //使用HQL查询 String hql="FROM Product as pro WHERE pro.id=?"; //通过Query方法查询 Query q=session.createQuery(hql); q.setString(0,"0511234"); //查询结果保存到list中 List list=q.list(); //遍历是否存在该id的产品,如果存在则进行输出 Iterator iter=list.iterator(); while(iter.hasNext()){ p=(Product)iter.next(); System.out.println("id:"+p.getId()+" name:"+p.getName()+" price:"+p.getPrice()); } //关闭session if(session.isOpen()){ session.close(); } } }
进行查询之前需要创建多条记录,然后运行程序,在MyEclipse控制台中输出的结果如下: