总结:此次构建工具类,难点在于查询,所需要的功能是 不管是 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. 开启java之门

    一.Java语言概述 Java语言诞生于1995年,由Sun公司推出. 2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com Ja ...

  2. Linux命令- echo、grep 、重定向、1>&2、2>&1的介绍

    最近笔试遇到一道题,关于Linux命令的,题目如下 下面两条命令分别会有怎样的输出 echo  hello 1>&2 |grep aaa echo  hello 2>&1 ...

  3. 前端笔记之微信小程序(三)GET请求案例&文件上传和相册API&配置https

    一.信息流小程序-GET请求案例 1.1服务端接口开发 一定要养成接口的意识,前端单打独斗出不来任何效果,必须有接口配合,写一个带有分页.关键词查询的接口: 分页接口:http://127.0.0.1 ...

  4. mac安装ElasticSearch+head+node+一个例子~

    1.下载ElasticSearch 官网下载链接:https://www.elastic.co/cn/downloads/past-releases(进去的可能会比较慢,网络好的情况下会好一些) 我下 ...

  5. Cocos经典游戏教程之仿皇室战争

    版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...

  6. STM32实现Airplay音乐播放器

    AirPlay是苹果公司推出的一套无线音乐解决方案,我们手里的iPhone.iPad甚至是Apple Watch等设备还有电脑上的iTunes都支持AirPlay,但是支持AirPlay功能的音响设备 ...

  7. Redis简单梳理及集群配置

    **REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵 ...

  8. python中如何调用函数交换两个变量的值

    python中如何调用函数交换两个变量的值 所有代码来在python3.7.1版本实现 以下实例通过用户输入两个变量,并相互交换:  方法一: def swap(a,b): # 创建临时变量,并交换 ...

  9. jenkins无法连接到git原因

    1.账号密码错误 2.公钥私钥不对应(git上为公钥,jenkins为私钥,私钥比公钥长) 3.公钥私钥文件没有复制到jenkins目录下的.ssh文件中

  10. 写论文的第二天 Hbase集群搭建

    日志______2019.1.24 Hbase分布式搭建 注意:hbase的使用基于hadoop,开启以及关闭需要注意顺序,由于我是的是自带的zookeeper,说以开启关闭顺序应如下 启动:hado ...