zoukankan      html  css  js  c++  java
  • 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. 从对数据库的操作可以看出,省去了很多代码的编写,方便了我们也提高了开发效率,框架带来的好处很多,建议大家多多使用。
  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978570.html
Copyright © 2011-2022 走看看