总结:此次构建工具类,难点在于查询,所需要的功能是 不管是 oracle还是mysql 都可以连接,并且 提供所需要的实体类,都可以将查询内容封装到实体类中去

遇到的难点  连接时,是从prpperties.txt文件中读取驱动url等 时,怎么将它加载进来 此时可以使用类加载器 来加载相应的文件  当前类.class.classloader().getResourceAsStream(文件地址:注意此时不是从src了s 是从 包名 开始写路径)

第二个难点:时在构建查询时,使用的数据库是oracle 查询到的列名是大写的,需要进行转换成小写的

      oracle 的 number 类型 在java中会解析成 BigDecimal,需要将它进行转换,然后转换成int

代码:

package com.briup.jdbc;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Field;
import java.math.BigDecimal;
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.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set; import oracle.net.aso.l; public class JDBCUtils3 {
// 获得链接
public static Connection getConnection(String str, String filePath) {
if ("mysql".equals(str)) {
try { Properties properties = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(filePath));
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
          // 自定义输入流可以替代类加载器加载(需要把文件放在包下)
// InputStream in =
// JdbcUtils2.class.getClassLoader().getResourceAsStream("com/briup/jdbc/properties.txt");
try {
properties.load(fis);
} catch (IOException e1) {
e1.printStackTrace();
}
String driver = (String) properties.get("driver");
String url = (String) properties.get("url");
String username = (String) properties.get("username");
String password = (String) properties.get("password"); Class.forName(driver);
try {
Connection conn = DriverManager.getConnection(url, username, password);
// System.out.println("连接到mysql数据库" + conn);
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
if ("oracle".equals(str)) {
Properties properties = new Properties();
FileInputStream fis = null;
try {
fis = new FileInputStream(new File(filePath));
} catch (FileNotFoundException e2) {
e2.printStackTrace();
}
try {
properties.load(fis);
} catch (IOException e1) {
e1.printStackTrace();
}
String driver = (String) properties.get("driver");
String url = (String) properties.get("url");
String username = (String) properties.get("username");
String password = (String) properties.get("password");
try {
Class.forName(driver);
try {
Connection conn = DriverManager.getConnection(url, username, password);
System.out.println("连接到orcle数据库");
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} }
return null;
} // 通用的查询方法
public static <T> List<T> query2(Connection conn, String ss,String sql, Object... args) {
List<T> list = null;
try {
// 获取prepareStatement对象
PreparedStatement prepareStatement = conn.prepareStatement(sql);
// 通过传进来的参数(占位符),将整个sql语句补充好
for (int i = 0; i < args.length; i++) {
// 注:这里需要+1
prepareStatement.setObject(i + 1, args[i]);
}
// 获得结果集
ResultSet resultSet = prepareStatement.executeQuery(); // 这里准备获取结果集里面的所有的列名
List<String> labels = new ArrayList<String>();
// 获取数据库中列名的全部集合(元数据)
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 0; i < metaData.getColumnCount(); i++) {
// 这里同样要加1,从1开始计数的
labels.add(metaData.getColumnLabel(i + 1));
} // 创建一个map,将查询到的字段名,和它的值存到map中,以便取出
// key:列名,value:字段的值
HashMap<String, Object> map = new HashMap<String, Object>();
// 创建一个list,存储数据
list = new ArrayList<T>();
// s是列名
while (resultSet.next()) {
map.clear();
for (String s : labels) {
map.put(s, resultSet.getObject(s));
}
// 如果map不为空,遍历map,将它的值存到实体类中去
if (!map.isEmpty()) {
Set<Entry<String, Object>> entrySet = map.entrySet();
for (Entry<String, Object> entry : entrySet) {
System.out.print(entry.getKey()+":"+entry.getValue()+" ");
if(entry.getKey().equals(ss)) {
System.out.println();
}
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
} // 通用的查询方法
public static <T> List<T> query(Class<T> tClass, Connection conn, String sql, Object... args) {
List<T> list = null;
try {
// 获取prepareStatement对象
PreparedStatement prepareStatement = conn.prepareStatement(sql);
// 通过传进来的参数(占位符),将整个sql语句补充好
for (int i = 0; i < args.length; i++) {
// 注:这里需要+1
prepareStatement.setObject(i + 1, args[i]);
}
// 获得结果集
ResultSet resultSet = prepareStatement.executeQuery(); // 这里准备获取结果集里面的所有的列名
List<String> labels = new ArrayList<String>();
// 获取数据库中列名的全部集合(元数据)
ResultSetMetaData metaData = resultSet.getMetaData();
for (int i = 0; i < metaData.getColumnCount(); i++) {
// 这里同样要加1,从1开始计数的
labels.add(metaData.getColumnLabel(i + 1));
} // 创建一个map,将查询到的字段名,和它的值存到map中,以便取出
// key:列名,value:字段的值
HashMap<String, Object> map = new HashMap<String, Object>();
// 创建一个list,存储数据
list = new ArrayList<T>();
// s是列名
while (resultSet.next()) {
map.clear();
for (String s : labels) {
map.put(s, resultSet.getObject(s));
}
// 如果map不为空,遍历map,将它的值存到实体类中去
if (!map.isEmpty()) {
try {
// 创建一个实例,这里开始利用反射了
T newInstance = tClass.newInstance();
Set<Entry<String, Object>> entrySet = map.entrySet();
for (Entry<String, Object> entry : entrySet) {
String name = entry.getKey();
Object value = entry.getValue();
if(value instanceof BigDecimal) {
value=((BigDecimal) value).intValue();
}
try {
// 获取属性,给属性赋值
Field field = tClass.getDeclaredField(name.toLowerCase());
field.setAccessible(true);
field.set(newInstance, value);
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
}
list.add(newInstance); } catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
} // 删除数据
public static void delete(Connection conn, String sql) {
try {
Statement statement = conn.createStatement();
try {
statement.execute(sql);
System.out.println("删除数据成功!");
} catch (Exception e) {
System.err.println("出现问题了" + e.getMessage());
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
} // 修改一条数据
public static void Update(Connection conn, String sql) {
try {
Statement statement = conn.createStatement();
try {
statement.execute(sql);
System.out.println("修改数据成功");
} catch (Exception e) {
System.err.println("出现问题了" + e.getMessage());
e.printStackTrace();
} } catch (SQLException e) {
e.printStackTrace();
}
} // 添加一条数据
public static void add(Connection conn, String sql) {
try {
Statement statement = conn.createStatement();
try {
statement.execute(sql);
System.out.println("插入数据成功!");
} catch (Exception e) {
System.err.println("出现问题了" + e.getMessage());
e.printStackTrace();
} } catch (SQLException e) {
e.printStackTrace();
}
} // 关闭连接
public static void close(Statement st, ResultSet rs, Connection conn) {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
} } }

briup_jdbc自建工具类终极版的更多相关文章

  1. C# 超时工具类 第二版

    附源码,没有附测试demo 之前的工具类:C# 给某个方法设定执行超时时间 /// <summary> /// 超时工具 /// </summary> public class ...

  2. 二维码生成工具类java版

    注意:这里我不提供所需jar包的路径,我会把所有引用的jar包显示出来,大家自行Google package com.net.util; import java.awt.BasicStroke; im ...

  3. briup_JDBC_自建工具类

    1.操作的环境 STS,mysql,oracle orcle 所操作的数据库名为 ORCL 表为 m_stu 表结构如下 mysql  的表为:my_stu 表结构如下 工具类完整代码 package ...

  4. redis集群使用Java工具类(Java jedis集群工具类)

    package com.xiaomi.weather.vote.webservices.util.redisCache; import com.google.common.base.Strings; ...

  5. Android utils 之 日志工具类

    工具类 在开发的过程中,我们时常会对代码执行特定的处理,而这部分处理在代码中可能多次用到,为了代码的统一性.规范性等,通过建工具类的方式统一处理.接下来我会罗列各种工具类. 日志工具类 在utils文 ...

  6. [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版

    (课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...

  7. MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)

    MySQL数据库工具类之——DataTable批量加入数据库(Net版),MySqlDbHelper通用类希望能对大家有用,代码如下: using MySql.Data.MySqlClient; us ...

  8. Java版InfluxDB工具类

    InfluxDB工具类 package com.influxdb.test; import java.util.Map; import org.influxdb.InfluxDB; import or ...

  9. java版RSA工具类

    /** * RSA算法加密/解密工具类 */ public class RSAUtils { private static final Logger LOGGER = LoggerFactory.ge ...

随机推荐

  1. 【有容云】PPT | 容器落地之二三事儿

    编者注: 本文为10月29日有容云联合创始人兼研发副总裁江松在 Docker Live时代线下系列-广州站中演讲的PPT,本次线下沙龙为有容云倾力打造Docker Live时代系列主题线下沙龙,每月一 ...

  2. lvs+keepalived 高可用及负载均衡

    一.环境准备 VIP:10.18.43.30 dr1:10.18.43.10 dr2:10.18.43.20 web1:10.18.43.13 web2:10.18.43.14 结构图 (一).预处理 ...

  3. kubernetes API服务器的安全防护

    12.1.了解认证机制 启动API服务器时,通过命令行选项可以开启认证插件. 12.1.1.用户和组 了解用户: 分为两种连接到api服务器的客户端: 1.真实的人 2.pod,使用一种称为Servi ...

  4. 爬虫之爬取电影天堂(request)

    #需要通过代码打开https://www.dytt8.net/网站,拿到网站内容 from urllib.request import urlopen #拿到urlopen import re con ...

  5. 洛谷 P1357 花园

    题意简述 一个只含字母C和P的环形串 求长度为n且每m个连续字符不含有超过k个C的方案数 题解思路 由于\(m<=5\)所以很显然状压 但由于\(n<=10^{15}\).可以考虑用矩阵加 ...

  6. (17)ASP.NET Core EF基于数据模型创建数据库

    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序.使用迁移(Migrations)基于数据模型创建数据库,你可以在Windows上 ...

  7. 在CentOS 7 / RHEL 7安装PostgreSQL 10

    CentOS 到了7.x版本, PostgreSQL也来到了10.x版本. 前些天MySQL都直接跨到了8.0版本. 本文是一篇在CentOS 7.4上安装安装PostgreSQL 10.3 的教程. ...

  8. C#_细说Cookie_Json Helper_Cookies封装

    阅读目录 开始 Cookie 概述 Cookie的写.读过程 使用Cookie保存复杂对象 Js中读写Cookie Cookie在Session中的应用 Cookie在身份验证中的应用 Cookie的 ...

  9. 一个接口多个实现类的Spring注入方式

    1. 首先, Interface1 接口有两个实现类 Interface1Impl1 和 Interface1Impl2 Interface1 接口: package com.example.serv ...

  10. 企查查app (二)

    企查查app sign算法破解 已删除!!!! 这次我们又找到设备id,现在就只差aXM这个了. 关注小白公众号,小白带你成长.