package cn.dao;

  • import java.lang.reflect.InvocationTargetException;
  • import java.lang.reflect.Method;
  • 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.util.ArrayList;
  • import java.util.List;
  • /**
  • * 数据库操作通用类
  • * @author tip
  • */
  • public class DBHelp {
  • private Connection con;
  • private PreparedStatement ps;
  • private ResultSet rs;
  • static Readdoc td = new Readdoc();//读取XML文件中的数据库连接参数
  • static {
  • try {
  • Class.forName(td.getDriver());
  • } catch (ClassNotFoundException e) {
  • e.printStackTrace();
  • }
  • }
  • public Connection getCon() throws SQLException {
  • con = DriverManager.getConnection("jdbc:oracle:thin:@" + td.getAdd()
  • + ":1521:" + td.getDb(), td.getUname(), td.getPwd());
  • return con;
  • }
  • public <T> List<T> findBySql(String sql, List<String> params, Class<T> c)
  • throws SQLException {
  • List<T> list = new ArrayList<T>();
  • // 取出c的这个对象中有多少个方法
  • Method[] ms = c.getMethods();
  • con = this.getCon();
  • try {
  • ps = con.prepareStatement(sql);
  • this.doParams(ps, params);
  • rs = ps.executeQuery();
  • // 得到db中的表的列
  • ResultSetMetaData rsmd = rs.getMetaData();
  • // 存储全部的列名
  • String[] columnname = new String[rsmd.getColumnCount()];
  • for (int i = 0; i < columnname.length; i++) {
  • columnname[i] = rsmd.getColumnName(i + 1);
  • }
  • // id=> "set"+"I"+d=> "setId()" =>对应数据库表的字段
  • while (rs.next()) {
  • // new对象
  • T t = c.newInstance(); // Topic t=new Topic();
  • // t.setId(rs.getInt("id"));
  • for (int i = 0; i < columnname.length; i++) {
  • String cn = columnname[i]; // id title contents
  • cn = "set" + cn.substring(0, 1).toUpperCase()
  • + cn.substring(1).toLowerCase(); // "setId"
  • for (Method m : ms) {
  • if (m.getName().equals(cn)) {
  • if (rs.getObject(columnname[i]) != null) {
  • if ("java.sql.Timestamp".equals(rs.getObject(columnname[i]).getClass().getName())) {
  • m.invoke(t, rs.getString(columnname[i]));
  • } else if ("java.lang.Integer".equals(rs.getObject(columnname[i]).getClass().getName())) {
  • m.invoke(t, rs.getInt(columnname[i]));
  • } else {
  • m.invoke(t, rs.getObject(columnname[i]));
  • }
  • } else {
  • m.invoke(t, rs.getObject(columnname[i]));
  • }
  • break;
  • }
  • }
  • }
  • list.add(t);
  • }
  • } catch (IllegalArgumentException e) {
  • e.printStackTrace();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • } catch (InstantiationException e) {
  • e.printStackTrace();
  • } catch (IllegalAccessException e) {
  • e.printStackTrace();
  • } catch (InvocationTargetException e) {
  • e.printStackTrace();
  • } finally {
  • closeAll(rs, ps, con);
  • }
  • return list;
  • }
  • // insert into xx values(?,?); params={"tip","whx"};
  • public <T> int doUpdate(String sql, List<T> params) throws SQLException {
  • con = this.getCon();
  • int i = 0;
  • try {
  • ps = con.prepareStatement(sql);
  • doParams(ps, params);
  • i = ps.executeUpdate();
  • } catch (SQLException e) {
  • try {
  • con.rollback();
  • } catch (SQLException e1) {
  • // TODO Auto-generated catch block
  • e1.printStackTrace();
  • }
  • } finally {
  • closeAll(null, ps, con);
  • }
  • return i;
  • }
  • // 设置预编译对象参数
  • public <T> void doParams(PreparedStatement pstmt, List<T> params)
  • throws SQLException {
  • if (pstmt != null && params != null && params.size() > 0) {
  • for (int i = 0; i < params.size(); i++) {
  • if (params.get(i) != null) {
  • if (params.get(i).getClass().getName().equals("java.lang.String")) {
  • pstmt.setString(i + 1, (String) params.get(i));
  • } else if (params.get(i).getClass().getName()
  • .equals("java.math.BigDecimal")) {
  • pstmt.setBigDecimal(i + 1, (BigDecimal) params.get(i));
  • } else if (params.get(i).getClass().getName().equals("java.sql.Timestamp")) {
  • pstmt.setString(i + 1, (String) params.get(i));
  • } else {
  • pstmt.setObject(i + 1, params.get(i));
  • }
  • } else {
  • pstmt.setString(i + 1, "");
  • }
  • }
  • }
  • }
  • public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection con) {
  • if (rs != null) {
  • try {
  • rs.close();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • }
  • if (pstmt != null) {
  • try {
  • pstmt.close();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • }
  • if (con != null) {
  • try {
  • con.close();
  • } catch (SQLException e) {
  • e.printStackTrace();
  • }
  • }
  • }
  • }

java操作数据库的通用的类的更多相关文章

  1. JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了

    JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了 代码示例 转自 https://docs.oracle.com/javase/tutorial/jdbc/o ...

  2. java操作数据库:增删改查

    不多bb了直接上. 工具:myeclipse 2016,mysql 5.7 目的:java操作数据库增删改查商品信息 test数据库的goods表 gid主键,自增 1.实体类Goods:封装数据库数 ...

  3. 针对SQLServer数据库的通用访问类

    Web.config中代码 <configuration> <connectionStrings> <add name="connString" co ...

  4. JDBC数据源(DataSource)数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

    JDBC数据源(DataSource)的简单实现   数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 2.数据源提供了一种简单获取数据库连接的方式,并能在内部通 ...

  5. Java操作数据库——手动实现数据库连接池

    Java操作数据库——手动实现数据库连接池 摘要:本文主要学习了如何手动实现一个数据库连接池,以及在这基础上的一些改进. 部分内容来自以下博客: https://blog.csdn.net/soonf ...

  6. Java操作数据库——使用JDBC连接数据库

    Java操作数据库——使用JDBC连接数据库 摘要:本文主要学习了如何使用JDBC连接数据库. 背景 数据持久化 数据持久化就是把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业级应 ...

  7. Java操作文件夹的工具类

    Java操作文件夹的工具类 import java.io.File; public class DeleteDirectory { /** * 删除单个文件 * @param fileName 要删除 ...

  8. JDBC 数据库连接 Java操作数据库 jdbc快速入门

    JDBC基本概念 Java DataBase Connectivity 数据库连接 java操作数据库 本质上(sun公司的程序员)定义的一套操作关系型数据库的规则 既接口  更新内容之前 代码 pa ...

  9. Java操作数据库——使用连接池连接数据库

    Java操作数据库——使用连接池连接数据库 摘要:本文主要学习了如何使用JDBC连接池连接数据库. 传统方式和连接池方式 传统方式的步骤 使用传统方式在Java中使用JDBC连接数据库,完成一次数据库 ...

随机推荐

  1. 查看dmp文件

    1.查看dmp文件,首先要通过以下的链接地址进行下载 http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.m ...

  2. zTree实现删除树节点

    zTree实现删除树节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树</titl ...

  3. freemarker写select组件(二)

    freemarker写select组件 1.宏定义 <#macro select id datas value=""> <select id="${id ...

  4. java字符串替换的问题

    今天工作中遇到一个问题,需要输出mongodbObject中的部分内容,当我转换成字符串以后出现了好像无法替换的问题,经过验证,发现并非是不能替换,只是想法错误而已. package demo; /* ...

  5. 表格布局----基于bootstrap样式 布局

    在实际开发中,我们通过菜鸟教程复制的表格往往不能满足我们的开发需求,样式很难看,而且不能自适应,尤其是需要到处Excel的样式,感觉非常糟糕,这次我就写了一个表单,不足之处,希望大神们多多指教: 代码 ...

  6. Struts2(六) 用Struts完成客户列表显示

    Struts完成客户列表显示 所用的基础知识 在之前的随笔中已经讲过.这篇是介绍如何使用Struts 完成客户列表显示  . 下面是  完成的代码执行逻辑图: 抽取项目部分代码 相信大家认真看一遍就明 ...

  7. window.load 和$(document).ready() 区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.2.编写个数不同 w ...

  8. GAN 转

    生成式对抗网络(GAN)是近年来大热的深度学习模型.最近正好有空看了这方面的一些论文,跑了一个GAN的代码,于是写了这篇文章来介绍一下GAN. 本文主要分为三个部分: 介绍原始的GAN的原理 同样非常 ...

  9. windows下安装和配置nginx

    下载nginx 到官网下载window版的nginx http://nginx.org/ 配置环境变量 解压到本地的某个路径下, 打开cmd窗口,cd到nginx的目录下 这里要注意cd的时候要加/d ...

  10. python官方推荐的各阶段学习书籍

    Python学习交流群:463024091,群内每天分享干货,包括最新的python企业案例学习资料和零基础入门教程,欢迎各位小伙伴入群学习交流! 你是否曾经学期初立下一大堆学习计划,到期末却依旧过着 ...