JDBC中的批量插入和乱码解决

Posted kuillldan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDBC中的批量插入和乱码解决相关的知识,希望对你有一定的参考价值。

字符集-乱码问题

用JDBC访问mysql数据库的时候,如果JDBC使用的字符集和MySql使用的字符集不一致,那么会导致乱码发生。解决办法当时是在使用JDBC的时候指定和数据库一样的字符集。我们可以在DB_URL字符串后加上”?characterEncoding=XXX”的方式指定JDBC使用的字符集。

 

同时,我们需要知道MySql中使用的字符集,可以通过以下两个命令获取。

1)      show variables like ‘%character%‘;获取数据库或者整个服务器使用的字符集。

 

可以看到,上面截图显示笔者整个数据库服务器以及当前数据库使用的都是GBC编码。

2)      show create table user; 获取user表使用的字符集

 

上面截图显示当前user表使用的字符集也是gbk。其实,我们还可以对每一个列设置字符集。

那么这几个级别的字符集,到底用的哪一个呢?其实他们是有优先级的:

Column> Table> Database > Server

 

批量插入问题

有些时候我们需要向数据库中插入一大批数据,如果单纯的使用普通SQL语句一条一条向数据库插入呢效率会非常慢。这个时候我们就可以利用Statement的批量插入数据接口来实现功能。

 

示例代码:

 

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import java.util.List;

 

class User

{

     private String userid;

     private String name;

     private String password;

    

    

     public User(String userid, String name, String password)

     {

           this.setUserid(userid);

           this.setName(name);

           this.setPassword(password);

     }

    

     public String getUserid()

     {

           return userid;

     }

     public void setUserid(String userid)

     {

           this.userid = userid;

     }

     public String getName()

     {

           return name;

     }

     public void setName(String name)

     {

           this.name = name;

     }

     public String getPassword()

     {

           return password;

     }

     public void setPassword(String password)

     {

           this.password = password;

     }

}

 

 

public class Hello

{

     static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

     static String DB_URL = "jdbc:mysql://localhost:3306/mldn";

     static final String USERNAME = "root";

     static final String PASSWORD = "admin";

    

    public static void main(String a[]) 

    {

    Connection conn = null;

    Statement stmt = null;

    ResultSet rs = null;

    List<User> listUser = Hello.getUser();

   

    try

           {

           //加载驱动

                Class.forName(JDBC_DRIVER);

                //获取链接

                DB_URL += "?characterEncoding=gbk";

                conn = DriverManager.getConnection(DB_URL, USERNAME, PASSWORD);

                //执行SQL语句

                stmt = conn.createStatement();

                for(User item : listUser)

                {

                     stmt.addBatch("INSERT INTO user(userid,name,password) VALUES(‘"+item.getUserid()+"‘,‘"+item.getName()+"‘,‘"+item.getPassword()+"‘);");

                }

                stmt.executeBatch();

                stmt.clearBatch();

           }

    //异常处理

    catch (ClassNotFoundException e)

           {

                // TODO Auto-generated catch block

                e.printStackTrace();

           } catch (SQLException e)

           {

                // TODO Auto-generated catch block

                e.printStackTrace();

           }

    finally

    {

           //资源清理

                try

                {

                     conn.close();

                     stmt.close();

                     rs.close();

                }

                catch(Exception e)

                {

                     //ignore exceptions when closing.

                }

           }

   

   

   

    System.out.println("///Done~~");

    }

   

    public static List<User> getUser()

    {

    List<User> userList = new ArrayList<User>();

    userList.add(new User("cyx", "陈奕迅", "cyx999"));

    userList.add(new User("zjl", "ZHOU JIELUN", "zjl123"));

    userList.add(new User("cjk", "苍井空", "cjk520"));

    userList.add(new User("ly", "LIU YAN", "ly1988"));

   

    return userList;

    }

}

 

以上是关于JDBC中的批量插入和乱码解决的主要内容,如果未能解决你的问题,请参考以下文章

jdbc-批量插入批量删除批量更新

jdbc 批量插入和查询与使用生成键的单次插入

jdbc 批量插入数据,多少条批量插入效率最高

JDBC 批量插入异常处理以了解特定的失败记录

jdbc批量插入实现大批量数据快速插入

使用 JDBC 和唯一约束进行批量插入