briup_jdbc自建工具类终极版
总结:此次构建工具类,难点在于查询,所需要的功能是 不管是 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自建工具类终极版的更多相关文章
- C# 超时工具类 第二版
附源码,没有附测试demo 之前的工具类:C# 给某个方法设定执行超时时间 /// <summary> /// 超时工具 /// </summary> public class ...
- 二维码生成工具类java版
注意:这里我不提供所需jar包的路径,我会把所有引用的jar包显示出来,大家自行Google package com.net.util; import java.awt.BasicStroke; im ...
- briup_JDBC_自建工具类
1.操作的环境 STS,mysql,oracle orcle 所操作的数据库名为 ORCL 表为 m_stu 表结构如下 mysql 的表为:my_stu 表结构如下 工具类完整代码 package ...
- redis集群使用Java工具类(Java jedis集群工具类)
package com.xiaomi.weather.vote.webservices.util.redisCache; import com.google.common.base.Strings; ...
- Android utils 之 日志工具类
工具类 在开发的过程中,我们时常会对代码执行特定的处理,而这部分处理在代码中可能多次用到,为了代码的统一性.规范性等,通过建工具类的方式统一处理.接下来我会罗列各种工具类. 日志工具类 在utils文 ...
- [课本]JDBC课程6--使用JDBC的DAO模块化--完成数据库的增删查改_工具类JDBCTools四个(Preparedstatement)功能模块的敲定版
(课本P273-任务九) /**DAO: Data Access Object * 为什么用: 实现功能的模块化,更有利于代码的维护和升级 * 是什么: 访问数据信息的类,包含对数据的CRUD(cre ...
- MySQL数据库工具类之——DataTable批量加入MySQL数据库(Net版)
MySQL数据库工具类之——DataTable批量加入数据库(Net版),MySqlDbHelper通用类希望能对大家有用,代码如下: using MySql.Data.MySqlClient; us ...
- Java版InfluxDB工具类
InfluxDB工具类 package com.influxdb.test; import java.util.Map; import org.influxdb.InfluxDB; import or ...
- java版RSA工具类
/** * RSA算法加密/解密工具类 */ public class RSAUtils { private static final Logger LOGGER = LoggerFactory.ge ...
随机推荐
- 手把手教你grid布局
概述 目前css布局方案中,网格布局可以算得上是最强大的布局方案了.它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局. 基本概念 在学习grid布局之前,我们需要了解一些基本概念 1 ...
- Spring MVC浅入浅出——不吹牛逼不装逼
Spring MVC浅入浅出——不吹牛逼不装逼 前言 上文书说了Spring相关的知识,对Spring来了个浅入浅出,大家应该了解到,Spring在三层架构中主做Service层,那还有Web层,也就 ...
- Spring cloud Feign不支持对象传参解决办法[完美解决]
spring cloud 使用 Feign 进行服务调用时,不支持对象参数. 通常解决方法是,要么把对象每一个参数平行展开,并使用 @RequestParam 标识出每一个参数,要么用 @Reques ...
- spring-boot-plus集成Spring Boot Admin管理和监控应用(十一)
spring-boot-plus集成Spring Boot Admin管理和监控应用 spring boot admin Spring Boot Admin用来管理和监控Spring Boot应用程序 ...
- **p,*p和&p使用有感
*p两种使用情况: 1.定义指针变量,如char *p:这里p是一个变量,单单在这一点上与int a 无差别:但p这个变量特殊在其中只能存地址. 引申:对于char **p,p中存一个地址add1,a ...
- Hexo+Github: 博客网站搭建完全教程(看这篇就够了)
本篇教程首次发布在个人博客:sunhwee.com,想要获得最佳阅读体验,欢迎前往,建议用电脑查看教程文档. # 阅读须知 注意,这篇文章篇幅较长,主要针对新手,每一步很详细,所以可能会显得比较啰嗦, ...
- 随笔编号-16 JAVA知识框架
基于 J2EE 列举的知识架构,大体列举开发基础知识.帮助我随时查缺补漏,奉行好记性不如烂笔头.写了这该随笔,以便后续查询. 1 JAVA简介 2 JAVA编程环境 3 JAVA基本编程结构 4 ...
- 良许 | 命令的输出不会保存?居然连 tee 命令都不会用!
很多情况下,我们需要保存程序/命令的输出到本地,常用的一种方法是重定向,这也是一种很好的方法.但有个问题,如果你想要做后续操作,比如要统计输出的行数等,重定向就有困难了. 这时候,tee 命令就派上用 ...
- 详解golang net之transport
关于golang http transport的讲解,网上有很多文章读它进行了描述,但很多文章讲的都比较粗,很多代码实现并没有讲清楚.故给出更加详细的实现说明.整体看下来细节实现层面还是比较难懂的. ...
- 支持向量机 (一): 线性可分类 svm
支持向量机(support vector machine, 以下简称 svm)是机器学习里的重要方法,特别适用于中小型样本.非线性.高维的分类和回归问题.本系列力图展现 svm 的核心思想和完整推导过 ...