java JDBC通用BaseDao升级版0.3

,此次升级为了解决查询时每次都要转成对象集合,实现方式泛型加反射(流行的持久层框架都有反射),能反射对象就能反射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();
				}
			}
		}
	}

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日有所思的暖树

对您有帮助给点鼓励吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值