• 编程学习记录10:java数据库的连接


    用jdbc连接Oracle数据库

    连接步骤

      1、导包

      2、加载驱动

      3、建立连接

      4、创建执行语句块

      5、执行语句块,获得结果集

      6、处理结果或结果集

      7、关闭连接

    DBHepler:功能简单,不支持事务

    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.sql.Blob;
    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.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class DBHelper {
        static {
            try {
                // 加载驱动
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取数据连接
         * 
         * @return 返回一个数据库对象
         */
        public Connection getConnection() {
            Connection con = null;
    
            try {
                con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl", "数据库账号", "数据密码");
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return con;
        }
    
        /**
         * 关闭资源的方法
         * 
         * @param rs
         *            要关闭的结果集
         * @param pstmt
         *            要关闭的预编译执行
         * @param con
         *            要关闭的连接
         */
        private 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();
                }
        }
    
        /**
         * 更新数据的方法
         * 
         * @param sql
         *            语句
         * @param params
         *            ? 的值
         * @return
         */
        public int update(String sql, List<Object> params) {
            Connection con = null;
            PreparedStatement pstmt = null;
            int result = 0;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
    
                this.setParams(pstmt, params);
                result = pstmt.executeUpdate();
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                this.closeAll(null, pstmt, con);
            }
            return result;
        }
    
        /**
         * 基于对象查询
         * 
         * @param c
         *            要返回的对象类型
         * @param sql
         *            要执行的语句
         * @param params
         *            要执行的更新语句中的占位符 ?
         * @return
         */
        public <T> List<T> findObjects(Class<T> c, String sql, Object... params) {
            List<Method> setters = this.getSetter(c);
            if (setters == null || setters.size() <= 0) {
                return null;
            }
    
            List<T> list = new ArrayList<T>();
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
                rs = pstmt.executeQuery();
                ResultSetMetaData rsmd = rs.getMetaData();
                int colCount = rsmd.getColumnCount();
                String[] colNames = new String[colCount];
                for (int i = 0; i < colCount; i++) { // 获取变量名
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                Map<String, String> types = new HashMap<String, String>();
                Class<?>[] cls = null;
                for (Method method : setters) { // 获取setter方法中的第一个变量类型
                    cls = method.getParameterTypes();
                    if (cls != null && cls.length > 0) {
                        types.put(method.getName(), cls[0].getSimpleName());
                    }
                }
    
                T t = null;
                String mName = null;
                String methodName = null;
                String typename = null;
    
                while (rs.next()) {
                    try {
                        t = c.newInstance();
                        for (String colName : colNames) {
                            for (Method method : setters) {
                                methodName = "set" + colName;
                                mName = method.getName();
                                typename = types.get(mName);
                                if (methodName.equalsIgnoreCase(mName)) { // 找到方法
                                    if ("int".equals(typename) || "Integer".equals(typename)) {
                                        method.invoke(t, rs.getInt(colName));
                                    } else if ("float".equalsIgnoreCase(typename)) {
                                        method.invoke(t, rs.getFloat(colName));
                                    } else if ("double".equalsIgnoreCase(typename)) {
                                        method.invoke(t, rs.getFloat(colName));
                                    } else if ("byte[]".equals(typename)) {
                                        Blob blob = rs.getBlob(colName);
                                        byte[] bt = null;
                                        if (blob != null) {
                                            blob.getBytes(1, (int) blob.length());
                                        }
                                        method.invoke(t, bt);
                                    } else if ("Date".equals(typename)) {
                                        method.invoke(t, rs.getDate(colName));
                                    } else {
                                        method.invoke(t, rs.getString(colName));
                                    }
                                }
                            }
                        }
    
                        list.add(t);
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
    
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return list;
    
        }
    
        /**
         * 基于对象查询
         * 
         * @param c
         *            要返回的对象类型
         * @param sql
         *            要执行的语句
         * @param params
         *            要执行的更新语句中的占位符 ?
         * @return
         */
        public <T> T findObject(Class<T> c, String sql, Object... params) {
            List<Method> setters = this.getSetter(c);
            if (setters == null || setters.size() <= 0) {
                return null;
            }
    
            T t = null;
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
                rs = pstmt.executeQuery();
    
                ResultSetMetaData rsmd = rs.getMetaData();
    
                int colCount = rsmd.getColumnCount();
                String[] colNames = new String[colCount];
                for (int i = 0; i < colCount; i++) { // 获取变量名
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                Map<String, String> types = new HashMap<String, String>();
                Class<?>[] cls = null;
    
                for (Method method : setters) { // 获取setter方法中的第一个变量类型
                    cls = method.getParameterTypes();
                    if (cls != null && cls.length > 0) {
                        types.put(method.getName(), cls[0].getSimpleName());
                    }
                }
    
                String mName = null;
                String methodName = null;
                String typename = null;
                if (rs.next()) {
                    try {
                        t = c.newInstance();
                        for (String colName : colNames) {
                            for (Method method : setters) {
                                methodName = "set" + colName;
                                mName = method.getName();
                                typename = types.get(mName);
                                if (methodName.equalsIgnoreCase(mName)) { // 找到方法
                                    if ("int".equals(typename) || "Integer".equals(typename)) {
                                        method.invoke(t, rs.getInt(colName));
                                    } else if ("float".equalsIgnoreCase(typename)) {
                                        method.invoke(t, rs.getFloat(colName));
                                    } else if ("double".equalsIgnoreCase(typename)) {
                                        method.invoke(t, rs.getFloat(colName));
                                    } else if ("byte[]".equals(typename)) {
                                        Blob blob = rs.getBlob(colName);
                                        byte[] bt = null;
                                        if (blob != null) {
                                            blob.getBytes(1, (int) blob.length());
                                        }
                                        method.invoke(t, bt);
                                    } else if ("date".equalsIgnoreCase(typename)) {
                                    } else {
                                        method.invoke(t, rs.getString(colName));
                                    }
                                }
                            }
                        }
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    }
    
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            }
    
            return t;
    
        }
    
        public <T> T findObject(Class<T> c, String sql, List<Object> params) {
            List<Method> setters = getSetter(c);
            if (setters == null || setters.size() <= 0)
                return null;
    
            T t = null;
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
                rs = pstmt.executeQuery();
    
                ResultSetMetaData rsmd = rs.getMetaData();
    
                int colCount = rsmd.getColumnCount();
    
                // 循环获取的名称并放到数据中
                String[] colNames = new String[colCount];
                for (int i = 0; i < colCount; i++) {
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                // 获取到指定类中的所有setter方法,循环所有的Setter方法,给对应的属性赋值
    
                Map<String, String> types = new HashMap<String, String>();
                Class<?>[] cls = null;
                for (Method method : setters) {
                    cls = method.getParameterTypes();
                    if (cls != null && cls.length > 0) {
                        types.put(method.getName(), cls[0].getSimpleName());
                    }
                }
    
                String methodName = null;
                String mName = null;
                String typeName = null;
                if (rs.next()) {
                    t = c.newInstance();
    
                    // 根据列名找到对应的setter 方法,并激活此方法,将对应的值注入到 t 对象的对应属性中
                    for (String colName : colNames) {
                        for (Method method : setters) {
                            methodName = "set" + colName;
                            mName = method.getName();
                            typeName = types.get(mName);
                            if (methodName.equalsIgnoreCase(mName)) { // 说明对应列注入的方法已经找到,那么激活此方法,将属性值注入
                                if ("int".equals(typeName) || "Integer".equals(typeName)) {
                                    method.invoke(t, rs.getInt(colName));
                                } else if ("float".equals(typeName) || "Float".equals(typeName)) {
                                    method.invoke(t, rs.getFloat(colName));
                                } else if ("double".equals(typeName) || "Double".equals(typeName)) {
                                    method.invoke(t, rs.getDouble(colName));
                                } else if ("byte[]".equals(typeName)) {
                                    Blob blob = rs.getBlob(colName);
                                    byte[] bt = null;
                                    if (blob != null) {
                                        blob.getBytes(1, (int) blob.length());
                                    }
                                    method.invoke(t, bt);
                                } else {
                                    method.invoke(t, rs.getString(colName));
                                }
                            }
                        }
                    }
    
                }
            } catch (InstantiationException e) {
    
                e.printStackTrace();
            } catch (IllegalAccessException e) {
    
                e.printStackTrace();
            } catch (SQLException e) {
    
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
    
                e.printStackTrace();
            } catch (InvocationTargetException e) {
    
                e.printStackTrace();
            }
    
            return t;
        }
    
        /**
         * 查询数据的方法
         * 
         * @param sql
         *            要执行的语句
         * @param params
         *            要执行的更新语句中的占位符 ?
         * @return List<Map<String,Object>> 类型 里面是已变量名称为键的图
         */
        public List<Map<String, Object>> finds(String sql, Object... params) {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
    
                // 获取结果集
                rs = pstmt.executeQuery();
    
                // 获取结果集元素对象
                ResultSetMetaData rsmd = rs.getMetaData();
    
                int colCount = rsmd.getColumnCount();
                String[] colNames = new String[colCount];
    
                for (int i = 0; i < colCount; i++) {
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                Map<String, Object> map = null;
    
                while (rs.next()) {
                    map = new HashMap<String, Object>();
    
                    for (String colName : colNames) {
                        map.put(colName, rs.getObject(colName));
                    }
    
                    list.add(map);
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                this.closeAll(rs, pstmt, con);
            }
            return list;
    
        }
    
        public List<Map<String, String>> findsStr(String sql, Object... params) {
            List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
    
                // 获取结果集
                rs = pstmt.executeQuery();
    
                // 获取结果集元素对象
                ResultSetMetaData rsmd = rs.getMetaData();
    
                int colCount = rsmd.getColumnCount();
                String[] colNames = new String[colCount];
    
                for (int i = 0; i < colCount; i++) {
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                Map<String, String> map = null;
    
                while (rs.next()) {
                    map = new HashMap<String, String>();
    
                    for (String colName : colNames) {
                        map.put(colName, String.valueOf(rs.getObject(colName)));
                    }
    
                    list.add(map);
                }
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                this.closeAll(rs, pstmt, con);
            }
            return list;
    
        }
    
        /**
         * 给语句中的占位符(?) 赋值
         * 
         * @param pstmt
         *            要赋值的预编译执行块
         * @param params
         *            值的列表
         */
        private void setParams(PreparedStatement pstmt, List<Object> params) {
            if (params != null && params.size() > 0) {
                for (int i = 0, len = params.size(); i < len; i++) {
                    try {
                        pstmt.setObject(i + 1, params.get(i));
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        private void setParams(PreparedStatement pstmt, Object... params) {
            if (params != null && params.length > 0) {
                for (int i = 0, len = params.length; i < len; i++) {
                    try {
                        pstmt.setObject(i + 1, params[i]);
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        /**
         * 查询数据的方法
         * 
         * @param sql
         *            要执行的语句
         * @param params
         *            要执行的更新语句中的占位符 ?
         * @return List<Map<String,Object>> 类型 里面是已变量名称为键的图
         */
        public List<Map<String, Object>> finds(String sql, List<Object> params) {
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
                rs = pstmt.executeQuery();
                // 获取结果集元素数据对象
                ResultSetMetaData rsmd = rs.getMetaData();
    
                // 获取结果集中列的数量
                int colCount = rsmd.getColumnCount();
    
                // 循环获取列的名称并存放到数组中
                String[] colNames = new String[colCount];
                for (int i = 0; i < colCount; i++) {
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                Map<String, Object> map = null;
                while (rs.next()) {
                    map = new HashMap<String, Object>();
    
                    // 循环结果集中的每一列,获取列这一列的值
                    for (String colName : colNames) {
                        map.put(colName, rs.getObject(colName)); // 在这一列中,根据列名获取数据
                    }
                    list.add(map);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                this.closeAll(rs, pstmt, con);
            }
            return list;
        }
    
        private <T> List<Method> getSetter(Class<T> c) {
            if (c == null)
                return null;
    
            Method[] methods = c.getDeclaredMethods();
            if (methods == null || methods.length <= 0)
                return null;
    
            List<Method> list = new ArrayList<Method>();
    
            for (Method method : methods) {
                if (method.getName().startsWith("set")) {
                    list.add(method);
                }
            }
    
            return list;
        }
    
        /**
         * 基于对象查询
         * 
         * @param c
         *            要返回的对象的类型
         * @param sql
         *            要执行的语句
         * @param params
         *            要执行的更新语句中的占位符 ?
         * @return
         */
        public <T> List<T> findObjects(Class<T> c, String sql, List<Object> params) {
            List<Method> setters = getSetter(c);
            if (setters == null || setters.size() <= 0)
                return null;
    
            List<T> list = new ArrayList<T>();
            Connection con = null;
            PreparedStatement pstmt = null;
            ResultSet rs = null;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
                this.setParams(pstmt, params);
                rs = pstmt.executeQuery();
    
                ResultSetMetaData rsmd = rs.getMetaData();
    
                int colCount = rsmd.getColumnCount();
    
                // 循环获取的名称并放到数据中
                String[] colNames = new String[colCount];
                for (int i = 0; i < colCount; i++) {
                    colNames[i] = rsmd.getColumnName(i + 1);
                }
    
                // 获取到指定类中的所有setter方法,循环所有的Setter方法,给对应的属性赋值
    
                Map<String, String> types = new HashMap<String, String>();
                Class<?>[] cls = null;
                for (Method method : setters) {
                    cls = method.getParameterTypes();
                    if (cls != null && cls.length > 0) {
                        types.put(method.getName(), cls[0].getSimpleName());
                    }
                }
    
                T t = null;
                String methodName = null;
                String mName = null;
                String typeName = null;
                while (rs.next()) {
                    t = c.newInstance();
    
                    // 根据列名找到对应的setter 方法,并激活此方法,将对应的值注入到 t 对象的对应属性中
                    for (String colName : colNames) {
                        for (Method method : setters) {
                            methodName = "set" + colName;
                            mName = method.getName();
                            typeName = types.get(mName);
                            if (methodName.equalsIgnoreCase(mName)) { // 说明对应列注入的方法已经找到,那么激活此方法,将属性值注入
                                if ("int".equals(typeName) || "Integer".equals(typeName)) {
                                    method.invoke(t, rs.getInt(colName));
                                } else if ("float".equals(typeName) || "Float".equals(typeName)) {
                                    method.invoke(t, rs.getFloat(colName));
                                } else if ("double".equals(typeName) || "Double".equals(typeName)) {
                                    method.invoke(t, rs.getDouble(colName));
                                } else if ("byte[]".equals(typeName)) {
                                    Blob blob = rs.getBlob(colName);
                                    byte[] bt = null;
                                    if (blob != null) {
                                        blob.getBytes(1, (int) blob.length());
                                    }
                                    method.invoke(t, bt);
                                } else {
                                    method.invoke(t, rs.getString(colName));
                                }
                            }
                        }
                    }
    
                    list.add(t);
                }
            } catch (InstantiationException e) {
    
                e.printStackTrace();
            } catch (IllegalAccessException e) {
    
                e.printStackTrace();
            } catch (SQLException e) {
    
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
    
                e.printStackTrace();
            } catch (InvocationTargetException e) {
    
                e.printStackTrace();
            }
    
            return list;
        }
    
        public static void main(String[] args) {
            DBHelper db = new DBHelper();
            System.out.println(db.update("select * from emp"));
        }
    
        public int update(String sql, Object... params) {
            Connection con = null;
            PreparedStatement pstmt = null;
            int result = 0;
    
            try {
                con = this.getConnection();
                pstmt = con.prepareStatement(sql);
    
                this.setParams(pstmt, params);
                result = pstmt.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                this.closeAll(null, pstmt, con);
            }
            return result;
        }
    
        public int updates(String[] sqls, List<List<Object>> params) {
            Connection con = null;
            PreparedStatement pstmt = null;
            int result = 0;
    
            try {
                con = this.getConnection();
                for (int i = 0, len = sqls.length; i < len; i++) {
                    pstmt = con.prepareStatement(sqls[i]);
                    this.setParams(pstmt, params.get(i));
                    result += pstmt.executeUpdate();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                this.closeAll(null, pstmt, con);
            }
            return result;
        }
    
    }

    注意:用完之后一定要关闭各种流,否则程序运行时可能会卡

    数据库连接一些常见的异常及可能原因

      1、 java.lang.ClassNotFoundException 加载驱动错误

        原因:

        1)如果你能确定这个包你已经导入,可能的情况是类名写错或者说这个驱动包在下载的时候出现错误,或者版本不对

        2)所需的类不在这个工程内或没有导入

      2、java.sql.SQLException : No suitable driver found for... 

        原因:连接数据库的URL地址请求协议错误

      3、java.sql.SQLException : The Network Adapter could not establish... 

        原因:访问的数据库服务器没有开

      4、TNS:listener does not currently know of SID given in connect descriptor...

        原因:访问的数据库错误

      5、java.sql.SQLException: ORA-01017: invalid username/password; logon denied...

        原因:用户名或密码错误

    Oracle_10g分享:

    链接:百度云链接
    提取码:qn5x

    JDBC包

    链接:百度云链接
    提取码:4lpv

  • 相关阅读:
    定义 : angular view 和controller 之前的 ng-init 由谁来负责
    pl/sql如何在云端服务器上新建数据库
    oracle连接服务器上数据库
    svn check下来的代码在eclipse中没有run on server
    sql server在修改表结构后不能保存
    用mybatis-generator自动生成代码报“前言中不允许有内容”
    启动Tomact时报failed to start conponent
    spring MVC中controller失效
    maven项目中连接sqlserver和mysql的区别
    DBCP连接池的配置
  • 原文地址:https://www.cnblogs.com/HMTT-RIN/p/11234406.html
Copyright © 2020-2023  润新知