【Hibernate】Hibernate的层次划分,Hibernate4.3的初始化的新写法
在《【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查》(点击打开链接)介绍了Hibernate的配置与基本结构,其作用就是数据库与Java文件的交互媒介。但是,上文的程序写得非常乱,也用很多Hibernate3的过时写法。主要是没有划分好层次所致。其实,虽然Hibernate的初始化越搞越复杂,首先要载入配置文件、建立一个Session的抽象工厂、最后则根据Session工厂建立Session,这样何必呢?为何Hibernate就不能封装好一个方法呢?而且改来改去,Hibernate3一种写法Hibernate4.2一种写法,Hibernate4.3又一种写法。它不给我们封装,我们自己封装。
一、基本目标
还是上次那张在Mysql数据库的Testtable表,这次先插入一个数据dddd,bbbb,再删除这个数据
二、基本准备
在Java工程,配置好Hibernate包等,这里就不多说了。在上文已经介绍得很详细了。
但这次与上文不同的是不再于一个Java文件里面做完所有事情。目录结构如下,dbDAO.java,TestTable.java,hibernate.cfg.xml其实就是M层,HQL就是C层。有点《【Servlet】根据MVC思想设计用户登陆、用户注册、修改密码系统》(点击打开链接)的意味。
1、hibernate.cfg.xml如下,与《【Hibernate】Hibernate的在Eclipse+Mysql的配置、安装,纯Java,利用Annotation与HQL完成数据库的增删改查》(点击打开链接)完全一样,一个字都没有改。这个文件与TestTable.java完成数据库中的Testtable表到Java工程的映射。
<?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> <!--罗列Testtable表与Java文件的映射,这里就Testtable.java的一张表,所以就写一个Testtable.java --> <mapping class="Testtable" /> </session-factory> </hibernate-configuration>2、Testtable.java则在里面重写了系统固有的toString方法,这样就能够在System.out.println();根据我们重写好的toString方法直接输出这个对象了。
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; } public String toString() { return id + "," + username + "," + number; } }
三、制作过程
1、这次主要是根据Hibernate的基本结构封装好一个数据库业务类方法。Hibernate关键就是靠一个Session做完所有事,但是每次初始化Session都要搞一大轮,那何不直接把它封装起来。以后要用直接调用就可以呢?我向你传递过来HQL语句与对象,则此类给我传回查询结果或者完成数据库的操作。以后这个文件就能随便使用了。
import org.hibernate.*; import org.hibernate.cfg.*; import org.hibernate.service.*; import org.hibernate.boot.registry.*; public class dbDAO { private Session session; // 构造函数,初始化Session,相当于连接数据库 public dbDAO() { //这里使用了Hibernate4.3.8的写法,这里Hibernate又把初始化的方法修改了,非常蛋疼 Configuration cfg = new Configuration().configure(); ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(cfg.getProperties()).build(); SessionFactory sessionFactory = cfg .buildSessionFactory(serviceRegistry); this.session = sessionFactory.openSession(); } // 执行查询 public Query query(String hql){ return session.createQuery(hql); } // 执行插入、修改 public void save(Object object){ Transaction transaction=session.beginTransaction(); session.save(object); transaction.commit(); } // 执行删除 public void delete(Object object){ Transaction transaction=session.beginTransaction(); session.delete(object); transaction.commit(); } // 析构函数,中断Session,相当于中断数据库的连接 protected void finalize() throws Exception { if (session.isConnected() || session != null) { session.close(); } } }
2、HQL.java真正的执行类
import java.util.*; @SuppressWarnings("unchecked") public class HQL { public static void main(String[] args) { //建立DAO类 dbDAO db = new dbDAO(); //查询Testtable表,并且把整张表打印出来 List<Testtable> testtableList = db.query("from Testtable").list(); for (Testtable testtable : testtableList) { System.out.println(testtable); } System.out.println(); //设置一个Testtable类,设置好其各列属性,把它存入数据库 //数据库就多出了一行 Testtable testtableTemp = new Testtable(); testtableTemp.setUsername("dddd"); testtableTemp.setNumber("bbbb"); db.save(testtableTemp); //把整张表打印出来,此时可以明显观察多了一列 testtableList = db.query("from Testtable").list(); for (Testtable testtable : testtableList) { System.out.println(testtable); } System.out.println(); //查询刚刚插入数据库的ddd列,把其放入本Java的一个Testtable对象中 testtableTemp = new Testtable(); //如果返回值是唯一的,则用uniqueResult()方法 testtableTemp = (Testtable) db.query( "from Testtable where username like 'dddd'").uniqueResult(); //在数据库中删除这个对象,也就是删除这一列 db.delete(testtableTemp); //把整张表打印出来,此时可以看到,原表没有改变 testtableList = db.query("from Testtable").list(); for (Testtable testtable : testtableList) { System.out.println(testtable); } System.out.println(); } }最后的运行结果如下:
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。