MySQL操作, Java JDBC

最近编写一个“一本糊涂账”的Java项目,连接mysql数据库进行数据更新和相应的软件界面开发。
其中涉及到了很多MySQL的使用,在这里做一个记录

Java使用mysql的库 JDBC

在Oracle主页下载,是免费的。
项目指导中提供的是 mysql-connector-java-5.0.8-bin.jar
但是在进行开发的过程中,出现了版本功能不一致的现象。
更新版本的jdbc库 mysql-connector-java-8.0.16.jar

  1. jdbc-8.0中的相关driver类com.mysql.cj.jdbc.Driver,但jdbc-5.0中的相关类是com.mysql.jdbc.Driver

    1
    2
    3
    4
    5
    6
    7
    程序代码:
    String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);
    return DriverManager.getConnection(url,loginName,password);

    出现报错:
    com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Client does not support authentication protocol requested by server; consider upgrading MySQL client
    这个表示我们安装的mysql版本与jdbc driver不匹配。所以要更新到jdbc-8.0。
  2. jdbc库
    String sql;
    (1) 执行sql命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    try(Connection connection = DBUtil.getConnection(); 
    Statement s = connection.createStatement();){

    s.execute(); //执行命令
    ResultSet rs = s.getGeneratedKeys(); //获得当前的rs

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

    (2) 执行sql参数命令:

    1
    2
    3
    4
    5
    6
    7
    PreparedStatement ps = connection.preparedStatement(sql, Statement.RETURN_GENERATED_KEYS); //这里设置Statement.RETURN_GENERATED_KEYS

    ps.setString(1, value);
    ps.setString(2, value);

    ps.execute();
    ResultSet rs = ps.getGeneratedKeys();

    (3) 如何判断ResultSet是否返回数据集

    1
    判断rs.next()。如果rs.next()存在,则返回数据集结果存在。

    (4) 获取返回resultset的id

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    有两种方式,但是其中一种并不稳定
    首先设置实体类
    class table_name{
    public int id;
    public String key;
    public String Value;
    }

    if(rs.next()){
    //下边两个获取id的方式否可以,1表示id是表内的第一行,这个需要与db中的一样。
    //但“id”并不稳定,有时候会出现找不到column的报错,目前还没发现是为什么
    int id = rs.getInt(1);
    int id = rs.getInt("id");
    }
  3. mysql命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    mysql > 命令行 

    **添加数据库**
    create database_name

    **添加表**
    create table config(
    id int auto_increment, # id列 int类型 auto_increment 设置自增加
    key_ varchar(255),
    value varchar(255),
    primary key (id) # 设置id为主键
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8; #InnoDB表示数据库关闭后数据仍然保存
    create table record(
    id int auto_increment,
    spend int, #本次花费
    cid int, #对应category中的分类,外键,指向category的主键
    comment varchar(255), #备注
    date Date, #本次记录发生的时间
    primary key(id),
    constraint fk_record_category foreign key (cid) references category(id) #设置外键约束
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    **使用数据库**
    use database_name

    **添加命令 (null表示空出来的id)**
    insert into table_name value (null, value1, value2, ...)
    insert into table_name (field1, field2, ...) value (value1, value2, ...)

    **删除命令**
    delete from table_name where id = delete_id

    **更新命令**
    update config set key_=?, value=?, where id=?

    **查询命令**
    select * from config where id=?
    select * from config order by id desc limit ?,?
    # order by id desc 按照id降序来进行排序
    # limit ?,? 返回从?到?的记录
    select count(*) from config #返回记录总数