这是我第一次写技术博文,喜欢大家提出宝贵意见。这篇文章主要想讲三个问题。
第一: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的例子我会尽快写出。这是我第一次写技术博文,其中难免有理解偏颇的地方,喜欢大家指正,进行交流。