zoukankan      html  css  js  c++  java
  • Java访问MySQL数据库的SqlHelper类以及测试程序

    第一步:新建SqlHelper类;
    第二步:新建一个属性文件dbinfo.properties,具体内容如下:
    driver=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/test
    userName=root
    password=10Floor
    第三步:完成SqlHelper类;一定要记着引入数据库驱动程序。SqlHelper类的具体内容如下:
    package edu.xaut.wuqiang.demo;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.sql.*;
    import java.util.Properties;
    
    public class SqlHelper {
        // 定义要使用的变量
        private static Connection conn = null;
        private static PreparedStatement ps = null;
        private static ResultSet rs = null;
        private static CallableStatement cs = null;
    
        private static String driver = "";
        private static String url = "";
        private static String userName = "";
        private static String password = "";
    
        private static Properties pp = null;
        private static FileInputStream fis = null;
    
        public static Connection getConn() {
            return conn;
        }
    
        public static PreparedStatement getPs() {
            return ps;
        }
    
        public static ResultSet getRs() {
            return rs;
        }
       
        public static CallableStatement getCs() {
            return cs;
        }
    
        // 加载驱动,只需要一次
        static {
            try {
                // 从配置文件dbinfo.properties中读取配置信息
                pp = new Properties();
                fis = new FileInputStream("dbinfo.properties");
                pp.load(fis);
                driver = pp.getProperty("driver");
                url = pp.getProperty("url");
                userName = pp.getProperty("userName");
                password = pp.getProperty("password");
    
                Class.forName(driver);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fis != null)
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                fis = null;
    
            }
        }
    
        // 得到连接
        public static Connection getConnection() {
            try {
                conn = DriverManager.getConnection(url, userName, password);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return conn;
        }
    
        // 处理多个update/delete/insert
        public static void executeUpdateMultiParams(String[] sql,
                String[][] parameters) {
            try {
                // 获得连接
                conn = getConnection();
                // 可能传多条sql语句
                conn.setAutoCommit(false);
                for (int i = 0; i < sql.length; i++) {
                    if (parameters[i] != null) {
                        ps = conn.prepareStatement(sql[i]);
                        for (int j = 0; j < parameters[i].length; j++)
                            ps.setString(j + 1, parameters[i][j]);
                    }
                    ps.executeUpdate();
                }
                conn.commit();
            } catch (Exception e) {
                e.printStackTrace();
                try {
                    conn.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                throw new RuntimeException(e.getMessage());
            } finally {
                // 关闭资源
                close(rs, ps, conn);
            }
        }
    
        // update/delete/insert
        // sql格式:UPDATE tablename SET columnn = ? WHERE column = ?
        public static void executeUpdate(String sql, String[] parameters) {
            try {
                // 1.创建一个ps
                conn = getConnection();
                ps = conn.prepareStatement(sql);
                // 给?赋值
                if (parameters != null)
                    for (int i = 0; i < parameters.length; i++) {
                        ps.setString(i + 1, parameters[i]);
                    }
                // 执行
                ps.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();// 开发阶段
                throw new RuntimeException(e.getMessage());
            } finally {
                // 关闭资源
                close(rs, ps, conn);
            }
        }
    
        // select
        public static ResultSet executeQuery(String sql, String[] parameters) {
            ResultSet rs = null;
            try {
                conn = getConnection();
                ps = conn.prepareStatement(sql);
                if (parameters != null) {
                    for (int i = 0; i < parameters.length; i++) {
                        ps.setString(i + 1, parameters[i]);
                    }
                }
                rs = ps.executeQuery();
            } catch (SQLException e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            } finally {
    
            }
            return rs;
        }
    
        // 调用无返回值存储过程
        // 格式: call procedureName(parameters list)
        public static void callProc(String sql, String[] parameters) {
            try {
                conn = getConnection();
                cs = conn.prepareCall(sql);
                // 给?赋值
                if (parameters != null) {
                    for (int i = 0; i < parameters.length; i++)
                        cs.setObject(i + 1, parameters[i]);
                }
                cs.execute();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            } finally {
                // 关闭资源
                close(rs, cs, conn);
            }
        }
    
        // 调用带有输入参数且有返回值的存储过程
        public static CallableStatement callProcInput(String sql, String[] inparameters) {
            try {
                conn = getConnection();
                cs = conn.prepareCall(sql);
                if(inparameters!=null)
                    for(int i=0;i<inparameters.length;i++)
                        cs.setObject(i+1, inparameters[i]);               
                cs.execute();
            }
            catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            }finally{
               
            }
            return cs;
        }
       
        // 调用有返回值的存储过程
        public static CallableStatement callProcOutput(String sql,Integer[] outparameters) {
            try {
                conn = getConnection();
                cs = conn.prepareCall(sql);                   
                //给out参数赋值
                if(outparameters!=null)
                    for(int i=0;i<outparameters.length;i++)
                        cs.registerOutParameter(i+1, outparameters[i]);
                cs.execute();
            }
            catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            }finally{
               
            }
            return cs;
        }
    
        public static void close(ResultSet rs, Statement ps, Connection conn) {
            if (rs != null)
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            rs = null;
            if (ps != null)
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            ps = null;
            if (conn != null)
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            conn = null;
        }
    }
    
    
    测试需要做哪些工作呢
    1、创建数据库、数据表添加数据
    因为我的数据库中已经有数据了,我就不再创建了
    
    MySQL数据库中有一个test数据库
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | test               |
    +--------------------+
    mysql> use test
    Database changed
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | products       |
    | testtime       |
    | types          |
    | userinfo       |
    | users          |
    +----------------+
    mysql> desc userinfo;
    +----------+-------------+------+-----+---------+----------------+
    | Field    | Type        | Null | Key | Default | Extra          |
    +----------+-------------+------+-----+---------+----------------+
    | id       | int(11)     | NO   | PRI | NULL    | auto_increment |
    | username | varchar(13) | NO   | UNI | NULL    |                |
    | password | varchar(13) | NO   |     | NULL    |                |
    | gender   | varchar(6)  | YES  |     | NULL    |                |
    | salary   | double(7,2) | YES  |     | NULL    |                |
    +----------+-------------+------+-----+---------+----------------+
    mysql> select * from userinfo;
    +----+----------+----------+--------+---------+
    | id | username | password | gender | salary  |
    +----+----------+----------+--------+---------+
    |  2 | Lily     | 123456   | female | 5500.00 |
    |  3 | Jim      | xaut     | male   | 6600.00 |
    |  6 | Tom      | 82312012 | male   | 5900.00 |
    |  7 | Lucy     | ncist    | female | 6000.00 |
    +----+----------+----------+--------+---------+
    存储过程:
    mysql> DELIMITER //
    mysql> CREATE PROCEDURE `test`.`proc_userinfo_insert`(
        -> username VARCHAR(13),
        -> `password` VARCHAR(13),
        -> gender VARCHAR(6),
        -> salary DOUBLE(7,2)
        -> )
        -> BEGIN
        -> INSERT INTO userinfo (username,`password`,gender,salary) VALUES (username,`password`,gender,salary);
        -> END
        -> //
    
    mysql> DELIMITER //
    mysql> CREATE PROCEDURE `test`.`proc_userinfo_update`(
        -> username VARCHAR(13),
        -> `password` VARCHAR(13),   
        -> salary DOUBLE(7,2)
        -> )
        -> BEGIN
        -> UPDATE userinfo SET `password`=pword,salary=saly WHERE username=uname;
        -> END
        -> //
    
    mysql> DELIMITER //
    mysql> CREATE PROCEDURE `test`.`proc_userinfo_delete`(
        -> uname VARCHAR(13)
        -> )
        -> BEGIN
        -> DELETE FROM userinfo WHERE username=uname;
        -> END
        -> //
    
    
    mysql> delimiter //
    mysql> CREATE PROCEDURE `test`.`proc_userinfo_findByUsername`
        -> (
        -> IN uname VARCHAR(13)
        -> )
        -> BEGIN
        -> SELECT * FROM userinfo WHERE username=uname;
        -> END
        -> //
    
    mysql> delimiter //
    mysql> CREATE PROCEDURE `test`.`proc_userinfo_getCount`
        -> (
        -> out num int
        -> )
        -> BEGIN
        -> SELECT COUNT(*) FROM userinfo;
        -> END
        -> //
    
    编写测试程序
    package edu.xaut.wuqiang.demo;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import org.junit.Test;//必须引入的
    
    public class TestSqlHelper {
        // 测试SqlHelper
        @Test//每一个测试的方法前都要加@Test
        public void testSqlHelper1() {// 一条SQL语句insert/update/delete
            testInsert();
            testUpdate();
            testDelete();
        }
    
        @Test
        public void testSqlHelper2() {// 测试一个事务的提交
            testUpdateMuti();
        }
    
        @Test
        public void testSqlHelper3() {// 测试SQl的Select语句
            testQuery();
        }
    
        @Test
        public void testSqlHelper4() {// 测试调用无返回值的存储过程
            testInsertProc();
            testUpdateProc();
            testDeleteProc();
        }
    
        @Test
        public void testSqlHelper5() {// 测试调用有返回值的存储过程
            testCallProcOutput();
            testCallProcInput();
        }
    
        private void testCallProcInput() {
            ResultSet rs = null;
            try {
                String sql = "{call proc_userinfo_findByUsername(?)}";
                String[] in = { "Tom" };
                // Integer[] out ={Types.INTEGER};
                CallableStatement cs = (CallableStatement) SqlHelper.callProcInput(
                        sql, in);
                rs = cs.executeQuery();
                while (rs.next()) {
                    System.out.println("username:" + rs.getString(2)
                            + "	password:" + rs.getString(3) + "	salary:"
                            + rs.getDouble(5));
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            } finally {
                SqlHelper.close(rs, SqlHelper.getCs(), SqlHelper.getConn());
            }
        }
    
        private void testCallProcOutput() {
            ResultSet rs = null;
            try {
                String sql = "{call proc_userinfo_getCount(?)}";
                Integer[] out = { Types.INTEGER };
                CallableStatement cs = (CallableStatement) SqlHelper
                        .callProcOutput(sql, out);
                rs = cs.executeQuery();
                while (rs.next()) {
                    System.out.println("Record numbers:"+rs.getInt(1));
                }
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e.getMessage());
            } finally {
                SqlHelper.close(rs, SqlHelper.getCs(), SqlHelper.getConn());
            }
        }
    
        private void testDeleteProc() {
            String sql = "{call proc_userinfo_delete(?)}";
            String[] parameters = { "Jim" };
            SqlHelper.callProc(sql, parameters);
        }
    
        private void testUpdateProc() {
            String sql = "{call proc_userinfo_update(?,?,?)}";
            String[] parameters = { "Lucy", "ncist", "5200.00" };
            SqlHelper.callProc(sql, parameters);
        }
    
        private void testInsertProc() {
            String sql = "{call proc_userinfo_insert(?,?,?,?)}";
            String[] parameters = { "wYan", "wyan7", "female", "5600.00" };
            SqlHelper.callProc(sql, parameters);
        }
    
        private void testUpdateMuti() {
            String sql1 = "UPDATE userinfo SET salary=salary-100 WHERE username = ?";
            String sql2 = "UPDATE userinfo SET salary=salary+100 WHERE username = ?";
            String[] sql = { sql1, sql2 };
            String[] sql1_params = { "Tom" };
            String[] sql2_params = { "Jim" };
            String[][] parameters = { sql1_params, sql2_params };
            SqlHelper.executeUpdateMultiParams(sql, parameters);
        }
    
        private void testInsert() {
            String sql = "INSERT INTO userinfo (username,password,gender,salary) VALUES (?,?,?,?)";
            String[] parameters = { "wqiang", "wYan", "male", "6000.00" };
            SqlHelper.executeUpdate(sql, parameters);
        }
    
        private void testUpdate() {
            String sql = "UPDATE userinfo SET password=?,salary=? WHERE username = 'Jim'";
            String[] parameters = { "xaut", "6500.00" };
            SqlHelper.executeUpdate(sql, parameters);
        }
    
        private void testDelete() {
            String sql = "DELETE FROM userinfo WHERE username = ?";
            String[] parameters = { "xiaoqiang" };
            SqlHelper.executeUpdate(sql, parameters);
        }
    
        private void testQuery() {
            String sql = "SELECT * FROM userinfo";
            try {
                ResultSet rs = SqlHelper.executeQuery(sql, null);
                while (rs.next()) {
                    System.out.println("userName:" + rs.getString("userName")
                            + "	password:" + rs.getString("password")
                            + "	gender:" + rs.getString("gender") + "	salary:"
                            + rs.getDouble("salary"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                SqlHelper.close(SqlHelper.getRs(), SqlHelper.getPs(), SqlHelper
                        .getConn());
            }
        }
    }
    


  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318192.html
Copyright © 2011-2022 走看看