java数据操作——Hibernate与JDBC

  这是我第一次写技术博文,喜欢大家提出宝贵意见。这篇文章主要想讲三个问题。

   第一:Hibernate和JDBC的区别。

   作为java程序员,我觉得弄清楚Hibernate与JDBC的区别,不仅对打好扎实的基本功比较重要,就是以后的学习,开发也具有相当的借鉴意义。可惜的是现在有好些程序员不屑于学习JDBC,觉得它落伍了,在他们的心目中Java数据库连接始祖(JDBC)远没有ORM(对像/关系映射)连接工具(比如Hibernate)来的重要。其实这绝对是一种误解,在我开来JDBC与Hibernate无论什么时候都是同等重要的。至少如果你想深入研究Hibernate,那么你就不可避免要研究JDBC。如果说上面是一种无奈的选择的话,下面我就将Hibernate与JDBC的关系对比一下,让你能在她们中间做出一个更为合理的选择。

     Hibernate是对JDBC的封装。所以 JDBC与Hibernate在性能上相比,JDBC灵活性有优势。而Hibernate在易学性,易用性上有些优势。当用到很多复杂的多表联查和复杂的数据库操作时,JDBC有优势。最后我给出一个建议就是:如果系统要想灵活、复杂的操作数据,并且系统的模块对象不是非常明晰,建议使用JDBC,如果系统中有很多的模型对象,存在大量的业务逻辑,建议使用Hibernate

第二 JDBC数据操作工具类

    正如标题所说,本文主要目的就是想构建起简单的java数据操作思想。废话少说,我们还是来看源码吧。以下代码已经过测试,可以下载使用。

JDBC.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <dbtype>Sqlserver</dbtype>
   <ip>localhost</ip>
   <port>1433</port>
   <sqlname>Test</sqlname>
   <username>sa</username>
   <userpassword>kemi@123</userpassword>
</root>

自定义异常

package HDSX.Exception;

public class messageException extends Exception {
private static final long serialVersionUID = 1L;
private String message;
public messageException(String message,Throwable cause)
{
 super(message,cause);
 this.message=message;
}
public String toString()
{
 return this.message; 
}
}

读取XML文件的操作了

package HDSX.Util;

import java.net.URL;
import java.util.Properties;

import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import HDSX.Exception.messageException;

import javax.xml.parsers.SAXParser;

public class XMLConfigure {
private Properties properties;
 
public XMLConfigure(String fileName) throws messageException {
 properties=new Properties();
 try {
  ParseXml(fileName);
 } catch (Exception e) {
  // TODO Auto-generated catch block
  throw new messageException("解析xml文件时出错",e.getCause());
 }
}
private void ParseXml(String fileName) throws Exception
{
 XMLParser parserHander=new XMLParser();//解析器
 SAXParserFactory factory=SAXParserFactory.newInstance();//获取基于 SAX 的解析器的工场类
 factory.setNamespaceAware(false);// 指定由此代码生成的解析器将提供对 XML 名称空间的支持
 factory.setValidating(false);//  指定由此代码生成的解析器将验证被解析的文档
 SAXParser parser=factory.newSAXParser();//初始化一个SAX的解析器
 URL url=XMLConfigure.class.getClassLoader().getResource(fileName);
 try
 {
   parser.parse(url.toString(),parserHander);//关联解析器与xml文件
   properties=parserHander.getProp();
 }
 catch (Exception e) {
  factory=null;
  parser=null;
  parserHander=null;
 } 
}
/*
 * 通过键得到相关的值
 */
public String getParameter(String key)
{
 return properties.getProperty(key);
}

private class XMLParser extends DefaultHandler
 {
  private Properties prop;
  private String currentName;
  private StringBuffer currentValue = new StringBuffer();
  /*
   * 初始化XML解析器
   */
  public XMLParser() {
    this.prop=new Properties();
  }
  public Properties getProp() {
   return prop;
  }
     /*
      * 开始解析XML文件节点
      * (non-Javadoc)
      * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
      */
  @Override
  public void startElement(String uri, String localName, String name,
    Attributes attributes) throws SAXException {
   // TODO Auto-generated method stub
   currentValue.delete(0,currentValue.length());
   currentName=name;
  }
  /*
   * 接收元素中字符数据
   * (non-Javadoc)
   * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int)
   */
  @Override
  public void characters(char[] ch, int start, int length)
    throws SAXException {
   // TODO Auto-generated method stub
       currentValue.append(ch,start,length);
  }

     /*
      * 将xml数据插入到Properties对象中
      * (non-Javadoc)
      * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
      */
  @Override
  public void endElement(String uri, String localName, String name)
    throws SAXException {
   // TODO Auto-generated method stub
   prop.put(currentName.toLowerCase().trim(),currentValue.toString().trim());
  }
 }
}
JDBC工具类

package HDSX.Util;

import java.lang.reflect.Array;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import HDSX.Exception.messageException;

/**
 * @author Administrator
 *
 */
public class JDBCUtil {
private XMLConfigure xc;
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
public JDBCUtil(String configurePath) {
 try {
  xc=new XMLConfigure(configurePath);
  getConnection();
 } catch (messageException e) {
  // TODO Auto-generated catch block
  System.out.println(e);
 }
 
}
/**
 * 设置事务机制
 * @param commitAuto ture为自动提交,false为手动提交
 * @throws SQLException
 */
public void setCommitAuto(Boolean commitAuto) throws SQLException {
   con.setAutoCommit(commitAuto);
}
/**
 * 手动提交事务
 * @throws SQLException
 */
public void commit() throws SQLException
{
  con.commit();
}

/**
 * 实现事务回滚
 * @throws SQLException
 */
public void rollBack()
{
 try {
  con.rollback();
 } catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

/**
 * 关闭相关资源
 */
public void close()
{
 if(rs!=null) try{rs.close();} catch (Exception e) {}
 if(ps!=null) try {ps.close();} catch (SQLException e) {}
 if(con!=null)try{con.close();} catch (Exception e2) {}
}
/**关闭结果集
 * @param rs
 */
public void colse(ResultSet rs)
{
  if(rs!=null) try{rs.close();} catch (Exception e) {} 
}
/**
 * 得到数据连接
 */
private void getConnection()
{
  StringBuffer StrCon=new StringBuffer();
  String dirverStr = null;
 //"jdbc:sqlserver://localhost:1433;databaseName=Test;user=sa;password=kemi@123;"
 if(xc.getParameter("dbtype").equals("Sqlserver")) {
  StrCon.append("jdbc:sqlserver://").append(xc.getParameter("ip"))
  .append(":").append(xc.getParameter("port"))
  .append(";databaseName=").append(xc.getParameter("sqlname"))
  .append(";user=").append(xc.getParameter("username"))
  .append(";password=").append(xc.getParameter("userpassword"));
  dirverStr="com.microsoft.sqlserver.jdbc.SQLServerDriver";
 }
 else if(xc.getParameter("dbtype").equals("Oracle"))
 {
   StrCon.append("jdbc:oracle:thin:@").append(xc.getParameter("ip"))
  .append(":").append(xc.getParameter("port"))
  .append(":").append(xc.getParameter("sqlname"))
  .append(";user=").append(xc.getParameter("username"))
  .append(";password=").append(xc.getParameter("userpassword"));
   dirverStr="oracle.jdbc.driver.OracleDriver";
 }
 try {
  Class.forName(dirverStr);
  con=DriverManager.getConnection(StrCon.toString());
 } catch (Exception e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
}

/**
 * 得到无参查询结果
 * @param sql
 * @return
 * @throws SQLException
 */
public ResultSet executeQuery(String sql) throws SQLException
{
   ps=con.prepareStatement(sql);
   rs=ps.executeQuery();
   return rs;
}

/**
 * 得到有参查询结果
 * @param sql
 * @param parameterArray 参数数组
 * @return
 * @throws SQLException
 */
public ResultSet executeQuery(String sql,Object[] parameterArray) throws SQLException
{
  ps=con.prepareStatement(sql);
  for(int i=0;i<Array.getLength(parameterArray);i++)
  {
   ps.setObject(i+1,parameterArray[i]);
  }
     rs=ps.executeQuery();
  return rs;
}
/**
 * 执行更新操作
 * @param sql
 * @param parameterArray 参数数组
 * @return
 * @throws SQLException
 */
public void executeUpdate(String sql,Object[] parameterArray) throws SQLException
{
  ps=con.prepareStatement(sql);
  for(int i=0;i<Array.getLength(parameterArray);i++)
  {
           ps.setObject(i+1,parameterArray[i]);
  }
     ps.executeUpdate();
}
/**
 * 批处理更新
 * @param sql
 * @param parameterArray
 * @param count
 * @throws SQLException
 */
public void executeUpdate(String sql,Object[][] parameterArray,int count) throws SQLException
{
 ps=con.prepareStatement(sql);
 for(int i=0;i<Array.getLength(parameterArray);i++)
 {
  for(int j=0;j<Array.getLength(parameterArray[i]);j++)
  {
          ps.setObject(j+1,parameterArray[i][j]);
          ps.addBatch();
  }
  if(i%count==0) ps.executeBatch();
 }
}
}

测试代码

package HDSX.Util;

import java.sql.ResultSet;
import java.sql.SQLException;

public class UtilTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
     JDBCUtil util=new JDBCUtil("HDSX/Util/JDBC.xml");
     String sql="select * from t_user";
     //测试查询
     ResultSet rs=null;
     try {
  rs=util.executeQuery(sql);
  while(rs.next())
  {
   System.out.println(rs.getString("name"));
  }
 } catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 finally
 {
  util.colse(rs);
 }
 //测试更新
 sql="insert into t_user(id,name,age) values(?,?,?)";
 Object[] paraArray={"sd005","张三","25"};
 try {
  util.setCommitAuto(false);
  util.executeUpdate(sql, paraArray);
  util.commit();
 } catch (SQLException e) {
  // TODO Auto-generated catch block
   util.rollBack();
   e.printStackTrace();
 }
 }

}

     今天就写到这里,关于Hibernate的例子我会尽快写出。这是我第一次写技术博文,其中难免有理解偏颇的地方,喜欢大家指正,进行交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值