您的位置:首页 > 编程语言 > Java开发

java JDBC通用BaseDao升级版0.3

2016-04-01 12:59 393 查看
,此次升级为了解决查询时每次都要转成对象集合,实现方式泛型加反射(那个流行的框架又没用到反射呢),能反射对象就能反射SQL语句,能反射SQL语句你和hibernate框架就很接近

package com.sun.dao;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Vector;
/**
* @author  sun bo
* @version 1.3, 2015/12/21
* 这次升级为了解决每次查询是都要换成对象集合的烦恼
*/
public class BaseDao<T>{
final String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
private String ip = "localhost";
private String databaseName;
private String user = "sa";
private String password = "123456";

/**
* 用于构建连接数据库
*
* @param ip
*            数据库地址
* @param databaseName
*            数据库的库名
* @param user
*            数据库登陆用户名
* @param password
*            数据库密码
*/
public BaseDao(String ip, String databaseName, String user, String password) {
super();
this.ip = ip;
this.databaseName = databaseName;
this.user = user;
this.password = password;
}

/**
* 这个构造用于连接本机的数据库
*
* @param databaseName
*            :数据库名
*/
public BaseDao(String databaseName) {
super();
this.databaseName = databaseName;
}

/**
* 用于创建连接对象
*
* @return Connection
* @throws SQLException
*/
private Connection createConnection() throws SQLException {

return DriverManager.getConnection("jdbc:sqlserver://" + ip
+ ":1433;database=" + databaseName, user, password);

}

/**
* 此方法只能用于查询
*
* @param sql
*            :查询sql语句
* @param obj
*            :SQL语句给值
* @param sun
*          请传入你要查询的对象
* @return :list:
*          在list里放的是泛型对象,
* ...obj:应用JDK1.5新特性,可以传1个值或数组方便使用
*/
public ArrayList<T> excuteQuery(String sql,Object ...obj,Class<T> sun)
{
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
try{
Class.forName(driver);
con=createConnection();
ps=con.prepareStatement(sql);
if(obj!=null&& obj.length>0)
{
for (int i = 0; i < obj.length; i++) {

ps.setObject(i+1, obj[i]);
}
}
rs=ps.executeQuery();
ArrayList list=new ArrayList();
if(rs!=null)
{
ResultSetMetaData data=rs.getMetaData();

while(rs.next())
{
//创建泛型对象
Object o=Class.forName(sun.getName()).newInstance();

//获得查询的数据库有多少列
int count=data.getColumnCount();
for (int i = 0; i < count; i++) {

//获得列名
String columnName=data.getColumnName(i+1);//id
//获得列值
Object value= rs.getObject(i+1); //setId
//生成要执行的方法,因为方法的的第二个单词大写所有需要转换大小写
String methodName="set"+columnName.replace(columnName.charAt(0)+"", new String(columnName.charAt(0)+"").toUpperCase());
//System.out.println(columnName.replace(columnName.charAt(0)+"", new String(columnName.charAt(0)+"").toUpperCase()));
//System.out.println(methodName);
//利用反射机制,生成setXX()方法的Method对象并执行该setXX()方法。
Method method=o.getClass().getMethod(methodName, value.getClass());
method.invoke(o, value);

}
list.add(o);
}
return list;
}else{
return null;
}

}catch(Exception e){
e.printStackTrace();
return null;
}finally{
if(rs!=null)
{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null)
{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null)
{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}
}

/**
* 此方法只能执行增删改
*
* @param sql
*            :查询sql语句
* @param obj
*            :SQL语句给值
* @return 真假:
*/
public boolean excuteUpdate(String sql, Object[] obj) {
Connection con = null;
PreparedStatement ps = null;
try {
Class.forName(driver);
con = createConnection();
ps = con.prepareStatement(sql);
if (obj != null && obj.length > 0) {
for (int i = 0; i < obj.length; i++) {

ps.setObject(i + 1, obj[i]);
}
}
int a = ps.executeUpdate();

if (a > 0) {
return true;

} else {
return false;
}

} catch (Exception e) {
e.printStackTrace();
return false;
} finally {

if(ps!=null)
{
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con!=null)
{
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: