版权声明:本文为博主原创文章。未经博主同意不得转载。 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. websocket 服务搭建

    链接过程 前端 1.CREATED WEBSOCKE 2.ONOPEN 3.ONMESSAGE 服务端 1.收到request 2.给客户端发送消息,生成id //msg { type: " ...

  2. Rikka with Nickname (简单题)

    Rikka with Nickname  链接:https://www.nowcoder.com/acm/contest/148/J来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒空间限制:C/ ...

  3. ReactOS 无法显示中文的问题

    其实非常简单, 实际上是因为包里面没有中文字体,所以输出文字都是乱码, 去 https://svn.reactos.org/optional/ 这里,下载ttf字体文件, 把字体文件放到源码中 mod ...

  4. 开源图标字体 uiw-iconfont v1.2.6 发布,新增图标

    uiw-iconfont v1.2.6 已发布,uiw-iconfont 是从 uiw 组件库抽离出来的图标字体,基于 svg 图片生成的图标字体. 更新内容 新增 map android-o das ...

  5. css的9个常用选择器

    1.类选择器(通过类名进行选择) <!DOCTYPE html> <html> <head> <title></title> </he ...

  6. 面试题:实现call、apply、bind

    面试题:实现call.apply.bind 实现bind module.exports = function(Tcontext, ...args) { let globalThis = typeof ...

  7. IMU预积分

    https://www.sohu.com/a/242760307_715754 http://www.sohu.com/a/243155537_715754 https://www.sohu.com/ ...

  8. linux 软件管理--yum工具及源码包

    目录 linux 软件管理--yum工具及源码包 一.yum基本概述 二.yum源的配置 三.yum实践案例 四.yum全局配置文件 五.yum签名检查机制 五.制作本地yum仓库 六.构建企业级yu ...

  9. 2019HDU多校训练第三场 Planting Trees 暴力 + 单调队列优化

    题意:有一个n * n的网格,每个网格中间有一颗树,你知道每棵树的高,你可以选择一个矩形区域把里面的树都围起来,但是矩形区域里面任意两棵树的高度差的绝对值不超过m,问这个矩形的最大面积是多少? 思路: ...

  10. mysql的几种锁

    由于对于mysql的锁机制了解的并不深入,所以翻阅了资料,整理一下自己所理解的锁.以mysql数据库的InnoDB引擎为例,因为InnoDB支持事务.行锁.表锁:且现在大部分公司使用的都是InnoDB ...