这篇文章有很多槽点,在Hibernate4.x上面用着Hibernate3.x的写法去写。而且程序中放到Eclipse中会有一大堆警告,但是这好歹也在一定程度上完成了Hibernate的入门。毕竟现在很多介绍Hibernate的书籍都是用Hibernate3.x的写法去写。上次那篇《【Hibernate】最简单的Hibernate工程——账号注册系统》(点击打开链接)杂糅Struts的技术其实是不对的。因为Hibernate完成的是,从Java到数据库,从数据库到Java的任务。之后Java与Jsp前台页面的交互任务交给Struts完成就好了。因此,只要利用一个Java工程就足以说明Hibernate的问题。你不大了甚至还可以把Hibernate看作,只是一个类似Qrcode.lib二维码处理的《【Java】利用Java对网址进行二维码的编码与解码操作》(点击打开链接)的一个Java插件。放好jar文件,Hibernate就足以开始工作了。
一、基本目标
在Mysql数据库中存在着一张如下图的usertable表:
里面一开始的数据如下:
经历完把aaa,bbb插入到testtable表中,把testtable表中id=1的Username改成ccc,删除username=ccc,number=bbb那些项三个操作之后,数据如下:
二、基本准备
1、这东西本来一个简单的,到网上搜一下就有的mysql-connector-java-5.1.32.jar,配合SQL就能够完成的,具体见《【Mysql】Java中对Mysql数据库的增删改查、Java的System类》(点击打开链接),但现在人人都用Hibernate你也不得不学,先要到Hibernate的官网(点击打开链接)如下图,下载Hibernate的最新版本,国外网站,速度就这样,也可以用下载工具下载如下的网址(点击打开链接)
2、在Eclipse新建一个Java工程HibernateTest,注意是Java工程,不是JavaWeb工程!打开这个Java工程的在你的电脑下的目录,在src下面新建一个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> <!--所用的数据库驱动 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!--所用的数据库登陆密码 --> <property name="hibernate.connection.password">root</property> <!--所用的数据库名称为test,根据实际更改 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!--所用的数据库用户名 --> <property name="hibernate.connection.username">root</property> <!--所用的数据库方言,与所用数据库驱动一样,可以在网上查到,这里是mysql --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> <property name="hibernate.format_sql">true</property> <!--如果是update表明Hibernate将保留原来的数据记录,插入时把新记录添加到已有的表,--> <!--如果是create,则总是创建新的表,如果原来数据库已有的这个表,则这个表的记录会被全部清洗 --> <property name="hibernate.hbm2ddl.auto">update</property> </session-factory> </hibernate-configuration>
3、打开这个Java工程的在你的电脑下的跟目录,在里面新建一个lib文件夹。把下载之后的hibernate-release-4.3.8.Final解压,hibernate-release-4.3.8.Final\lib\required下面的所有lib文件,拷贝到Java工程下面的lib文件夹。这次真的是required下面的所有lib了,不像上次《【Struts2】Struts2纯手工安装、配置以及Helloworld,以最新版struts 2.3.20 GA做例子》(点击打开链接)那样,多拷了就跑不起来。在把到网上搜一下就有的mysql-connector-java-5.1.32.jar也放进去lib里面。此时Java工程下的lib文件夹如下图:
4、先刷新一下Eclipse的HibernateTest,具体是,右键这个工程,选择刷新
5、之后再于eclipse导入lib包,如下图,右击Java工程HibernateTest选择属性->Java Build Path->Add Jars,选择HibernateTest下的所有JAR文件导入即可。
这就完成了Hibernate的基本配置。
三、制作过程
1、Hibernate就是把数据库testtable整张表拿进Java,然后再让你慢慢操作的。首先要把testtable拿进Java,在src下面之间创建一个Testtable如下,
import javax.persistence.*; @Entity @Table(name="testtable") public class Testtable { private int id; private String username; private String number; //表示主键与自动生成项 @Id @GeneratedValue public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name = "username") public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } @Column(name = "number") public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
这个Testtable.java是与表的结构是对映的:
表中有多少列,它就应该有多少个静态成员变量,同时必须要有相应的getter与setter,这种Annotation的方式,不同于以往的要多建立一个xml的文件的方式,简单快捷。
为了使这个映射文件生效,还在hibernate.cfg.xml需要补充多一句话<mapping class="Testtable" />,如下图:
2、最后,才是我们真正的执行文件Test.java
import java.util.*; import org.hibernate.*; import org.hibernate.cfg.*; public class Test { public static void main(String[] args) { //这里是所谓的建立事务 Session session=new Configuration().configure().buildSessionFactory().openSession(); Transaction transaction=session.beginTransaction(); Testtable Testtable=new Testtable(); List<Testtable> list = new ArrayList<Testtable>(); System.out.println("此时的Testtable表:"); list=session.createQuery("from Testtable").list(); for(int i=0;i<list.size();i++){ System.out.println(list.get(i).getId()+","+list.get(i).getUsername()+","+list.get(i).getNumber()); } System.out.println("========取出Testtable表第2项=========="); Testtable=(Testtable)session.get(Testtable.class, 2); System.out.println(Testtable.getId()+","+Testtable.getUsername()+","+Testtable.getNumber()); System.out.println("=========把aaa,bbb插入到Testtable表中========="); Testtable=new Testtable(); Testtable.setUsername("aaa"); Testtable.setNumber("bbb"); session.save(Testtable); System.out.println("此时的Testtable表:"); list=session.createQuery("from Testtable").list(); for(int i=0;i<list.size();i++){ System.out.println(list.get(i).getId()+","+list.get(i).getUsername()+","+list.get(i).getNumber()); } System.out.println("=============把Testtable表中id=1的Username改成ccc================="); list=session.createQuery("from Testtable where id=1").list(); for(int i=0;i<list.size();i++){ list.get(i).setUsername("ccc"); session.save(list.get(i)); } System.out.println("此时的Testtable表:"); list=session.createQuery("from Testtable").list(); for(int i=0;i<list.size();i++){ System.out.println(list.get(i).getId()+","+list.get(i).getUsername()+","+list.get(i).getNumber()); } System.out.println("=======删除username=ccc,number=bbb那些项============="); list = session.createQuery("from Testtable where number like 'bbb' and username like 'ccc' ").list(); for(int i=0;i<list.size();i++){ session.delete(list.get(i)); } System.out.println("此时的Testtable表:"); list=session.createQuery("from Testtable").list(); for(int i=0;i<list.size();i++){ System.out.println(list.get(i).getId()+","+list.get(i).getUsername()+","+list.get(i).getNumber()); } //这里是所谓的执行并提交事务 transaction.commit(); session.close(); } }整个文件的思想核心是,利用HQL语句把查询结果转化成list利用一个动态数组来保存各个查询结果。
list必须注明是TestTable的List。
HQL语句其实不难的,细读一下就可以看懂,在createQuery方法里面的参数就是HQL。它是是从Testtable这里类来查询,必须大写。
增加一条记录是先构造好一个类,再用save方法保存进去
删除的时候也要构造好一个类再删除。
修改的时候,是先把要修改的项查询出来,构造好这个类,再进行删除。
这就是整个Hibernate的思想。
Java程序运行之后就不会停止了,要自己手工停止,因为数据库与JAVA的映射一直在进行,很适合服务器运行。所以它可以配合Struts嘛。运行结果就不贴了,太长,不同的表结果是不同。反正这算是一个Hibernate的入门吧!