操作数据库的模板方法

简介: jdbc.propertiesurl=jdbc:mysql://localhost:3306/cfmsuser=rootpassword=123456driverClass=com.mysql.jdbc.Driverpackage cn.edu.hactcm.base.utils;import java.io.InputStream;import java.sql.Con
jdbc.properties
url=jdbc:mysql://localhost:3306/cfms
user=root
password=123456
driverClass=com.mysql.jdbc.Driver



package cn.edu.hactcm.base.utils;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * CFMS    :Computer files management system
 * version :1.0 2013-2-19 上午08:44:27
 * 
 * 操作JDBC的工具类
 */
public class JdbcUtils {
	private JdbcUtils() {
	}

	private static String url;
	private static String user;
	private static String password;

	/*
	 * 静态代码块
	 */
	static {
		try {
			// 读取配置文件,通过类加载器的方式读取属性文件
			InputStream in = JdbcUtils.class.getClassLoader()
					.getResourceAsStream("jdbc.properties");
			Properties prop = new Properties();
			prop.load(in);
			url = prop.getProperty("url");
			user = prop.getProperty("user");
			password = prop.getProperty("password");

			// 注册驱动
			String driverClass = prop.getProperty("driverClass");
			Class.forName(driverClass);
			
			in.close();
			in = null;
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 * @return 获取与指定数据库的连接
	 * @throws SQLException
	 */
	public static Connection getConnection() throws SQLException {
		// url,user,password可以直接使用是因为上面定义成静态的了。
		Connection connection = DriverManager
				.getConnection(url, user, password);
		return connection;
	}
	
	/**
	 * @param rs  :结果集
	 * @param stmt:在程序中将使用PrepareStatement,其中Statement是其父类
	 * @param conn:数据库连接
	 */
	public static void release(ResultSet rs, Statement stmt, Connection conn) {
		// 判断结果集是否为空,如果不为空,关闭清空
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			rs = null;
		}
		// 判断声明是否为空,如果不为空,关闭清空
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			stmt = null;
		}
		// 判断连接是否为空,如果不为空,关闭清空
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			conn = null;
		}
	}
}



package cn.edu.hactcm.base.dao;

import java.sql.ResultSet;

/**
 * CFMS    :Computer files management system  
 * version :1.0 2013-2-19 上午10:02:31
 */
public interface ResultSetHandler {
	//处理结果集的方法
	public Object handle(ResultSet rs);
}



/**
 * 
 */
package cn.edu.hactcm.base.dao.impl;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import cn.edu.hactcm.base.dao.ResultSetHandler;

/**
 * CFMS :Computer files management system
 * version :1.0 2013-2-19 上午10:38:37
 * 
 * 取出第一行的所有记录存入一个Object数组
 */
@SuppressWarnings( { "unchecked", "unused" })
public class ArrayHandler implements ResultSetHandler {
	private Class clazz;

	public ArrayHandler(Class clazz) {
		this.clazz = clazz;
	}

	public Object handle(ResultSet rs) {
		try {
			if (rs.next()) {
				// 指向了第一行的记录
				// 获得元数据
				ResultSetMetaData metaData = rs.getMetaData();
				// 获得用于查询的sql中的字段列数
				int count = metaData.getColumnCount();
				// 创建数组
				Object[] arr = new Object[count];
				// 迭代所有列的值,存入数组
				for (int i = 1; i <= count; i++) {
					Object value = rs.getObject(i); // 获得指定列的值
					arr[i - 1] = value;
				}
				return arr;
			}
			return null;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}





/**
 * 
 */
package cn.edu.hactcm.base.dao.impl;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;

import cn.edu.hactcm.base.dao.ResultSetHandler;

/**
 * CFMS :Computer files management system
 * version :1.0 2013-2-19 上午10:38:37
 * 
 * 此助手类用于取得结果集中的第一条记录
 */
@SuppressWarnings("unchecked")
public class BeanHandler implements ResultSetHandler {
	private Class clazz;

	public BeanHandler(Class clazz) {
		this.clazz = clazz;
	}

	public Object handle(ResultSet rs) {
		// 不知道有几列数据,不知道列名,不知道封装到什么样的bean
		// 表的列明和javabean的字段名一致
		try {
			if(rs.next()) {
				// 创建bean
				Object bean = clazz.newInstance();
				// 封装数据
				// 获得结果集的元数据
				ResultSetMetaData metaData = rs.getMetaData();
				int count = metaData.getColumnCount();
				// 迭代取每一列的数据
				for(int i=1; i<=count; i++) {
					// 获得列名  username
					String columnName = metaData.getColumnName(i);
					// 获得数据 ddd
					Object value = rs.getObject(columnName);
					// 根据列名反射出映射的属性 username
					Field field = clazz.getDeclaredField(columnName);
					// 为属性赋值
					field.setAccessible(true);
					field.set(bean, value);
				}
				return bean;
			}
			return null;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}



package cn.edu.hactcm.base.dao.impl;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.List;

import cn.edu.hactcm.base.dao.ResultSetHandler;

/**
 * CFMS :Computer files management system
 * version :1.0 2013-2-19 上午10:07:19
 * 
 * 此助手类用于取得结果集中的记录的list列表集合,集合中的每个元素是数据库中的一条记录
 */
@SuppressWarnings("unchecked")
public class BeanListHandler implements ResultSetHandler {

	private Class clazz;

	public BeanListHandler(Class clazz) {
		this.clazz = clazz;
	}

	public Object handle(ResultSet rs) {
		try {
			// 取出结果集所有的记录,封装到bean,存入list返回
			List list = new ArrayList();
			while (rs.next()) {
				Object bean = clazz.newInstance();
				// 获得元数据
				ResultSetMetaData metaData = rs.getMetaData();
				// 获得列的数量
				int count = metaData.getColumnCount();
				// 遍历列
				for (int i = 1; i <= count; i++) {
					// 取列名
					String columnName = metaData.getColumnName(i);
					// 取这列的值
					Object value = rs.getObject(columnName);
					// 反射出属性
					Field field = clazz.getDeclaredField(columnName);
					// 设置属性
					field.setAccessible(true);
					field.set(bean, value);
				}
				// 加入list
				list.add(bean);
			}
			return list;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}





package cn.edu.hactcm.base.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import cn.edu.hactcm.base.dao.ResultSetHandler;
import cn.edu.hactcm.base.utils.JdbcUtils;


public class GenericDaoImpl {
	
	/**
	 * 用于处理公共的insert,update,delete操纵
	 * @param sql    :这里是传入的sql语句
	 * @param params :这里是参数数组
	 * @return
	 * @throws SQLException
	 */
	public static int update(String sql, Object[] params) throws SQLException {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			conn = JdbcUtils.getConnection();
			//预编译sql
			pstmt = conn.prepareStatement(sql);
			//将参数设置进去
			for (int i = 0; i < params.length; i++) {
				pstmt.setObject(i+1, params[i]);
			}
			//发送sql
			int num = pstmt.executeUpdate();
			return num;
		}  finally {
			JdbcUtils.release(rs, pstmt, conn);
		}
	}
	
	/**
	 * 用于处理公共"查询所有"的操作
	 * @param sql    :查询参数
	 * @param params :出入的id值
	 * @param rsh    :表示要实现那个结果封装类
	 * @return
	 * @throws SQLException
	 */
	public static Object query(String sql,Object[] params,ResultSetHandler rsh) throws SQLException{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			//获得连接
			conn = JdbcUtils.getConnection();
			//预编译sql
			pstmt = conn.prepareStatement(sql);
			//将参数设置进去
			for (int i = 0; params != null && i < params.length; i++) {
				pstmt.setObject(i+1, params[i]);
			}
			//发送sql
			rs = pstmt.executeQuery();
			//不知道别人想如何处理结果集
			//干脆想别人所要一个结果集的处理器
			//为了让当前代码继续,定义一个结果集处理器接口
			//策略模式,规定算法,具体的算法留给将来的调用者实现
			Object obj = rsh.handle(rs);
			return obj;
		} finally {
			//释放资源
			JdbcUtils.release(rs, pstmt, conn);
		}
	}
}







目录
相关文章
|
1月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
4月前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
421 2
|
1月前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
46 7
|
2月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
87 11
|
2月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
3月前
|
消息中间件 关系型数据库 数据库
Python实时监测数据库表数据变化的方法
在实现时,需要考虑到应用的实时性需求、数据库性能影响以及网络延迟等因素,选择最适合的方法。每种方法都有其适用场景和限制,理解这些方法的原理和应用,将帮助开发者在实际项目中做出最合适的技术选择。
184 17
|
3月前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
38 4
|
3月前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
|
2月前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
2月前
|
Java API 数据库
Data jpa 增删改查的方法分别有哪些
Data jpa 增删改查的方法分别有哪些