【java源码】对mysql数据库的封装(精华版)

数据库连接是件很麻烦的事,特别是封装数据库,让我们java编程不再有烦恼


代码如下:

import java.sql.Connection;

public class JDBC {
	private final String drive="com.mysql.jdbc.Driver";
	private final String url="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8";
	private final String name="root";
	private final String password="123456";
	private Connection con=null;
	
	public JDBC(){//构造方法加载数据库驱动		
		try {
			Class.forName(drive).newInstance();
		} catch (Exception e) {		
			System.out.println("数据库加载失败!");			
		}		
	}	
	public boolean creatConnection(){//创建数据库连接
		
		try {
			con=DriverManager.getConnection(url,name,password);
			con.setAutoCommit(true);
		} catch (SQLException e) {
			
		}
		return true;
	}
	public boolean executeUpdate(String sql){//对数据表的增加,修改和删除的操作
		if(con==null){
			creatConnection();		
		}
		try{
			Statement s=con.createStatement();
			int i=s.executeUpdate(sql);
			System.out.println("操作成功,所影响的记录数为:"+String.valueOf(i));
			return true;
		}catch(Exception e){
			return false;
		}
		
	}	
	
	
	
		
	public ResultSet executeQuery(String sql){//数据库的查询操作
		ResultSet rs;
		try{
			if(con==null){
			creatConnection();		
			}
			Statement s=con.createStatement();
			 rs=s.executeQuery(sql);		
		 	return rs;
		}catch(Exception e){
			return null;		
		}	
			
	}


	public void closeConnection(){//关闭数据库连接
		if(con==null){		
			try {
				con.close();
			}catch (SQLException e) {
			}		
		}
	}	
	
basedao封装

import java.lang.reflect.Field;
import java.net.URL;
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.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * 基础DAO类
 * @author LYF
 */
public class BaseDao {
	
	/**
	 * 连接数据库的URL
	 */
	private static String url;

	/**
	 * 登录数据库用户名
	 */
	private static String user;

	/**
	 * 登录数据库密码
	 */
	private static String password;

	/**
	 * 所有线程共享的线程容器
	 */
	private static ThreadLocal<Map<String, Object>> threadLocal = null;

	//静态块中实例化线程容器并装载数据库驱动
	static {
		init();
	}
	
	private static void init(){
		threadLocal = new ThreadLocal<Map<String, Object>>();
		try {
			Properties pro=new Properties();
			pro.load(ClassLoader.getSystemResource("db.properties").openStream());
			user=pro.getProperty("user");
			password=pro.getProperty("password");
			url=pro.getProperty("url");
			Class.forName(pro.getProperty("driver"));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 获取连接对象Connection
	 * @return
	 * @throws SQLException
	 */
	public Connection getConnection() throws SQLException {
		//从线程中取出保存数据
		Map<String, Object> threadMap = threadLocal.get();
		if (null == threadMap) {
			threadMap = new HashMap<String, Object>();
			threadLocal.set(threadMap);
		}
		Connection conn = (Connection) threadMap.get("conn");
		if (null == conn || conn.isClosed()) {
			conn = DriverManager.getConnection(url, user, password);
			threadMap.put("conn", conn);
		}
		return conn;
	}

	/**
	 * 泛型方法(执行查询DQL)
	 * @param <T>
	 * @param cla
	 * @param sql
	 * @param params
	 * @return
	 * @throws SQLException
	 */
	public <T> List<T> executeQuery(Class<T> cla, String sql, Object... params)
			throws SQLException {
		//获取连接对象
		Connection conn = this.getConnection();
		//创建预编译语句对象
		PreparedStatement pstat = conn.prepareStatement(sql);
		// 将产生的语句对象放置到线程中
		PreparedStatement oldpstat = (PreparedStatement) threadLocal.get().put("pstat", pstat);
		//如果线程中有旧的语句对象则关闭它
		if (null != oldpstat)oldpstat.close();
		// 设置预编译占位符参数(参数从1开始)
		for (int i = 0; i < params.length; i++) {
			pstat.setObject(i + 1, params[i]);
		}
		
		List<T> list = new ArrayList<T>();
		//执行查询返回结果集
		ResultSet res = pstat.executeQuery();
		//将结果集放置到线程中
		ResultSet oldRes = (ResultSet) threadLocal.get().put("res", res);
		//如果线程中有旧的结果集则关闭它
		if (null != oldRes)oldRes.close();
		
		//获取结果集元数据
		ResultSetMetaData rsmd=res.getMetaData();
		//返回结果集中字段数量(列的数量)
		int colNum=rsmd.getColumnCount();
		try {
			T t = null;
			while (res.next()) {//遍历结果集中的所有记录
				t = cla.newInstance();//每循环一次生成一个实体对象
				for(int i=0;i<colNum;i++){//循环记录中的每个字段
					//取出字段的名称
					String fieldName=rsmd.getColumnLabel(i+1);
					//取出字段的值
					Object object=res.getObject(fieldName);
					//获取实体类的字段
					Field field=cla.getDeclaredField(fieldName);
					//打开private权限的字段访问权限
					field.setAccessible(true);
					//设置实体类对象字段属性值
					field.set(t, object);
				}
				list.add(t);//将实体对象添加的返回列表中
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (NoSuchFieldException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	/**
	 * 执行增删改(DML)
	 * @param sql
	 * @param params
	 * @return
	 */
	public int executeUpdate(String sql,Object... params) throws SQLException{
		Connection conn = this.getConnection();
		PreparedStatement pstat = conn.prepareStatement(sql);
		PreparedStatement oldpstat = (PreparedStatement) threadLocal.get().put("pstat", pstat);
		if (null != oldpstat)oldpstat.close();
		for (int i = 0; i < params.length; i++) {
			pstat.setObject(i + 1, params[i]);
		}
		//执行DML返回影响行数
		return pstat.executeUpdate();
	}
	
	/**
	 * 执行增加(insert)并且返回主键
	 * @param sql
	 * @param params
	 * @return
	 */
	public int[] executeInsert(String sql,Object... params) throws SQLException{
		Connection conn = this.getConnection();
		PreparedStatement pstat = conn.prepareStatement(sql,PreparedStatement.RETURN_GENERATED_KEYS);
		PreparedStatement oldpstat = (PreparedStatement) threadLocal.get().put("pstat", pstat);
		if (null != oldpstat)oldpstat.close();
		for (int i = 0; i < params.length; i++) {
			pstat.setObject(i + 1, params[i]);
		}
		//返回影响行数(就是插入的记录数量)
		int count=pstat.executeUpdate();
		//定义保存数据库生成的主键的数组
		int[] keys=new int[count];
		//获取主键结果集
		ResultSet res=pstat.getGeneratedKeys();
		//将结果集放置到当前线程中
		ResultSet oldRes = (ResultSet) threadLocal.get().put("res", res);
		if(null!=oldRes)oldRes.close();
		//遍历结果集,将结果集合中的所有主键取出来放到数组中
		for(int i=0;res.next();i++){
			keys[i]=res.getInt(1);
		}
		return keys;
	}
	
	/**
	 * 关闭所有的连接(从线程中取出所有JDBC对象并关闭它们)
	 * @throws SQLException
	 */
	public void closeAll() throws SQLException{
		Map<String,Object> map=threadLocal.get();
		Connection conn=(Connection)map.get("conn");
		PreparedStatement pstat=(PreparedStatement)map.get("pstat");
		ResultSet res=(ResultSet)map.get("res");
		if(null!=res)res.close();
		if(null!=pstat)pstat.close();
		if(null!=conn)conn.close();
	}
}

}

百度贴吧欢迎提问?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

子兮曰

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值