版权声明:本文为博主原创文章。未经博主同意不得转载。 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");
}
}

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

       

最新文章

  1. python基础之数据类型(二)
  2. MySQL3:索引
  3. PDO连接mysql和pgsql数据库
  4. EL表达式之sessionScope
  5. Vim保存只读模式下的修改
  6. UGUI之Toggle使用
  7. Java数组实现五子棋功能
  8. WARNING: Calls to any function that may require a gradient calculation inside a conditional block may return undefined results
  9. 利用dropbox备份vps数据
  10. mysql主从之主键冲突
  11. 通过Url传多个参数方法
  12. ubuntu 16.04 下载源
  13. linux C读取数据库
  14. Apache HTTP Server
  15. Centos6.4安装JDK
  16. Python数据类型之字符串
  17. SPI、IIC、IIS、UART、CAN、SDIO、GPIO、USB总线协议
  18. ATM+购物车商城
  19. Android:contentDescription 不是无用
  20. 制作根文件系统之Busybox init进程的启动过程分析

热门文章

  1. golang的数据类型之布尔类型
  2. 在学react时候找不到static/js/bundle.js
  3. VS进程附加的使用
  4. 理解 TCP/IP 三次握手与四次挥手
  5. Mac 安装cnpm
  6. canvas---从基础到实战
  7. 5分钟搞定android混淆(转)
  8. docker 安装 jenkins 笔记
  9. Mac上的Apache 开启,停止,重启
  10. 微信小程序学习笔记(二)--框架-全局及页面配置