版权声明:本文为博主原创文章。未经博主同意不得转载。 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结构图例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvendzendz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" align="middle" />

        
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");
}
}

        哈哈,代码是不是清晰多了

       

第二十五天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)的更多相关文章

  1. 第三十一天 慵懒的投射在JDBC上的暖阳 —Hibernate的使用(四)

    6月19日,小雨."黄梅时节家家雨.青草池塘处处蛙.有约不来过夜半,闲敲棋子落灯花." 面向对象无限包容的个性,给对SQL和数据库一窍不通的澳大利亚人Gavin King创造了极大 ...

  2. NeHe OpenGL教程 第二十五课:变形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. javaSE第二十五天

    第二十五天    399 1:如何让Netbeans的东西Eclipse能访问.    399 2:GUI(了解)    399 (1)用户图形界面    399 (2)两个包:    399 (3) ...

  4. Gradle 1.12用户指南翻译——第二十五章. Scala 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  5. SQL注入之Sqli-labs系列第二十五关(过滤 OR & AND)和第二十五A关(过滤逻辑运算符注释符)

    开始挑战第二十五关(Trick with OR & AND) 第二十五关A(Trick with comments) 0x1先查看源码 (1)这里的or和and采用了i正则匹配,大小写都无法绕 ...

  6. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  8. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

随机推荐

  1. 重写原生alert,弹出层过一会就消失

    window.alert = function(str) { if(document.querySelectorAll("div.shieldClass").length!=0){ ...

  2. 设置cookie,获取cookie

    封装cookie获取方法一 function getCookie(key) { var key = encodeURIComponent(key); var result; var pairs = d ...

  3. how to prevent lowmemorykiller from killing processes

    Hi there, I've upgraded a number of test systems to the latest Saucy beta. I've seen quite a few cas ...

  4. flex 的经典用法

    Document   11 21 31 41 51 61 71 81 91 101 111 121 131 141 151 161 171 181 191 201 211 221 231 241 25 ...

  5. 2018-8-10-git-push-错误-hook-declined-

    title author date CreateTime categories git push 错误 hook declined lindexi 2018-08-10 19:16:52 +0800 ...

  6. 解决 Failed to load class "org.slf4j.impl.StaticLoggerBinder"

    我们在使用日志记录网站或者应用时,有时候启动会出现这个告警: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&q ...

  7. day01 python初识、数据类型、流程控制

    今日内容大纲:1,计算机基础. cpu,内存,硬盘,操作系统.2,python的发展与应用.3,python的历史. 2008年python同时更新了两个版本 1,python2x python3x ...

  8. Redis端口配置

    redis.host=192.168.200.128redis.port=6379redis.pass=redis.database=0redis.maxIdle=300redis.maxWait=3 ...

  9. PHP面向对象:instanceof 运算符

    http://www.nowamagic.net/php/php_InstanceofOperator.php 在PHP5中,通过方法传递变量的类型有不确定性.于是我们很难判断,一些操作是否可以运行. ...

  10. HTTP详解教程 / HTTP 响应头信息 HTTP 响应头信息

    HTTP请求头提供了关于请求,响应或者其他的发送实体的信息. 在本章节中我们将具体来介绍HTTP响应头信息.直线电机哪家好 应答头 说明 Allow 服务器支持哪些请求方法(如GET.POST等). ...