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 ...
随机推荐
- 手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示
手摸手,带你用vue实现后台管理权限系统及顶栏三级菜单显示 效果演示地址 项目demo展示 重要功能总结 权限功能的实现 权限路由思路: 根据用户登录的roles信息与路由中配置的roles信息进行比 ...
- jQuery插件之路(一)——试着给jQuery的一个Carousel插件添加新的功能
前几日在网上看到了一个关于Carousel插件的教学视频,于是也顺便跟着学习着做了一下.但是在做完之后发现,在别的网站上面看到类似的效果要比现在做的这个要多一个功能,也就是在底下会有一些按钮,当鼠标放 ...
- 如何为 caddy 添写自定义插件
如何为 caddy 添写自定义插件 项目地址:https://github.com/yhyddr/quicksilver/tree/master/gosample/caddy-plugin 前言 Ca ...
- Linux curl 表单登录或提交与cookie使用
本文主要讲解通过curl 实现表单提交登录.单独的表单提交与表单登录都差不多,因此就不单独说了. 说明:针对curl表单提交实现登录,不是所有网站都适用,原因是有些网站后台做了限制或有其他校验.我们不 ...
- 使用top查看进程和系统负载信息
引言 使用top命令,可以查看正在运行的进程和系统负载信息,包括cpu负载.内存使用.各个进程所占系统资源等,top可以以一定频率更新这些统计信息.下面我们来学习top命令的具体使用方法. ...
- 常见Http协议状态码
收集常见的http协议状态码,供查阅!包括中文和英文对照. 中文版 1**:请求收到,继续处理 2**:操作成功收到,分析.接受 3**:完成此请求必须进一步处理 4**:请求包含一个错误语法或不能完 ...
- JVM(十一):内存分配
JVM(十一):内存分配 在前面的章节中,我们花了大量的篇幅去介绍 JVM 内的内存布局.对象在内存中的状态.垃圾回收的算法和具体实现等.今天让我们探讨一下对象是如何分配内存的. 堆内存划分 前面说过 ...
- PostgreSQL创建扩展出错
问题: loraserver_as=# create extension pg_trgm; ERROR: could not open extension control file "/us ...
- 剑指offer总结一:字符、数字重复问题
问题1:字符串中第一个不重复的字符 题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是" ...
- 人脸识别开发套件RJ45、继电器、OTG、RS232接口说明
人脸识别开发套件RJ45.继电器.OTG.RS232接口说明 接口说明 D801A 人脸抓拍识别一体机是一款高性能.高可靠性的人脸识别类产品.依托深度学习算法扩展人脸库数量,准确率更高,支 ...