DBTools

package com.oracle.tools;
import java.io.InputStream;
import java.lang.reflect.Field;
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.List;
import java.util.Properties;

/**
 * 
 * DBTools: database 数据库 工具类
 * 
 * @author Administrator
 * 
 *         理解封装的好处
 * 
 */
public class DBTools {
	// 将 三个参数 提取出去 作为全局 静态变量
	private static String URL = null;
	private static String USERNAME = null;
	private static String PASSWORD = null;
	private static String DRIVER = null;
	
	private static Connection conn;// 连接
	private static PreparedStatement ps;// 预编译
	private static ResultSet rs;// 结果集
	// java 中 什么 只执行一次
	// 静态块儿
	static {
		InputStream ips = DBTools.class.getClassLoader().getResourceAsStream("config/jdbc.properties");
		//重点
		Properties p = new Properties();//java中的工具类 用来 读取 字节流 或 字符流中  的 内容的
		
		try {
			//通过 反射 来获取 字符流
			p.load(ips);
		
			DRIVER = p.getProperty("jdbc.driver");
			URL = p.getProperty("jdbc.url");
			USERNAME =p.getProperty("jdbc.username");
			PASSWORD = p.getProperty("jdbc.password");
		
			Class.forName(DRIVER);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 最终的目的就是 获取 Connection 设计 个方法 来 获取 连接

	// 封装 通过这个 方法 获取 Connection 对象
	public static Connection getConnection() {
		Connection conn = null;// 初始化一个 Connection
		try {
			conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 万能方法:
	 * 
	 * 封装 : 增 删 改 的万能方法
	 * 
	 * 入参: 形参 String sql
	 */

	public static boolean executeUpdate(String sql, Object... objs) {
		// 获取连接
		conn = DBTools.getConnection();
		int result = 0;
		try {
			ps = conn.prepareStatement(sql);
			// 给 ? 赋值 没写
			for (int i = 0; i < objs.length; i++) {
				ps.setObject(i + 1, objs[i]);
			}
			// 发送 并执行sql语句
			result = ps.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		}

		DBTools.close(conn, ps, null);

		return result > 0 ? true : false;
	}

	/**
	 * 万能查询方法
	 * 
	 * 返回一条记录
	 * 
	 * T 是泛型 什么类型都可以(万能)
	 * 
	 * <T> 的意思是 告诉 当前jvm虚拟机这是一个 用了 泛型的方法
	 * 
	 * @param sql
	 *            语句
	 * @param params
	 *            参数
	 * @param c
	 *            反射类型
	 * @throws Exception
	 * 
	 *             select * from person where uname= ? and password = ?;
	 * 
	 *             orm 映射工具
	 * 
	 */

	public static <T> T queryOne(String sql, Class<T> c, Object... params)
			throws Exception {
		// 定义一个泛型
		T t = null;// 初始化一个泛型

		// 获取连接
		conn = DBTools.getConnection();
		// 预编译
		ps = conn.prepareStatement(sql);
		// 遍历 动态参数 params
		if(null != params){
			for (int i = 0; i < params.length; i++) {
				// 什么类型 都可以赋值给 ? 问号
				// 给 ? 赋值
				ps.setObject(i + 1, params[i]);
			}
		}
		// 赋值后 就可以正常的 完成 查询操作
		rs = ps.executeQuery();// 根据条件查询结果集

		ResultSetMetaData metaDate = rs.getMetaData();// 元数据 字段名, 类型

		int count = metaDate.getColumnCount();// 字段的个数

		while (rs.next()) {
			t = c.newInstance();// 实例化一个 对象
			for (int i = 1; i <= count; i++) {// 遍历 字段的个数
				String col_name = metaDate.getColumnName(i); // 获取字段的名字
				Object col_val = rs.getObject(i);// 获取 次列中的值

				Field f = c.getDeclaredField(col_name);// 获取 指定 名字的属性对象

				f.setAccessible(true);// 设置权限 ,私有属性 或 公有属性都可以赋值

				f.set(t, col_val);// 给 实体类中的所有属性赋值
			}
		}
		return t;
	}

	/**
	 * 万能查询方法
	 * 
	 * 返回多条记录
	 * 
	 * select * from person
	 * 
	 * select * from person where uname like ? 模糊查询 返回多条记录
	 * 
	 * select * from person limit ?,?; 分页也是返回多条记录
	 * 
	 * select * from person where uname like ? limit ?,?
	 * 
	 * @throws Exception
	 * 
	 *             orm 映射思想 赋值 给 实体
	 * 
	 */

	public static <T> List<T> queryList(String sql, Class<T> c,
			Object... params) throws Exception {
		List<T> list = new ArrayList<>();
		T t = null;
		// 获取连接
		conn = DBTools.getConnection();

		ps = conn.prepareStatement(sql);

		// 给 ? 赋值
		if(null != params){
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}
		}

		// 查询
		rs = ps.executeQuery();

		// 元数据 来 获取 字段的个数
		ResultSetMetaData metaData = rs.getMetaData();

		int count = metaData.getColumnCount();// 字段的个数

		// 通过 结果集 来获取数据
		while (rs.next()) {

			t = c.newInstance();

			for (int i = 1; i <= count; i++) { // 字段的个数

				String col_name = metaData.getColumnName(i);

				Object col_val = rs.getObject(i);

				// 通过反射 给 属性赋值
				Field f = c.getDeclaredField(col_name);

				// 权限问题
				f.setAccessible(true);

				// 给属性赋值操作
				f.set(t, col_val);
			}

			// 向集合中添加 数据
			list.add(t);
		}
		return list;
	}

	
	// 资源的关闭 关闭 资源 不需要 返回值
	// 关闭 什么呢 ? Connection , Statement , ResultSet 所以 要当作 入参传入进来
	public static void close(Connection conn, PreparedStatement ps, ResultSet rs) {
		// 在方法入参 的地方 定义 形参 ,
		try {
			if (null != rs) { // 这样写 不会出现 空指针异常
				rs.close();
			}
			if (null != ps) {
				ps.close();
			}
			if (null != conn) {
				conn.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
jdbc.properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/java18?characterEncoding=utf8&useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=678
  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论
PenguinsDbTools使用说明 第一章 工具配置 下载地址: https://sourceforge.net/projects/penguinsdbtools/ 1.1 数据库连接配置 作者邮件: cuishuangjia@gmail.com 1.2 数据库导入配置 合作公司: http://www.cncsys.com.cn/ 1.3 数据库导出配置 1.4 其它配置 第二章 表的设计 2.1 表的设计 2.1.1 追加设计 2.1.2 应用 2.2 全展开 2.2.1 查看表结构 2.2.2 复制表名和字段 2.2.3 无条件查询单表中所有数据 2.2.4 设计表数据字段约束 2.2.5 查询表中的记录件数 2.3 根据表设计的SQL进行单表检索 2.4 重置表结构 2.5 取得快照信息到工具中 2.6 SQL文窗口 第三章 SQL文窗口 3.1 全展开(同2.2) 3.2 整形 3.3 执行 3.4 历史 3.5 激活SQL窗口方式 第四章 表数据的导出处理 4.1 根据表设计导出 4.1.1 导出到EXCEL中 4.1.1.1 导出到同一张SHEET中 4.1.1.2 每个表都做为单独的文件导出 4.1.1.3 大数据导出(数据分页) 4.1.2 导出到文本文件 4.1.2.1 导出到同一张SHEET中 4.1.2.2 每个表都做为单独的文件导出 4.1.2.3 大数据导出(数据分页) 4.2 根据SQL文件执行或导出 4.2.1 根据含有检索SQL的文件导出EXCEL 4.2.2 根据含有检索SQL的文件导出文本文件 4.2.3 执行含有非检索SQL的文件 4.3 全字段补值 4.4 表数据定时导出 第五章 表数据的导入处理 5.1 手动造数据,导入到数据库中 5.2 表数据定时导入(与4.4相似) 第六章 表数据的差分 6.1 EXCEL差分 6.2 文本文件差分

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

白纸画江湖

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值