• ORM框架Hibernate (一) 对DAO封装和抽象


    1. 说明
      1. 前面已经给大家介绍了Struts这个框架,Struts是对Web项目的表示层进行了封装,而Hibernate是对Web项目中DAO层进行封装,也即是.NET中我们常用到的D层封装,即对访问数据库的一层进行的封装。
      1. D层中尽管我们引入了一个SQLHlper类,在执行CRUD操作中的一些共同的部分抽象出来了,但是远远不够的还要进行更深层次的封装,Hibernate这个框架封装的比较彻底,使用了这个框架后。
        1. 不用我们自己写SQL语句
        1. 甚至连表都不用自己建立
      1. 使用了Hibernate可以不用自己建表,我们只关心实体,关心面向对象的部分,而不用关心关系型数据库。
        1. 它对面向对象与关系型模式之间解耦了,在一定程度上让我们只关心面向对象部分。
        1. 体现了OOAOODOOP的编程思想
      1. Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式来操作关系数据库。
    1. 特点
      1. 优点
        1. 轻量级
          1. 是相对于重量级而言,不依赖于容器,易于配置
            1. 比如Struts是一个重量级,它需要容器支持Tomcat
          1. 没有侵略性API,支持透明持久化
            1. 即在写持久化层时,不用实现或继承任何Hibernate的类,对其它类的依赖性小,我们知道Struts,在使用ActionFormAction等类时,必须实现或者继承是Struts父类才可以,Hibernate不用继承。
              1. POJO
                1. POJO是Plain Old Java Objects的缩写,即简单的Java对象,不但任任何角色对象。
                1. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为 VO(value -object)或 dto(Data Transform Object)来使用。
                1. 用来表示普通的Java对象,不是JavaBean, EntityBean 或者 SessionBean。POJO不担当任何特殊的角色,也不实现任何特殊的Java框架的接口如,EJB, JDBC等等。
          1. 独立性好
            1. 易于测试,它不像Struts那样即使测试一个小小几行代码的Java类,也需要启动很大的TomcatJboss等,一般启动还要等半天的功夫,在Hibernate中在类中加入Main方法就可以进行测试,很方便。
        1. 它没有侵入性和测试非常简单 这是它流行的一个原因。
      1. 缺点
        1. 优点和缺点是相对的,正式由于它的优点也成为了它的缺点,因为它封装性好,这样对数据库如果进行一些特殊操作不好实现。
        1. 大量的更新或者统计查询操作会不方便。
    1. 环境搭建
      1. Hibernate不仅仅支持Web程序,Java项目等也支持,这一点要比Struts应用范围广,毕竟它属于轻量级,扩展性能好。
      1. 搭建框架同Struts类似,只需把Hibernate包引入即可,多了一个实体配置文件,是这里不细说,看一下搭建好的截图。
        1. 搭建好截图
          1. 文件
    1. 建立实体和简单操作
      1. 建立一个实体类,看一下它是如何不用建表而自己对应数据库的,以User表为例:
        1. User
          1. import java.util.Date;
            
            public class User {
            	
            	private String id;
            	private String name;
            	private String password;
            	private Date createTime;
            	private Date expireTime;
            	public String getId() {
            		return id;
            	}
            	public void setId(String id) {
            		this.id = id;
            	}
            	public String getName() {
            		return name;
            	}
            	public void setName(String name) {
            		this.name = name;
            	}
            	public String getPassword() {
            		return password;
            	}
            	public void setPassword(String password) {
            		this.password = password;
            	}
            	public Date getCreateTime() {
            		return createTime;
            	}
            	public void setCreateTime(Date createTime) {
            		this.createTime = createTime;
            	}
            	public Date getExpireTime() {
            		return expireTime;
            	}
            	public void setExpireTime(Date expireTime) {
            		this.expireTime = expireTime;
            	}
            	
            }

        1. User.hbm.xml映射文件
          1. <?xml version="1.0"?>
            <!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.bjpowernode.hibernate.User">
            		<id name="id">
            			<generator class="uuid"></generator>
            		</id>
            		<property name="name"></property>
            		<property name="password"></property>
            		<property name="createTime"></property>
            		<property name="expireTime"></property>
            	</class>
            
            </hibernate-mapping>

          1. 该文件是用于实体对数据库表的映射,可以自定义表名或者字段名
        1. Hibernate.cfg.xml系统配置
          1. <!DOCTYPE hibernate-configuration PUBLIC
            	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
            
            <hibernate-configuration>
            	<session-factory>
            		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
            		<property name="hibernate.connection.username">root</property>
            		<property name="hibernate.connection.password">123456</property>
            		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
            		<property name="hibernate.show_sql">true</property>
            		<property name="hibernate.format_sql">true</property>
            		
            		
            		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>
            	</session-factory>
            </hibernate-configuration>

          1. 这属于系统级别文件,指明表映射文件,以及数据库配置信息。
        1. MySql 效果
      1. 如何不用写SQL语句,像表里插入数据?
        1. Test
          1. import java.util.Date;
            
            import org.hibernate.Session;
            import org.hibernate.SessionFactory;
            import org.hibernate.cfg.Configuration;
            
            public class Test {
            
            	/**
            	 * @param args
            	 */
            	public static void main(String[] args) {
            		//读取hibernate.hbm.xml文件
            		Configuration cfg=new Configuration().configure();
            		//建立SessionFactory相当于数据库的一个镜像
            		SessionFactory factory=cfg.buildSessionFactory();
            		//取得Session
            		Session session=null;
            		try {
            			session=factory.openSession();
            			//开启事务
            			session.beginTransaction();
            			User user=new User();
            			user.setName("李龙生");
            			user.setPassword("123456");
            			user.setCreateTime(new Date());
            			user.setExpireTime(new Date());
            			
            			//保存User对象
            			session.save(user);
            			//提交事务
            			session.getTransaction().commit();
            			
            			
            		} catch (Exception e) {
            			e.printStackTrace();
            			//回滚事务
            			session.getTransaction().rollback();
            			
            			
            		}finally{
            			//关闭Session
            			if (session!=null) {
            				if (session.isOpen()) {
            					session.close();
            				}
            			}	
            			
            		}
            		
            	}
            
            }

          1. 这里面涉及到了SessionFatory/Session等对象,专用于操作数据库。
        1. 从下面可以看到,执行后,数据库中多了一条数据
    1. 从对数据库的操作可以看出,省去了很多代码的编写,方便了我们也提高了开发效率,框架带来的好处很多,建议大家多多使用。
  • 相关阅读:
    poj 3125 Printer Queue
    poj 1877 Flooded!
    hdu 4121 xiangqi 模拟
    Codeforces Round #268 (Div. 2)
    hdu 4096 Universal Question Answering System
    hdu 1720 c++一水
    lab1
    homework2
    第一次作业
    IFE_part2_JavaScript_数组去重/trim()
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978570.html
Copyright © 2020-2023  润新知