mysql数据库---批处理与大文本/图片类型

来源:互联网 发布:剑三男捏脸数据 编辑:程序博客网 时间:2024/05/17 22:05

要在java对数据库做任何操作,第一件事当然是获取数据库连接,笔者是通过配置文件的形式加载数据库信息的,配置文件名为db.properties,内容如下

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/customermanage
username=root
password=root

ps:properties中的内容均为键值对形式,不需要用到引号

接下来是DBUtil类,获取配置,得到连接

package com.cherry.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import java.util.ResourceBundle;public class DBUtils {    static String driver;    static String url;    static String username;    static String password;    static {        try {            // Class.forName("com.mysql.jdbc.Driverr");            // DriverManager.getConnection("jdbc:mysql://localhost:3306/customermanage",            // "root", "root");            ResourceBundle rb = ResourceBundle.getBundle("db");            driver = rb.getString("driver");            Class.forName(driver);            url = rb.getString("url");            username = rb.getString("username");            password = rb.getString("password");        } catch (ClassNotFoundException e) {            e.printStackTrace();        }    }    public static Connection getConn() throws SQLException {        return DriverManager.getConnection(url, username, password);    }    public static void releaseRes(ResultSet rs, PreparedStatement ps,            Connection conn) throws SQLException {        if (rs != null) {            rs.close();        }        if (ps != null) {            ps.close();        }        if (conn != null) {            conn.close();        }    }}

先说说批处理操作类,还是和普通的SQL操作一样使用PreparedStatement 类,但会使用到addBatch()方法,笔者假定存入一万条数据,每100条作为一个批次,操作代码如下

package com.cherry.batch;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.SQLException;import com.cherry.utils.DBUtils;public class BatchSQL {public static void main(String[] args) throws SQLException {    Connection conn= DBUtils.getConn();    String sql="insert into des value(?,?)";    PreparedStatement ps=conn.prepareStatement(sql);    for ( int i=0;i<10000 ;i++) {        ps.setString(1, "name"+i);        ps.setString(2, "des"+i);        ps.addBatch();        if(i%100==0){            ps.executeBatch();            ps.clearBatch();        }    }}}

再看大文本或图片类型的存储,和上面一样使用的是PreparedStatement ,用到的方法是setCharacterStream(),要注意类型匹配的问题,文件长度file.length()是long型,而setCharacterStream()的第三个参数可能是int也有可能是long(取决于驱动版本),所以可能出现编译不报错但运行报错的问题,操作代码如下

package com.cherry.batch;import java.io.File;import java.io.FileInputStream;import java.io.FileReader;import java.io.Reader;import java.sql.Connection;import java.sql.PreparedStatement;import java.util.UUID;import com.cherry.utils.DBUtils;public class TextSQL {    public static void main(String[] args) {        try {            Connection connection = DBUtils.getConn();            String  sql = "insert into des values(?,?)";            PreparedStatement ps = connection.prepareStatement(sql);            ps.setString(1, UUID.randomUUID().toString());            File file = new File("f://test.txt");            Reader reader = new FileReader(file);            //这里不一定要强转,看你的mysql驱动版本,总之不转不行就转个试试            ps.setCharacterStream(2, reader, (int)file.length());            ps.executeUpdate();        } catch (Exception e) {            e.printStackTrace();        }    }}

另外,注意导包,这里所有的数据库操作类所导的都是java.sql下的,想想也知道,面向接口编程的Java君,肯定是使用sql包的(普适性),因为mysql/sqlserver/orcale这些都是实现类,用他们肯定不合适。

1 0