最近的 Java Web 项目使用了 Mysql 数据库,本文大致讲解了 Java 如何 通过 Jdbc 连接数据库 。其中主要步骤为:安装 Mysql、下载 JDBC 驱动、建立Connection、利用PreparedStatement对 Mysql 插入数据。

本文还记录了使用Mysql遇到的一些坑,并探讨一下如何把数组插入 Mysql中,方案笔者尝试了2个方法:

  • Arrays.toString( )把数组格式化为[xxx , xxx , xxx ,] 插入 Mysql中。如果有更好的方法,欢迎各位留言。
  • 序列化数组,存入 Mysql 的 Blob 类型中,读取的时候需要反序列化

本文地址 http://blog.csdn.net/never_cxb/article/details/50574077 转载请注明出处

本地安装 Mysql 数据库

Mysql 官方网址 http://dev.mysql.com/downloads/mysql/ ,下载完安装。

具体可以查看这篇文字 关于本地安装 Mysql 的一些坑 ,记录了笔者安装遇到了一些坑。

下载MySQL Connector/J

通过 JDBC 连接数据库需要Mysql jdbc 驱动。

MySQL Connector/J是MySQL官方JDBC驱动程序,官方下载地址 https://dev.mysql.com/downloads/connector/j/ 。把下载好的mysql-connector-java-5.1.38.jar 加到 Java 工程的Build Path 中。

Note
mysql-connector-java-5.1.38.jar 连接 5.0.xx 版本 的 Mysql 可能会报下面的错误。这是MySQL Connector/J的一个 Bug,解决方法:换 jar 包,笔者把 jar 包换成了 mysql-connector-java-5.0.8-bin.jar。

java.sql.SQLException: Unknown system variable 'language'
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)

在数据库中建表可以通过图形化工具,如 MySQLWorkBench、Navicat等等。下图是MySQLWorkBench工具建表的截图。

当然也可以通过 Sql 语句来建表了,下面是笔者建表的示例:

CREATE TABLE IF NOT EXISTS `latest` (
  `id` int(11) NOT NULL,
  `image_urls` text,
  `title` varchar(45) NOT NULL,
  `publish_date` date NOT NULL,
  `read_times` int(11) NOT NULL,
  `source` varchar(10) NOT NULL,
  `body` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Java 代码 建立Mysql Connection

下面的代码he

public class MysqlTool {
    private static Connection con = null;
    // 为了方便分析错误,将异常全部抛出到最顶层
    public static Connection getConnection() throws Exception {
        if (con != null) {
            return con;
        // JDBC驱动程序
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        // 后面unicode和utf8设置防止中文乱码
        String url = "jdbc:mysql://127.0.0.1:3306/**database_name**?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf-8";
        String name = "**user**";
        String password = "**password**";
        con = DriverManager.getConnection(url, name, password);
        return con;
    public static void closeConnection() {
        if (con != null) {
            try {
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();

一般来说 url 只需要 jdbc:mysql://127.0.0.1:3306/**database_name**"就够了,autoReconnect=true是自动重连,useUnicode=true&characterEncoding=utf-8是为了防止插入中文字符乱码。

Mysql 存放数组

public class ArticleItem {
    private int id;
    private String[] imageUrls;
    private String title;
    private String publishDate;
    private int readTimes;
    private String source;
    private String body;    
    // get set method ignored...

笔者的需求是把某条新闻记录插入到 Mysql 中,新闻包含了 id、图片、标题、发布时间、阅读次数、信息来源、主题内容。

其中图片可能有多个,笔者使用数组保存图片的 Url。

问题来了?数组类型的对象怎么插入到 Mysql 中。
比如 String [] imageUrls = [1cb92bd38a437236bbf28f75525b644a, ca30033a28dfe266c67c9fea9a108427];,Mysql 中对应的字段取什么类型,怎么插入呢?

笔者是这么处理的,先把 String[] 转化为字符串插入Mysql,再从 Mysql 中读取字符串,把字符串转化为 String[] 。

由于String [] imageUrls的长度不规定,最多可能到10+,大于 varchar(255),所以选用 text 类型,`image_urls text`。

//数组 -> String
preparedStmt.setString(2, Arrays.toString(article.getImageUrls()));
//逆向,String -> 数组
String[] imageUrls = rs.getString(2).replace("[", "").replace("]", "").split(", ");

PHP 序列化数组 存入 Mysql

其他方案可以把数组序列化,存入Mysql Blob 类型的字段,读取的时候 Mysql 中取出记录反序列化为数组。

笔者本来想尝试用 Java 实现这种方案,但发现String[] 类型转化为 byte[]代码比较冗余,得不偿失。

意外看到 PHP 代码(How to store array in mysql?)对于serialize和unserialize支持很好,看来Mysql 和 PHP 更配哟。

将数组插入 Mysql 中

$array = array("foo", "bar", "hello", "world"); $conn=mysql_connect('localhost', 'mysql_user', 'mysql_password'); mysql_select_db("mysql_db",$conn); $array_string=mysql_escape_string(serialize($array)); mysql_query("insert into table (column) values($array_string)",$conn);

从 Mysql 中读取,反序列化为数组

$conn=mysql_connect('localhost', 'mysql_user', 'mysql_password'); mysql_select_db("mysql_db",$conn); $q=mysql_query("select column from table",$conn); while($rs=mysql_fetch_assoc($q)) $array= unserialize($rs['column']); print_r($array);

插入记录,查询记录

预编译的SQL语句存储在PreparedStatement对象中,如果SQL 语句执行多次的话,PreparedStatement的执行效率一般要高于Statement。Sql 语句格式如下:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....) 
public class ArticleDao {
    private Connection connection;
    public ArticleDao() throws Exception {
        connection = MysqlTool.getConnection();
    public int insertArticle(ArticleItem article) throws SQLException
        // the mysql insert statement
        String query = " insert into latest (id, image_urls, title, publish_date, read_times,source,body)"
                + " values (?, ?, ?, ?, ?,?,?)";
        // create the mysql insert preparedstatement
        PreparedStatement preparedStmt = connection.prepareStatement(query);
        preparedStmt.setInt(1, article.getId());
        preparedStmt.setString(2, Arrays.toString(article.getImageUrls()));
        preparedStmt.setString(3, article.getTitle());
        preparedStmt.setDate(4, Date.valueOf(article.getPublishDate()));
        preparedStmt.setInt(5, article.getReadTimes());
        preparedStmt.setString(6, article.getSource());
        preparedStmt.setString(7, article.getBody());
        return preparedStmt.executeUpdate();

PreparedStatement不再使用+拼接 Sql 语句的方式,而是通过占位符,使用preparedStmt.setInt() setString() setDate() 来把不同类型的数据插入到 Mysql 中。

public ArticleItem getArticleById(int id) throws SQLException { // the mysql select statement String query = "select * from latest where id = ?"; // create the mysql preparedstatement PreparedStatement preparedStmt = connection.prepareStatement(query); preparedStmt.setInt(1, id); ResultSet rs = preparedStmt.executeQuery(); while (rs.next()) { String[] imageUrls = rs.getString(2).replace("[", "").replace("]", "").split(", "); String title = rs.getString(3); String date = rs.getDate(4).toString(); int readTimes = rs.getInt(5); String source = rs.getString(6); String body = rs.getString(7); ArticleItem article = new ArticleItem(id, imageUrls, title, date, readTimes, source, body); return article; return null;

查询的时候返回一个ResultSet,是返回记录的集合 ,通过next()方法可以依次处理每条记录。通过getString() getInt()可以得到各列的数据。

注意 getXxx()方法的参数columnIndex是从1开始的,不是从0。

String getString(int columnIndex)
                 throws SQLException
Retrieves the value of the designated column in the current row of this ResultSet object as a String in the Java programming language.
Parameters:
columnIndex - the first column is 1, the second is 2, ...
前言最近的 Java Web 项目使用了 Mysql 数据库,本文大致讲解了 Java 如何 通过 Jdbc 连接数据库 。其中主要步骤为:安装 Mysql、下载 JDBC 驱动、建立Connection、利用PreparedStatement对 Mysql 插入数据。本文还记录了使用Mysql遇到的一些坑,并探讨一下如何把数组插入 Mysql中,方案笔者尝试了2个方法:Arrays.toStri
javamysql建表插入修改测试代码 /** 数据库连接地址 数据库名test*/ private static final String JDBC_URL = "jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"; /** 数据库用户名 */ private static final String JDBC_USERNAME = "root"; /** 数据库密码 */ private static final String JDBC_PASSWORD = "123456";
用户昵称存在emoji表情,调用jdbcmysql数据库插入的时候抛出异常 java.sql.SQLException: Incorrect string value: '\xF0\x9F\x90\x9B' mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。但是utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。 下面话不多说了,来一起看看详细的介绍吧 一. 修改database、table、column字符集 修改database字符集
javamysql日期的问题。通过javamysql插入datetime类型的数据: String sql = "INSERT INTO wp_posts ( post_date )VALUES(?)"; PreparedStatement pstmt = connection.prepareStatement(sql); Timestamp time = new Timestamp(System.currentTimeMillis()); pstmt.setTimestamp(1, time);
代码如下:import java.sql.*;public class mysql {    public static String url = “jdbc:mysql://localhost:3306/test”;//characterEncoding=GBK    public static String username = “root”;    public static String password = “root”;    public static Connection con;    public static Statement stmt;    public stati
在设计到数据库的开发,难免要将图片或音频文件插入数据库的情况。一般来说,我们可以同过插入图片文件相应的存储位置,而不是文件本身,来避免直接向数据库插入的麻烦。但有些时候,向MySQL插入图片更加容易管理。那么在MySQL该怎么存储呢? 参考资料[1]有个相当清晰的例子,不过是基于MySQL图形界面的查询工具Query Brower的,你的机子上没有安装的话,可能得不到很好的理解。我在这里不在赘述,更详细的资料请看给出的链接吧。 还有,[1]的例子其实只是向我们说明了Query Brower的易用和强大,对我们在开发实际应用不是很大。所以下面就让我们用JAVA写一个
切割字符串数组作为字符串参数传入sql的两种方式方式一: 'XX1','XX2','XX2',方式二: 'XX1','XX2','XX2' 方式一: ‘XX1’,‘XX2’,‘XX2’, ##此方式需要切割最后一个, String reviewReportIds="1,2,3,4,5"; String[] reviewReportAttr = reviewReportIds.slipt(...
public class ProblemCheckRecording implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integ 5)字段名称一般采用名词或动宾短语 6)采用字段的名字必须是易于理解,一般不超过三个英文单词 7)在命名表的列时,不要重复表的名称(如:在 user 表,出现 user_name 字段) 8)字段命名使用完整名称 1.2、列的类型定义 1.2.1 字符串类型_ENUM 和SET类型 ENUM 和SET类
要在Java Swing应用程序显示MySQL数据库内的表,您需要执行以下步骤: 1. 连接到MySQL数据库:使用JavaJDBC API连接到MySQL数据库。 2. 执行查询操作:使用JDBC API执行SELECT语句获取表的数据。 3. 将数据加载到Java Swing表格:将查询结果加载到Java Swing表格,以便在应用程序显示。 以下是一个简单的示例代码,演示如何将MySQL数据库内的表加载到Java Swing表格: import java.sql.*; import javax.swing.*; import javax.swing.table.DefaultTableModel; public class MySQLTableExample extends JFrame { private JTable table; public MySQLTableExample() { setTitle("MySQL Table Example"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 500); setLocationRelativeTo(null); // 连接到MySQL数据库 Connection conn = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost/mydatabase", "root", "password"); } catch (Exception ex) { ex.printStackTrace(); // 执行查询操作 Statement stmt = null; ResultSet rs = null; try { stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM mytable"); // 将查询结果加载到Java Swing表格 DefaultTableModel model = new DefaultTableModel(); table = new JTable(model); model.addColumn("ID"); model.addColumn("Name"); model.addColumn("Age"); while (rs.next()) { model.addRow(new Object[]{rs.getInt("id"), rs.getString("name"), rs.getInt("age")}); JScrollPane scrollPane = new JScrollPane(table); getContentPane().add(scrollPane); } catch (SQLException ex) { ex.printStackTrace(); } finally { try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException ex) { ex.printStackTrace(); public static void main(String[] args) { MySQLTableExample example = new MySQLTableExample(); example.setVisible(true); 在此示例,我们使用JDBC API连接到MySQL数据库,并执行SELECT语句获取mytable表的数据。然后,我们使用DefaultTableModel模型将查询结果加载到Java Swing表格,最后将表格添加到JFrame窗口以便在应用程序显示。