数据篇之JDBC连接MySQL

ps: 前段时间做了一个不存在网络,获取设备存储到mysql中的数据,然后根据数据生成二维码,用户通过扫描二维码进行操作的android 程序。

其中一个需求:在没有网络的情况,要读取mysql中的数据,然后进行增删查改

解决方式:1.采用java中的jdbc链接mysql,然后进行增删查改

准备工作:mysql-connector-java-xxx-bin.jar是不可少的

(一)存储连接mysql的账号和密码,采用properties来保存,将properties文件放置到assets文件夹下

//获取Properties
public Properties getProperties() {
        InputStream inputStream = null;
        try {
            properties = new Properties();
            inputStream = BaseApplication.getContext().getAssets().open(path);
            properties.load(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                   inputStream.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return properties;
    }

(二)加载jdbc驱动,连接mysql:

  Connection接口常用api:
        1.prepareStatement():创建一个PrepareStatement对象,用于操作数据库
        2.setAutoCommit():设置是否自动提交,与事务有关
        3.rollback():回滚事务
        4.setSavePoint():设置一个恢复点,与事务有关
        5.close():关闭数据库
        6.commit():提交操作,与事务有关
    //驱动名
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
    private java.sql.Connection connection;
    //MySQL地址
    public static final String DBURL = "jdbc:mysql://192.168.0.xx:3306/yjqwxmp?useUnicode=true&characterEncoding=utf8";

    public void connnetJDBC() {
        try {
            // 加载jdbc驱动
            Class.forName(DBDRIVER);
             //通过url,和账号密码,链接mysql,获取connection
            connection = DriverManager.getConnection(DBURL, getProperties());
            //注意点:用到了事务,所以取消自动提交,反之,省略
            connection.setAutoCommit(false);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }

(三)通过PreparedStatement(预处理)接口操作数据库:

 PreparedStatement是Statement的子类,效率更高。

 PreparedStatement的使用原理:
      采用"?"的占位符,然后根据"?"扥顺序来设置内容

 除了Statement的属性外,还新增属性:
         1. int executeUpdate():执行设置的预处理sql语句
         2. resultSet executeQuery():执行数据库的查询操作,返回resultSet
         3. void   setint(int parameterIndex,int  x):根据指定索引,设置整形数据
         除此之外,还有setFloat(),setString(),setDate(),根据指定索引,设置各种类型数据

  注意点:setDate()这个方法参数是java.sql.Date,
         若是java.util.Date需要通过getTime()转换为java.sql.Date
 查询案例:
     //查询的sql
    public static final String GASWORKER_SELECT_SQL = "select id, gas_worker_id from t_gasworker_msg where gas_worker_id = ?";
    //包含数据的结果集
    ResultSet resultSet = null;
    //执行增删查改sql的接口
    PreparedStatement statement = null;

         statement = connection.prepareStatement(GASWORKER_SELECT_SQL);
         //"?"的索引为1,根据索引来设置 gas_worker_id = a123
         statement.setString(1,"a123");
         resultSet = statement.executeQuery();
         while(resultSet.next()){
             //ResultSet中的所有数据都可以通过getString()方法获得
             String id = resultSet.getString("id");
         }
         statement.close(); //关闭PreparedStatement
         result.close();    //关闭结果集
         connection.close();//关闭连接的接口

(四)使用事务批量处理sql:

事务:所有操作要门一起成功,要门一起失败
MySQL中事务处理顺序:
          1. 取消自动提交:connection.setAutoCommint(false)将执行操作先存放在 session
                         (每个链接数据库的用户都是 session)
          2.开启事务
          3.编写增,删,查,改sql语句
          4.提交事务:connection.commit();
          5.事务回滚:若是执行sql发生错误,取消操作,或者回滚到指定的记录点上
批量插入数据到数据库的案例:
    //首先设置,自动提交取消
    connection.setAutoCommit(false);

    public static final String GASFILTRATIONRECODER_INSERT = "insert into t_gas_filtration_recoder (gas_exchange_index,staff_ic_id) values (?,?)";
    PreparedStatement insert_Statement = null;

    try{
        insert_Statement  =connection.prepareStatement(GASFILTRATIONRECODER_INSERT);
        for(int i=0;i<2;++i){
                insert_Statement.setString(1,String.valuesOf(i));
                insert_Statement.setString(2,"a"+i);
                insert_Statement.addBatch();//添加事务
          }

         //批量执行
         int[]  i= statement.executeBatch();
         //事务提交
         connection.commit();
         if(i==2){  //当执行sql的数量为添加事务的总数时,执行成功

         }
       }catch(Exception e){
          try {
            //若是事务执行sql错误,回滚事务
             connection.rollback();
           } catch (Exception e2) {
        }
         e.printStackTrace();

       }finally{
           if (insert_Statement != null) {
               insert_Statement.close();
           }
           if (connection != null) {
               connection.close();
               connection = null;
           }

       }

(五)使用元数据分析数据库:

  ResultSetMetaData:获取到Resultet对象中列的数据类型和属性信息得对象
     1.int getColumnnCount():获取一个查询结果中的列数
     2.boolean isAutolncrement(int column):判断指定列是否为自动编号
     3.string getColumnName(int column):返回指定列的名字

个人指定需求案例:

项目需求:
       1.在mysql中查询到新数据,修改新数据标示,将新数据保存到本地
         (android 自带数据库 SQLiteDatabase)
       2.向myslq中插入数据,更新数据,删除数据,mysql数据库和SQLiteDatabase同步
       3.合并多条数据为一条数据,插入MySql中

将jdbc操作封装在一个utls类中:

public class JDBCUtils {
    public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";
    private static final String path = "gasstation.properties";
    private java.sql.Connection connection;
    private Properties properties;
    //数据库的url
    public static final String DBURL = "jdbc:mysql://192.168.0.xx:3306/yjqwxmp?useUnicode=true&characterEncoding=utf8";

    private String selectSql1 = "select  geid, gas_station_gun_id,gas_type,gas_volume,gas_desity,staff_ic_id,consumer_ic_id,group_no,gas_exchange_index,gas_exchange_time_start,gas_exchange_time_end  from t_gas_exchange_info  where upload_flg = 0  and ";

    public String workNumber = "staff_ic_id =";

    public static final String GASMSG_UPDATE_SQL = "update t_gas_msg  set gas_machine_id=? where gas_station = ? ";

    public static final String GASMSG_SELECT_SQL = "select id ,gas_station,gas_machine_id from t_gas_msg where gas_station = ?";

    public static final String GASWORKER_INSERT_SQL = "insert into t_gasworker_msg(gas_worker_id) values(?)";

    public static final String GASWORKER_UPDATE_SQL = "update t_gasworker_msg set gas_worker_id=? where gas_worker_id =?";
    public static final String GASFILTRATIONRECODER_INSERT = "insert into t_gas_filtration_recoder (gas_exchange_index,staff_ic_id,gas_type,gas_volume,gas_exchange_time_end,merge_flg,data_source) values (?,?,?,?,?,?,?)";

    public static final String GASFILITRATIONRECODER_UPDATE = "update t_gas_filtration_recoder set merge_flg =1 where gas_exchange_index=";

    public static final String AND = " and geid=";

    public JDBCUtils() {
        connnetJDBC();
    }

    public void connnetJDBC() {
        try {
            // 加载jdbc驱动
            Class.forName(DBDRIVER);
            connection = DriverManager.getConnection(DBURL, getProperties());
            connection.setAutoCommit(false);// 取消自动提交
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            LogController.i("result_return", connection + " ");
        }
    }
    //关闭连接
    public void closeConnection() {
        try {
            if (connection != null) {
                connection.close();
                connection = null;
            }
        } catch (Exception e) {
        }

    }
    //获取Properties
    public Properties getProperties() {
        InputStream inputStream = null;
        try {
            properties = new Properties();
            inputStream = BaseApplication.getContext().getAssets().open(path);
            properties.load(inputStream);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return properties;
    }

    //获取到android本地数据库上的员工信息
    public List<String> getGasWorkerRecoder() {
        Cursor cursor = null;
        try {
            ContentResolver resolver = BaseApplication.getContext()
                    .getContentResolver();
            cursor = resolver.query(DateProviderContract.GASWORKER_URI, null,
                    null, null, null);
            if (cursor.moveToFirst()) {
                List<String> list = new ArrayList<String>();
                do {
                    list.add(cursor.getString(cursor
                            .getColumnIndex(DateProviderContract.COLUMN_NUMBER)));
                } while (cursor.moveToNext());
                return list;
            }
        } catch (Exception e) {
        } finally {
            try {
                if (cursor != null) {
                    cursor.close();
                }
            } catch (Exception e2) {
            }
        }
        return null;
    } 

    //获取mySql中最新设备信息,且修改新信息得标志为旧信息,将获取到的信息存到本地
    public void operateGasRecoder() {
        ResultSet resultSet = null;
        PreparedStatement statement = null, insert_Statement = null;
        List<ContentValues> list = null;
        List<String> workerList = getGasWorkerRecoder();
        if (workerList == null) {
            closeConnection();
            return;
        }
        LogController.i("tiemss", "connection " + connection);
        try {
            if (connection == null) {
                return;
            }
            LogController.i("tiemss", "list size" + workerList.size());
            StringBuffer buffer = new StringBuffer();
            buffer.append(selectSql1);
            for (int i = 0; i < workerList.size(); i++) {
                if (i != 0) {
                    buffer.append(" or ");
                } else {
                    if (workerList.size() > 1) {
                        buffer.append("(");
                    }
                }
                buffer.append(workNumber);
                buffer.append("‘");
                buffer.append(workerList.get(i).trim());
                buffer.append("‘");
                if (i == workerList.size() - 1) {
                    if (workerList.size() > 1) {
                        buffer.append(")");
                    }
                }
            }
            statement = connection.prepareStatement(buffer.toString());

            resultSet = statement.executeQuery();
            insert_Statement = connection
                    .prepareStatement(GASFILTRATIONRECODER_INSERT);
            StringBuffer buffer2 = null;
            while (resultSet.next()) {
                if (list == null) {
                    list = new ArrayList<ContentValues>();
                    buffer2 = new StringBuffer();
                    buffer2.append("update t_gas_exchange_info set  upload_flg = 1 where geid = ");
                }
                buffer2.append(resultSet.getInt(1));
                buffer2.append(AND);
                insertGasFiltrayionTable(resultSet, insert_Statement);
                list.add(getContentValues(resultSet));
            }
            if (buffer2 != null) {
                String str = buffer2.toString().trim();
                LogController.i("tiemss", str
                        .substring(0, str.lastIndexOf(AND)).trim());
                insert_Statement.addBatch(str
                        .substring(0, str.lastIndexOf(AND)).trim());
            }
            int[] insertSize = insert_Statement.executeBatch();
            connection.commit();
            // 保存到本地 android 数据库,
            if (insertSize.length > 0) {
                ContentValues[] values = new ContentValues[list.size()];
                for (int i = 0; i < list.size(); i++) {
                    values[i] = list.get(i);
                }
                ContentResolver resolver = BaseApplication.getContext()
                        .getContentResolver();
                //批量插入
                int length = resolver.bulkInsert(
                        DateProviderContract.RECODER_URI, values);
                LogController.i("result_return", length + " ");
            }
        } catch (Exception e) {
            e.printStackTrace();
            if (resultSet != null) {
                try {
                    connection.rollback();// 事务回滚
                } catch (Exception e2) {
                }
            }
        } finally {
            try {

                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                if (insert_Statement != null) {
                    insert_Statement.close();

                }
                if (list != null) {
                    list.clear();
                    list = null;
                }
                if (workerList != null) {
                    workerList.clear();
                    workerList = null;
                }
                closeConnection();

            } catch (Exception e2) {
                e2.printStackTrace();
            }

        }
    }

    //插入过滤后的数据
    public void insertGasFiltrayionTable(ResultSet resultSet,
            PreparedStatement statement) {
        try {
            statement.setInt(1, resultSet.getInt(9));
            statement.setString(2, resultSet.getString(6));
            statement.setInt(3, resultSet.getInt(3));
            statement.setString(4, resultSet.getString(4));
            statement.setTimestamp(5, resultSet.getTimestamp(11));
            statement.setInt(6, 0);
            statement.setString(7, null);
            statement.addBatch();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public ContentValues getContentValues(ResultSet resultSet) {
        ContentValues values = new ContentValues();
        try {
            values.put(DateProviderContract.COLUMN_CHANGNUMBER,
                    resultSet.getString(9));
            values.put(DateProviderContract.COLUMN_GASNUMBER,
                    resultSet.getString(2));
            values.put(DateProviderContract.COLUMN_GASSTYLE,
                    resultSet.getString(3));
            values.put(DateProviderContract.COLUMN_GASVOLUME,
                    resultSet.getString(4));
            values.put(DateProviderContract.COLUMN_TIME,
                    resultSet.getString(11));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return values;
    }

    //更新特殊条件过滤后的信息记录
    public void upDateFiltrationRecoder(String  gaschangindex,String staff_id,String gas_type,Double gas_volume,String gas_time,String  source,String updateSql) {
        if (connection == null) {
            return;

        }
        PreparedStatement statement = null;
        try {
            statement = connection
                    .prepareStatement(GASFILTRATIONRECODER_INSERT);
            statement.setInt(1, Integer.valueOf(gaschangindex));
            statement.setString(2, staff_id);
            statement.setInt(3, Integer.valueOf(gas_type));
            statement.setString(4, String.valueOf(gas_volume));
            statement.setTimestamp(5, Timestamp.valueOf(gas_time));
            statement.setInt(6, 1);
            statement.setString(7, source);
            statement.addBatch();
            statement.addBatch(updateSql);
            statement.executeBatch();
            connection.commit();
        } catch (Exception e) {
            try {
                connection.rollback();
            } catch (Exception e2) {
            }
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (connection != null) {
                    connection.close();
                }
            } catch (Exception e2) {
            }

        }

    }

    public void updateDb(int geid, Statement statement) {
        StringBuilder builder = new StringBuilder();
        builder.append("update t_gas_exchange_info set  upload_flg = 1 where geid =");
        builder.append(geid);
        try {
            statement.addBatch(builder.toString());
        } catch (Exception e) {
        }
    } 

    //插入设备信息到mysql中
    public synchronized void operateGasSystem(SparseArray<String> array) {
        if (connection == null) {
            return;
        }
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            statement = connection.prepareStatement(GASMSG_SELECT_SQL);
            statement.setString(1, array.get(0));
            resultSet = statement.executeQuery();

            if (!resultSet.next()) {
                statement = connection.prepareStatement(GASMSG_INSET_SQL);
                statement.setString(1, array.get(0));
                statement.setString(2, array.get(1).trim());
                statement.execute();
                connection.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
                closeConnection();
            } catch (Exception e2) {
            }

        }
    } 

    //插入员工信息到mysql中
    public synchronized void operateGasWorker(SparseArray<String> array) {
        if (connection == null) {
            return;
        }
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            statement = connection.prepareStatement(GASWORKER_SELECT_SQL);
            statement.setString(1, array.get(0));
            resultSet = statement.executeQuery();

            if (!resultSet.next()) {
                statement = connection.prepareStatement(GASWORKER_INSERT_SQL);
                statement.setString(1, array.get(0));
                statement.execute();
                connection.commit();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (statement != null) {
                    statement.close();
                }
                if (resultSet != null) {
                    resultSet.close();
                }
                closeConnection();
            } catch (Exception e2) {
            }

        }

    }

}
时间: 2024-10-07 17:03:01

数据篇之JDBC连接MySQL的相关文章

使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询

转载请注明:http://blog.csdn.net/uniquewonderq 问题: 使用JDBC连接Mysql数据库,实现对Emp表数据的分页查询功能. 方案: 对于较大的数据量,通常采用分页查询的方式.不同的数据库产品有不同的数据库级的分页查询策略.例如:Oracle通常使用rownum的方式:而Mysql使用limit的方式. Oracle采用rownum和子查询实现分页查询,SQL语句如下, select * from (select rownum rn,empno,ename,jo

java jdbc 连接mysql数据库 实现增删改查

好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打交道非常基础的一个知识,也是比较接近底层的,在实际的工作中大家用得更多的其实还是比较成熟的框架,例如Hibernate.Mybatis. 但是作为这些成熟框架的底层的jdbc却也是我们应该去掌握的,只有了解了jdbc的增删改查,这样在以后如果有兴趣去研究Hibernate或者Mybatis的源代码的

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识         JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制.

JAVA使用JDBC连接MySQL数据库 二(2)

本文是对 <JAVA使用JDBC连接MySQL数据库 二>的改进. 上节使用的是PreparedStatement来执行数据库语句,但是preparedStatement需要传递一个sql语句参数,才能创建.然而,DBHelper类只是起到打开和关闭数据库的作用,所以sql语句是要放到应用层部分的,而不是放到DBHelper类中. 而statment不需要传递一个sql语句参数,就能创建. 修改部分如下: public class DBHelper { String driver = &quo

jdbc 连接mysql数据库

jdbc驱动到官网下载,放在jdk的相关目录下面,或者jar文件加入到工程下面 package test_mysql; import java.sql.*; import java.util.Set; public class testjdbc { public static Connection getConnection() throws ClassNotFoundException, SQLException{ String URL="jdbc:mysql://localhost:3306

Crystal Reports 2008(水晶报表) JDBC连接mysql数据库

在本blog中,主要介绍的是Crystal Reports 2008使用JDBC连接mysql数据库. 在连接之间,首先要确认你电脑上面都安装了mysql数据库. 其次,就是jdbc连接数据时候所使用的相关jar包. 接下来,就可以进行数据库的一些连接操作了. 对JDBC不是很了解的,可以到 完整java开发中JDBC连接数据库代码和步骤 了解相关的操作 1.打开Crystal Reports的数据专家 2.点击JDBC(JNDI)出现: 3.输入url和数据库类名,点击下一步: 4.输入pas

java jdbc 连接mysql 数据库

JDBC连接MySQL 加载及注册JDBC驱动程序 Class.forName("com.mysql.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver").newInstance(); JDBC URL 定义驱动程序与数据源之间的连接 标准语法: <protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<data source identif

分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)

         分页查询信息       使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目时一个简单的运用eclipse+jdbc+mysql的小程序. 连接的数据库名称为db_database11,属性如下: 1.创建名为com.pmf.bean的包,包中是名为Product的类,用于封装商品信息. 全部代码如下: package com.pmf.bean; /** * 商品 * */

第七篇:Python3连接MySQL

第七篇:Python3连接MySQL 连接数据库 注意事项 在进行本文以下内容之前需要注意: 你有一个MySQL数据库,并且已经启动. 你有可以连接该数据库的用户名和密码 你有一个有权限操作的database 基本使用 # 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host="你的数据库地址", user="用户名",password="密码",database=