Java——(十二)JDBC

十二、数据库编程JDBC

二、概述
简述
  JDBC是什么?JDBC英文名为:Java Data Base Connectivity(Java数据库连接),官方解释它是Java编程语言和广泛的数据库之间独立于数据库的连接标准的Java API,根本上说JDBC是一种规范,它提供的接口,一套完整的,允许便捷式访问底层数据库。可以用JAVA来写不同类型的可执行文件:JAVA应用程序、JAVA Applets、Java Servlet、JSP等,不同的可执行文件都能通过JDBC访问数据库,又兼备存储的优势。简单说它就是JAVA与数据库的连接的桥梁或者插件,用JAVA代码就能操作数据库的增删改查、存储过程、事务等。

JDBC有什么用?我们用JAVA就能连接到数据库;创建SQL或者MYSQL语句;执行SQL或MYSQL的查询数据库;查看和修改结果记录。

我们思考一下?数据库是由不同生产产商决定的,例如Mysql、Oracle、SQL Server,而如果JAVA JDK不可能说提供对不同数据库的实现吧?还有,JAVA具备天生跨平台的优势,它就提供了JDBC的接口API,具体的实现由不同的生产产商决定。这样,数据库生产产商都根据JAVA API去实现各自的应用驱动,这问题就迎刃而解了。

JDBC的工作原理是什么?我将在下一篇文章叙述JDBC运用的设计模式,以及部分JDK源码。

工作原理图(转自百度百科)

常用接口
   提供的接口包括:JAVA API:提供对JDBC的管理链接;JAVA Driver API:支持JDBC管理到驱动器连接。

DriverManager:这个类管理数据库驱动程序的列表,查看加载的驱动是否符合JAVA Driver API的规范。

Connection:与数据库中的所有的通信是通过唯一的连接对象。

Statement:把创建的SQL对象,转而存储到数据库当中。

ResultSet:它是一个迭代器,用于检索查询数据。

三、快速入门
操作流程图

数据类型图
 数字类型

时间日期类型

字符串类型

实例练习
1、Connection

public class JDBCUtil {
//Driver类全名
public static String DRIVER=“com.mysql.jdbc.Driver”;
//jdbc协议:子协议://ip:端口号/数据库名
public static String URL=“jdbc:mysql://localhost:3306/test”;
//数据库用户名
public static String USERNAME=“root”;
//数据库密码
public static String PASSWORD=“root”;

private static Connection connection=null;

/**
 * 获取JDBC连接
 * @return
 */
public  static Connection getConnection(){
    try {
        //加载驱动程序:它通过反射创建一个driver对象。
        Class.forName(DRIVER);

        //获得数据连接对象。
        // 在返回connection对象之前,DriverManager它内部会先校验驱动对象driver信息对不对,我们只要知道内部过程即可。
        connection= DriverManager.getConnection(URL,USERNAME,PASSWORD);
        return connection;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * 通过读取文件连接
 * @param fileName
 * @return
 * @throws SQLException
 */
public   Connection getConnectionByLoadSettingFile(String fileName) throws SQLException {
    /*
        文件里面的内容:跟上面的常量一模一样
        jdbc.driver=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8
        jdbc.username=root
        jdbc.password=root
    */
    Properties props=new Properties();
    try {
        //我的properties文件是放在src根目录下的
        InputStream in=DBUtil.class.getResourceAsStream("/"+fileName);
        if(null==in)
            System.out.println("找不到文件:"+fileName);
        props.load(in);
    } catch (Exception e) {
        e.printStackTrace();
    }
    String driver=props.getProperty("jdbc.driver");
    if(null!=driver)
        System.setProperty("jdbc.drivers",driver);
    String url=props.getProperty("jdbc.url");
    String username=props.getProperty("jdbc.username");
    String password=props.getProperty("jdbc.password");
    connection=DriverManager.getConnection(url,username,password);
    return connection;
}

}

2、Statement

public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
Statement statement=null;

    connection=JDBCUtil.getConnection();
    statement=connection.createStatement();
    //需要在自己的数据库当中建立一张user表
    String sql="insert into user(loginName,userName,password,sex)values('tom123','tom','123456',1)";
    statement.executeUpdate(sql);
}

}

3、PareparedStatement

public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
PreparedStatement pStatement=null;

    connection=JDBCUtil.getConnection();
    String sql="insert into user(loginName,userName,password,sex)values(?,?,?,?)";
    //预编译
    pStatement=connection.prepareStatement(sql);
    //前面的索引对应上面的问号,传递参数。
    pStatement.setString(1,"tom123");
    pStatement.setString(2,"tom");
    pStatement.setString(3,"123456");
    pStatement.setInt(4,1);
    pStatement.executeUpdate();
}

}

4、ResultSet

public class MyClient {
public static void main(String [] args) throws SQLException {
Connection connection=null;
Statement statement=null;
ResultSet resultSet;

    connection=JDBCUtil.getConnection();
    String sql="select * from user";
    statement=connection.createStatement();
    //resultSet就是一个迭代器,里面的方法跟迭代器几乎一致。
    resultSet=statement.executeQuery(sql);
    while (resultSet.next()){
        String loginName=resultSet.getString("loginName");
        String userName=resultSet.getString("userName");
        String password=resultSet.getString("password");
        int sex=resultSet.getInt("sex");
        System.out.println(loginName+"-"+userName+"-"+password+"-"+sex);
    }
}

}

四、可滚动和可更新的结果集
相关参数

//了解数据集可滚动更新:查看ResultSet接口的几个参数

/** 结果集不能滚动(默认值)*/
int TYPE_FORWARD_ONLY = 1003;

/** 结果集可以滚动,但对数据库变化不敏感*/
int TYPE_SCROLL_INSENSITIVE = 1004;

/**结果集可以滚动,且对数据库变化敏感*/
int TYPE_SCROLL_SENSITIVE = 1005;

/**结果集不能用于更新数据库(默认值)*/
int CONCUR_READ_ONLY = 1007;

/**结果集可以用于更新数据库*/
int CONCUR_UPDATABLE = 1008;

可滚动可更新
注意:可滚动简单说就是设置结果集可更新resultSet目前的游标值。可更新就是可以更新结果集里面的增删改查。可更新简单说,就是获取数据集ResultSet以后改动更加灵活。

public class Client {
public static void main(String [] args){
Connection connection=null;
PreparedStatement pStatement=null;
Statement statement=null;
ResultSet resultSet=null;
try {
connection=DBUtil.getInstance().getConnection();
//第一个参数设置是否可以滚动,第二个参数设置是否可更新
statement=connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql=“select * from user”;
ResultSet rs=statement.executeQuery(sql);

        /**可滚动的几个方法
            rs.previous();
            rs.next();
            rs.getRow();
            rs.absolute(0);
         **/

        //往数据集里面插入数据同时更新到数据:从表的最后开始插入。
        rs.moveToInsertRow();//把游标移动到插入行,默认在最后一行。
        rs.updateString("loginName","小白脸");
        rs.updateString("userName","大猩猩");
        rs.updateString("password","123");
        rs.updateInt("sex",100);
        rs.insertRow();
        rs.moveToCurrentRow();//把游标移动最后一个位置

        //删除第十行数据
        rs.absolute(10);
        rs.deleteRow();

        while(rs.next()){
            System.out.println(rs.getString(2));
            //把数据集里的数据中的性别全部更新为0
            rs.updateInt("sex",0);
            rs.updateRow();
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值