美文网首页
iformix数据库jdbc连接工具

iformix数据库jdbc连接工具

作者: 幻影翔 | 来源:发表于2019-12-21 21:21 被阅读0次

使用

  • 建立表对象
  • 编写SQL
  • 直接调用
package cn.myccit.ifactory.action.newMEs;


import java.lang.reflect.Method;
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;
 
public abstract class JDBCHelper {

    /*
     * jdbc变量
     */
    static String driver=null;
    static String url=null;
    static String user=null;
    static String password=null;
    //thread封装Connection对象
    static ThreadLocal<Connection> thread=new ThreadLocal<Connection>();
    
    //唯一空构造器私有化,不允许外部创建对象
    private JDBCHelper() {}
    /**
     *  静态代码块为jdbc变量赋值
     * 因为静态代码块最先执行,所以调用getConnection()方法时,
     * 该方法内部的jdbc变量就完成了赋值操作
     */
    static {    
        try {

            driver="com.informix.jdbc.IfxDriver";
            url="jdbc:informix-sqli://xxxx:9990/xxx(数据库模式):"
                    + "INFORMIXSERVER=xxx(服务器);"
                    + "IFX_USE_STRENC=true;NEWCODESET=utf8,8859-1,819;"
                    + "CLIENT_LOCALE=en_US.utf8;DB_LOCALE=en_US.8859-1;"
                    + "Database=jack";
            user="root";
            password="123456";
            /*
             * 加载驱动,静态代码块只执行一次,驱动只加载一次(加载驱动很耗性能的)
             */
            Class.forName(driver).newInstance();  ;//加载驱动           
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 通过本方法客获取一个MySQL数据库的Connection对象
     * 
     * @return Connection对象
     */
    public static Connection getConnection() {
        Connection con = thread.get();
        if(con==null) {
            try {
                con = DriverManager.getConnection(url, user, password);
                thread.set(con);
            } catch (SQLException e) {
                e.printStackTrace();
            }       
        }
        return con;//返回jdbc连接
    }
    
    /**
     * 本方法中调用Date类型变量的setter方法时使用的是java.sql.Date,
     * 所以实体类在声明Date类型变量时一定声明成java.sql.Date
     * 至少Date类型变量对应的setter方法的形参必须是java.sql.Date,否则报错
     * 
     * 查询完毕后,使用者通过JDBCHelper.getConnection()获取连接对象,并关闭它
     * 外部获取的连接对象与本方法使用的连接对象,在同一线程类,是同一个对象
     * 
     * @param sql   要执行的查询语句
     * @param t      实体类对象
     * @param objs    SQL语句中的参数
     * @return       装有实体类对象的list集合
     */
    public static <T> List<T>  executeQuery(String sql,T t,Object...objs){
        //声明jdbc变量
        List<T> list=new ArrayList<>();
        Connection conn = null;
        PreparedStatement ps =null;
        ResultSet rs =null;
        try {
            conn = JDBCHelper.getConnection();
            ps = conn.prepareStatement(sql);
            //给占位符赋值
            if(objs!=null) {
                for(int i=0;i<objs.length;i++) {
                        ps.setObject((i+1), objs[i]);
                }
            }
            //执行sql语句
            rs = ps.executeQuery();
            //获取结果集中字段的所有信息
            ResultSetMetaData rm = rs.getMetaData();
            int columnCount = rm.getColumnCount();//获取字段数
            //遍历结果集
            while(rs.next()) {
                    Class<? extends Object> cla = t.getClass();//获取类对象
                    T newInstance=(T)cla.newInstance();//获取类的对象
                    //一个for循环封装一条记录的所有值
                    for(int i=1;i<=columnCount;i++) {
                         String columnName = rm.getColumnName(i);//获取字段名
                        //获取字段对应的setter方法
                         String methodName="set"+columnName.substring(0, 1).toUpperCase()+columnName.substring(1);
                         String columnClassName = rm.getColumnClassName(i);//获取字段java类型的完全限定名   
                         //创建方法对象
                         Method method = cla.getDeclaredMethod(methodName, Class.forName(columnClassName));
                         method.invoke(newInstance,rs.getObject(columnName));//调用setter方法,执行对象属性赋值
                    }
                    list.add(newInstance);//将对象加入集合
            }
        } catch (Exception  e) {
            e.printStackTrace();
        }finally {
            //关流
            JDBCHelper.close(ps,rs);
        }
        return list;
        
    }
    
    
    /**
     * 该方法封装了MySQL数据库的DML操作
     * 如果要实现事务:
     *      事务的开启,关闭,回滚,及连接对象的关闭等操作
     *          使用者通过JDBCHelper.getConnection()获取连接对象,通过连接对象并在外部声明
     *          外部获取的连接对象与本方法使用的连接对象,在同一线程类,是同一个对象
     * 
     * @param sql   要执行的SQL语句
     * @param objs  SQL语句中的参数
     * @return   成功执行返回影响的记录条数,否则返回0
     * @throws SQLException 
     */
    public static Integer executeDML(String sql,Object...objs) {
        //声明jdbc变量
        Connection conn =null;
        PreparedStatement ps =null;
        Integer i =0;
        try{            
            conn = JDBCHelper.getConnection();
            ps = conn.prepareStatement(sql);
            //给占位符赋值
            if(objs!=null) {
                for(int j=0;j<objs.length;j++) {
                    ps.setObject((j+1), objs[j]);
                }
            }
            //执行SQL语句
            i = ps.executeUpdate();
        }catch(SQLException e) {
            e.printStackTrace();
        }finally {
            //关流
            JDBCHelper.close(ps);
        }           
        return i;       
    }   
    /**
     * 关流的方法,接收任意多个任意类型的流对象
     * 如果关闭的流对象有关闭的先后顺序
     * 请将要先关闭的流对象放在前方
     * 
     * 所有流对象的顶级父接口都是AutoCloseable
     * @param t    要关闭的流对象,可以是一个或多个(也可以是零个)
     *                      
     */
    private static <T>void close(T...t){
        //循环关流
        for(T tmp:t) {
            //关闭流对象
            if(tmp instanceof AutoCloseable) {          
                try {
                    ((AutoCloseable)tmp).close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }                                           
        }
    }
}

相关文章

  • iformix数据库jdbc连接工具

    使用 建立表对象 编写SQL 直接调用

  • 2019-08-25

    jdbc连接数据库,并封装成数据库工具类

  • java基础-day33-数据库连接

    JDBC 1. JDBC介绍 2. JDBC连接数据库所需的必要条件 3. JDBC连接MySQL数据库 3.1 ...

  • 2018-12-07JDBC连接数据库

    JDBC连接数据库 JDBC jmeter

  • Java连接到数据库讲解(一)

    完整java开发中JDBC连接数据库代码和步骤 JDBC连接数据库 • 创建一个以JDBC连接数据库的程序,包含7...

  • Java JDBC连接

    JDBC连接数据库 •创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: 在连接数据库...

  • JDBC的连接过程

    JDBC连接数据库,创建一个以JDBC连接数据库的程序,包含6个步骤: 1、加载JDBC驱动程序: 在连接数据库之...

  • 第十七章 JDBC

    JDBC 一、JDBC访问数据库步骤 面试回答: ①加载JDBC驱动 ②创建数据库连接(Connection) ③...

  • Java MySQL连接

    JDBC简述 Java如何连接数据库呢? 答案是:Java使用JDBC连接数据库。 那么JDBC又是什么? Jav...

  • 8.7JDBC学习

    jdbc连接mysql JDBC(Java Data Base Connectivity,java数据库连接)是一...

网友评论

      本文标题:iformix数据库jdbc连接工具

      本文链接:https://www.haomeiwen.com/subject/yqcnnctx.html