总结:此次构建工具类,难点在于查询,所需要的功能是 不管是 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. RabbitMQ与spring集成,配置完整的生产者和消费者

    RabbitMQ与AMQP协议详解可以看看这个 http://www.cnblogs.com/frankyou/p/5283539.html 下面是rabbitMQ和spring集成的配置,我配置了二 ...

  2. WPF中如何禁用空格键(或其他键)

    在选择的控件中添加KeyDown event method private void OnKeyDown(object sender, KeyEventArgs e){ if (e.Key == Ke ...

  3. Hadoop学习(5)-zookeeper的安装和命令行,java操作

    zookeeper是干嘛的呢 Zookeeper的作用1.可以为客户端管理少量的数据kvkey:是以路径的形式表示的,那就意味着,各key之间有父子关系,比如/ 是顶层key用户建的key只能在/ 下 ...

  4. 制造资源计划(Manufacturing Resource Planning,Mrp II)

        制造资源计划(Manufacturing Resource Planning,Mrp II)       概括: 以物料需求计划(MRP)为核心的企业生产管理计划系统,MRP II 是以工业工 ...

  5. Python3源代码编译安装

    Python3源代码编译安装 安装必要工具 yum-utils ,它的功能是管理repository及扩展包的工具 (主要是针对repository) $ sudo yum install yum-u ...

  6. 转载 | CSS图片下面产生间隙的 6种解决方案

    在进行页面的DIV+CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对於 该问题的解决方法也是「见机行事」,根据原因的不同要用不同的 ...

  7. Caddy 源码全解析

    caddy源码全解析 Caddy 源码全解析 Preface Caddy 是 Go 语言构建的轻量配置化服务器.同时代码结构由于 Go 语言的轻便简洁,比较易读,推荐学弟学妹学习 Go 的时候也去查看 ...

  8. LeetCode——264. Ugly Number II

    题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...

  9. HDU 4635 (完全图 和 有向图缩点)

    题目链接:HDU  4635 题目大意: 给你一个有向图,加有向边,使得这个图是简单有向图.问你最多加多少条有向边. 简单有向图: 1.不存在有向重边. 2.不存在图循环.(注意是不存在 “图” 循环 ...

  10. JavaWeb配置详解(结合框架SpringMVC)

    详解 先说一说常识性的东西,我们的JavaWeb程序运行一开始走的是web.xml文件,这是我们的核心文件,可以说没有web.xml文件我们就无法运行项目,这个文件长什么样子,读者自己新建一个web项 ...