JDBC CRUD

JDBC主要功能如下:

  • 建立与数据库或者其他数据源的连接。
  • 向数据库发送SQL命令
  • 处理数据库的返回结果。

JDBC中常用的类和接口

  • Connection: 连接到数据库。
  • Statement: 建立操作指令。
  • executeQuery: 执行查询指令。
  • ResultSet: 获得查询结果。

建立连接的操作:

public static Connection getConnection() {

    Connection con = null;
    
    try {
        Class.forName(driverName); //建立JDBC-ODBC桥接器
        con = DriverManager.getConnection(dbURL,userName,userPw); //建立连接。
    }catch(Exception e) {
        e.printStackTrace();
    }
    
    //返回建立的连接对象
    return con;
}

查询操作

  1. 向数据库发送SQL查询语句
    首先使用Satement声明一个SQL语句对象,然后让已创建的连接对象con调用方法createStatement()创建这个SQL语句对象:
Statement sql = con.createStatement();
  1. 处理查询结果
    有了SQL语句对象后,就可以调用相应的方法实现对数据库中表的查询和修改,并将查询结果存放在一个Result类声明的对象中。也就是说SQL查询语句对数据库的查询操作将返回一个ResultSet对象,ResultSet对象是由统一形式的列组织的数据行组成。
ResultSet rs = sql.executeQuery(SQL查询语句);

ResultSet 对象一次只能看到一个数据行,实用next()方法移到下一行数据行,获得一行数据后,ResultSet对象可以实用getXxx方法获得字段值(列值),将位置索引或列名传递给getXxx方法即可。
无论字段是何种属性,总可以使用getString(int columnIndex)或getString(String columnName)方法返回字段值的串表示。
当使用ResultSet的getXxx方法查看一行记录时,不可以颠倒字段的顺序。

查询stu表中学生信息

        Connection con = DBUtil.getConnection();
        
        try {
            Statement sql = con.createStatement();
            ResultSet rs = sql.executeQuery("SELECT * FROM stu");
            
            while(rs.next()) {
                System.out.println(rs.getString("id") + "  " + rs.getString("name") + "    "+  rs.getString("phone"));
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

顺序查询

查询表中字段信息:

当创建好连接对象con之后,那么该连接对象调用getMetaData()方法可以返回一个DatabaseMetaData对象:
DatabaseMetaData metadata = con.getMetaData();
 Metadata对象再调用getColumns可以将表的字段信息以行列的形式存储在一个ResultSet对象:
ResultSet tableMessage = metadata.getColumns(null,null,"goods",null);  

如果表中由n个字段,tableMessage就刚好有n行,每行4列,每行分别含有和相应字段有关的信息。信息的次序为:“数据库名”、“数据库扩展名”、“表名“、“字段名”。
tableMessage对象调用next方法使游标向下移动一行(游标的初始位置在第一行之前),然后tableMessage调用getXXX方法可以查看该行中列的信息,其中最重要的信息是第4列,该列上的信息为字段的名字。

获取表中字段信息

    Connection con = DBUtil.getConnection();
        
        try {
            DatabaseMetaData metadata = con.getMetaData();
            ResultSet tableMessage = metadata.getColumns(null, null, "stu", null);
            while(tableMessage.next()) {
                System.out.println(tableMessage.getString(1) + tableMessage.getString(2) + tableMessage.getString(3) + tableMessage.getString(4 ));
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
        
        System.out.println("成功");

控制游标

有时候需要在结果集中前后移动、显示结果集中的某条记录或随机显示若干条记录时,必须要返回一个可滚动的结果集,为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象。

Statement stmt = con.createStatement(int type, int concurrency);

然后根据参数type、concurrency的取值情况,stmt返回相应类型的结果集。

Result re = stmt.executeQuery(SQL语句);

type的取值决定滚动方式,取值可以是:

取值 含义
ResultSet.TYPE_FORWORD_ONLY 结果集的游标只能向下滚动。
ResultSet.TYPE_SCROLL 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
ResultSet.TYPE_SCROLL_SENSITIVE 返回可滚动的结果集,当数据库变化时,当前结果集同步改变
取值 含义
ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表
ResultSet.CONCUR_UPDATABLE 能用结果集更新数据库中的表

Concurrency取值决定是否可以用结果集更新数据库,Concurrenct取值:

取值 含义
ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表
ResultSet.CONCUR_UPDATABLE 能用结果集更新数据库中的表
方法名 含义
public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移动结果集第一行之前时返回false。
public void beforeFirst 将游标移动到结果集的初始位置,即在第一行之前。
public void afterLast() 将游标移动到结果集最后一行之后。
public void first() 将游标移动到结果集的第一行
public void last() 将游标移动到结果集的最后一行
public boolean isAfterLast() 判断游标是否在最后一行之后。
public boolean isBeforeFirst() 判断游标是否在第一行之前。
public boolean isFirst() 判断游标是否指向结果集的第一行。
public boolean isLast() 判断游标是否指向结果集的最后一行
public int getRow() 得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0
public boolean absolute(int row) 将游标移到参数row指定的行

滚动查询经常用到ResultSet的下述方法。

方法名 含义
public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移动结果集第一行之前时返回false。
public void beforeFirst 将游标移动到结果集的初始位置,即在第一行之前。
public void afterLast() 将游标移动到结果集最后一行之后。
public void first() 将游标移动到结果集的第一行
public void last() 将游标移动到结果集的最后一行
public boolean isAfterLast() 判断游标是否在最后一行之后。
public boolean isBeforeFirst() 判断游标是否在第一行之前。
public boolean isFirst() 判断游标是否指向结果集的第一行。
public boolean isLast() 判断游标是否指向结果集的最后一行
public int getRow() 得到当前游标所指行的行号,行号从1开始,如果结果集没有行,返回0
public boolean absolute(int row) 将游标移到参数row指定的行

条件查询

更新、添加与删除操作

Statement对象调用方法:

  public int executeUpdate(String sqlStatement);

通过参数sqlStatement指定的方式实现对数据库表中记录的更新、添加和删除操作。更新、添加和删除记录的SQL语法分别是:

  UPDATE <表名> SET <字段名> = 新增 WHERE <条件子句>
  INSERT INTO 表(字段列表) VALUES(对应的具体的记录)或INSETE INTO表(VALUES (对应的具体的记录)
  DELETE FROM <表名> WHER <条件子句>

public class ModifyTable {

String datasourceName = "";

String SQL,message="";

public ModifyTable() {
    
}

public void setSQL(String SQL) {
    this.SQL = SQL;
}

public String modifyRecord() {
    Connection con = DBUtil.getConnection();
    Statement sql = null;
    try {
        sql = con.createStatement();
        sql.execute(SQL);
        message = "操作成功";
        con.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return message;
}
public class Main {
    public static void main(String[] args) {
        ModifyTable modify = new ModifyTable();
        modify.setSQL("INSERT INTO stu(name,phone) VALUES ('KKK','17852179777')");
        String backMess = modify.modifyRecord();
        System.out.println(backMess);
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容