zoukankan      html  css  js  c++  java
  • 第二十五天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)

    版权声明:本文为博主原创文章。未经博主同意不得转载。 https://blog.csdn.net/zwszws/article/details/28493209

               6月4日。晴天。"晴日暖风生麦气,绿阴幽草胜花时。"

         “道”是仅仅有中国人才懂得并孜孜以求的特殊的宇宙存在感的体验。

    全世界仅仅有中文才干阐释“道”的所有涵义。

    然而所谓阐释。并不重在定义。很多其它的还是感受。

    “道”既在“虚无”之内。又超越了“虚无”,成为中国文化最寻常但又最玄妙的一种境地。   

          老庄觉得:道是宇宙的本体,即是宇宙万物的老祖宗。

            老外觉得:Tao is the source of all programs.

         在程序设计里面,道被狭隘的变成了DAO模式-意在使表示层与业务逻辑层的代码进一步分离。 
           一般的做法是:设计一个DAO接口,数据的插入。改动,删除,查询等操作都是在这个进行,是实现详细事务的一个接口。再设计一个DAO接口的实现类。一般把它叫DAOImp,它把对数据的操作详细化。


          以下是一个使用DAO接口的。完整的运用Hibernate完毕增、删、改、查的综合演示样例。

           1、建立Java EE Project( 使用hibernate 3.6.10

                 jar包下载及导入,见第十九天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(一)

           2、创建MySQL数据库

            数据库表创建,第十九天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(一)

            3、创建DAO接口UserInfoDao.java        

    package edu.eurasia.dao;
    
    import edu.eurasia.model.UserInfo;
    
    public interface UserInfoDao {
    	public void Save(UserInfo userinfo);
    
    	public void Update(UserInfo userinfo);
    
    	public void delete(UserInfo userinfo);
    
    	public void Get(int id);
    
    	public void Load(int id);
    
    	public void QueryAll(String hql);
    }
           4、创建DAO的实现类UserInfoDaoImpl.java

    package edu.eurasia.dao.implment;
    
    import java.util.List;
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import edu.eurasia.dao.UserInfoDao;
    import edu.eurasia.model.UserInfo;
    import edu.eurasia.utils.HibernateUtil;
    
    public class UserInfoDaoImpl implements UserInfoDao {
    
    	@Override
    	public void Save(UserInfo userinfo) {
    		Session session = HibernateUtil.getSession();
    		Transaction tx = null;
    		try {
    			// 開始事务
    			tx = session.beginTransaction();
    			System.out.println("開始加入数据到数据库……");
    			// 保存数据到数据库
    			session.save(userinfo);
    			// 结束事务
    			tx.commit();
    			tx = null;
    			System.out.println("恭喜你。第一个加入程序执行成功!");
    		} catch (HibernateException e) {
    			e.printStackTrace();
    			if (tx != null) {
    				tx.rollback();
    			}
    		} finally {
    			HibernateUtil.close(session);
    		}
    	}
    
    	@Override
    	public void Update(UserInfo userinfo) {
    		Session session = HibernateUtil.getSession();
    		Transaction tx = null;
    		try {
    			// 開始事务
    			tx = session.beginTransaction();
    			System.out.println("開始更新数据……");
    			// 保存数据到数据库
    			session.update(userinfo);
    			// 结束事务
    			tx.commit();
    			tx = null;
    			System.out.println("恭喜你,第一个更新程序执行成功!

    "); } catch (HibernateException e) { e.printStackTrace(); if (tx != null) { tx.rollback(); } } finally { HibernateUtil.close(session); } } @Override public void delete(UserInfo userinfo) { Session session = HibernateUtil.getSession(); Transaction tx = null; try { // 開始事务 tx = session.beginTransaction(); System.out.println("開始删除数据……"); // 保存数据到数据库 session.delete(userinfo); // 结束事务 tx.commit(); tx = null; System.out.println("恭喜你,第一个删除程序执行成功。"); } catch (HibernateException e) { e.printStackTrace(); if (tx != null) { tx.rollback(); } } finally { HibernateUtil.close(session); } } @Override public void Get(int id) { Session session = HibernateUtil.getSession(); System.out.println("開始使用get查询数据……"); // 保存数据到数据库 UserInfo userinfo = (UserInfo) session.get(UserInfo.class, id); if (userinfo != null) { System.out.println("UserId:" + userinfo.getId() + " Username:" + userinfo.getUsername() + " Password:" + userinfo.getPassword()); } else { System.out.println("id不存在!!"); } HibernateUtil.close(session); } @Override public void Load(int id) { Session session = HibernateUtil.getSession(); System.out.println("開始使用load查询数据……"); // 保存数据到数据库 UserInfo userinfo = (UserInfo) session.load(UserInfo.class, id); if (userinfo != null) { System.out.println("UserId:" + userinfo.getId() + " Username:" + userinfo.getUsername() + " Password:" + userinfo.getPassword()); } else { System.out.println("id不存在!!"); } HibernateUtil.close(session); } @Override public void QueryAll(String hql) { Session session = HibernateUtil.getSession(); List<UserInfo> users = session.createQuery(hql).list(); for (UserInfo userinfo : users) { System.out.println(userinfo.getUsername()); } HibernateUtil.close(session); System.out.println("恭喜你。第一个所有查询程序执行成功!

    "); } }

            5、创建POJO类UserInfo
    package edu.eurasia.model;
    
    public class UserInfo {
    	private int id;
    	private String username;
    	private String password;
    	
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    }
    

              6、编写对象关系映射文件UserInfo.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 name="edu.eurasia.model.UserInfo" table="userinfo"> <!--类对象的主键和表的主键的关联--> <id name="id" type="integer"> <column name="id" /> <!--指明主键的自增长类型--> <generator class="identity"/> </id> <!--以下为普通字段的关联--> <property name="username" type="string"> <column name="username" length="100" /> </property> <property name="password" type="string"> <column name="password" length="100" /> </property> </class> </hibernate-mapping>

            7、加入hibernate.cfg.xml配置文件

    <?

    xml version='1.0' encoding='gb2312'?> <!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> <!--配置数据库网络连接的url--> <property name="hibernate.connection.url">jdbc:mysql://localhost/hib</property> <!--配置数据库网络连接的用户名,默认一般为root--> <property name="hibernate.connection.username">root</property> <!--配置数据库网络连接的密码--> <property name="hibernate.connection.password">root</property> <!--配置数据库网络连接池的大小--> <property name="hibernate.connection.pool.size">20</property> <!--后台是否显示sql,开发时为true,执行时为false--> <property name="hibernate.show_sql">true</property> <!-- 设置JDBC的隔离级别--> <property name="hibernate.connection.isolation">2</property> <property name="hibernate.format_sql">true</property> <property name="jdbc.fetch_size">50</property> <property name="jdbc.batch_size">25</property> <property name="jdbc.use_scrollable_resultset">false</property> <property name="connection.useUnicode">true</property> <!--编码方式。最好是utf-8,用gb2312有的字符不全--> <property name="connection.characterEncoding">UTF-8</property> <!--数据库方言。每一个数据库都有方言,hibernate已经为大多数数据库指明了方言--> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <mapping resource="edu/eurasia/model/UserInfo.hbm.xml" /> </session-factory> </hibernate-configuration>

          8、公共类文件HibernateUtil.java
    package edu.eurasia.utils;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
    	public static Session getSession() {
    		SessionFactory sessions = new Configuration().configure()
    				.buildSessionFactory();
    		Session session = sessions.openSession();
    		return session;
    	}
    	
    	public static void close(Session session){  
            if(session!=null&&session.isOpen()){  
                session.close();  
            }  
        }  
    }
           9、建立測试HibTest.java

    package edi.eurasia.test;
    
    import org.junit.Test;
    
    import edu.eurasia.dao.UserInfoDao;
    import edu.eurasia.dao.implment.UserInfoDaoImpl;
    import edu.eurasia.model.UserInfo;
    
    public class HibTest {
    	private UserInfoDao userinfodao = new UserInfoDaoImpl();
    
    	 @Test
    	public void testSave() {
    		UserInfo userinfo = new UserInfo();
    		userinfo.setUsername("李可染");
    		userinfo.setPassword("123");
    		userinfodao.Save(userinfo);
    	}
    
    	 @Test
    	public void testUpdate() {
    		UserInfo userinfo = new UserInfo();
    		userinfo.setId(14);
    		userinfo.setUsername("李可染2");
    		userinfo.setPassword("123");
    		userinfodao.Update(userinfo);
    
    	}
    
    	 @Test
    	public void testDelete() {
    		UserInfo userinfo = new UserInfo();
    		userinfo.setId(14);
    		userinfodao.delete(userinfo);
    	}
    
    	//@Test
    	public void testGet() {
    		userinfodao.Get(21);
    	}
    	
    	@Test
    	public void testLoad() {
    		userinfodao.Load(1);
    	}
    	
    	@Test
    	public void testQueryAll() {
    		//userinfodao.QueryAll("from UserInfo ");
    		userinfodao.QueryAll("select u from UserInfo u");
    	}
    }
    

            10、执行測试结果

            选中MybatisTest,右键->Run AS->JUnit Test 。注意:測试时,一个一个測试。測试一个是时候,能够屏蔽另外几个。


          project结构图例如以下:

             11、   补充:DAO工厂类

          在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才干完毕数据库操作。这时就必须知道详细的子类,对于后期的改动非常不方便。

          使用DAO工厂类,能够比較方便地对代码进行管理,并且能够非常好地解决后期改动的问题,通过该DAO工厂类的一个静态方法来获取DAO实现类实例。这时假设要替换DAO实现类,仅仅须要改动该Dao工厂类中的方法代码,而不必改动所有的操作数据库代码。

           能够补充以一个DAO工厂类,例如以下:

    package edu.eurasia.utils;
    
    import edu.eurasia.dao.UserInfoDao;
    import edu.eurasia.dao.implment.UserInfoDaoImpl;
    
    public class DAOFactory {
    	 public static  UserInfoDao getUserInfoDaoInstance(){
             return new UserInfoDaoImpl();
      }
    }
          那么,上述測试HibTest.java改动例如以下:

    package edi.eurasia.test;
    
    import org.junit.Test;
    
    import edu.eurasia.model.UserInfo;
    import edu.eurasia.utils.DAOFactory;
    
    public class HibTest {
    	// private UserInfoDao userinfodao = new UserInfoDaoImpl();
    
    	// @Test
    	public void testSave() {
    		UserInfo userinfo = new UserInfo();
    		userinfo.setUsername("沈  周");
    		userinfo.setPassword("12356");
    		// userinfodao.Save(userinfo);
    		DAOFactory.getUserInfoDaoInstance().Save(userinfo);
    	}
    
    	// @Test
    	public void testUpdate() {
    		UserInfo userinfo = new UserInfo();
    		userinfo.setId(25);
    		userinfo.setUsername("李可染2");
    		userinfo.setPassword("12356");
    		// userinfodao.Update(userinfo);
    		DAOFactory.getUserInfoDaoInstance().Update(userinfo);
    	}
    
    	// @Test
    	public void testDelete() {
    		UserInfo userinfo = new UserInfo();
    		userinfo.setId(25);
    		// userinfodao.delete(userinfo);
    		DAOFactory.getUserInfoDaoInstance().delete(userinfo);
    	}
    
    	// @Test
    	public void testGet() {
    		// userinfodao.Get(21);
    		DAOFactory.getUserInfoDaoInstance().Get(28);
    	}
    
    	<span style="font-family:Comic Sans MS;">//</span> @Test
    	public void testLoad() {
    		// userinfodao.Load(1);
    		DAOFactory.getUserInfoDaoInstance().Load(28);
    	}
    
    	@Test
    	public void testQueryAll() {
    		// userinfodao.QueryAll("from UserInfo ");
    		// userinfodao.QueryAll("select u from UserInfo u");
    		DAOFactory.getUserInfoDaoInstance()
    				.QueryAll("select u from UserInfo u");
    	}
    }
    
            哈哈,代码是不是清晰多了大笑






           





查看全文
  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10875268.html
  • Copyright © 2011-2022 走看看