JDBC 第一篇

来源:互联网 发布:南京浦口永宁网络问政 编辑:程序博客网 时间:2024/05/18 03:10

JDBC简介:


  • JDBC(Java DataBase Connectivity)就是Java数据库连接,实际上就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
  • JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。
  • JDBC中的核心类有:DriverManager、Connection、Statement,和ResultSet!

Class.forName(“com.mysql.jdbc.Driver”)
Connection con = DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb1”,”root”,”123”);
Statement stmt = con.createStatement();
String sql = “insert into user value(’zhangSan’, ’123’)”;
int m = stmt.executeUpdate(sql);(这里的m指的是影响的行数)

ResulSet resultset=stmt.executeQuery(sql);
resultset.next();
resultset.getString(下标);(下标是从1开始,而不是从零)

  • 关闭流(倒关)
    rs.close();
    stmt.close();
    con.close();

  • void beforeFirst():把光标放到第一行的前面,这也是光标默认的位置;
    void afterLast():把光标放到最后一行的后面;
    boolean first():把光标放到第一行的位置上,返回值表示调控光标是否成功;
    boolean last():把光标放到最后一行的位置上;
    boolean isBeforeFirst():当前光标位置是否在第一行前面;
    boolean isAfterLast():当前光标位置是否在最后一行的后面;
    boolean isFirst():当前光标位置是否在第一行上;
    boolean isLast():当前光标位置是否在最后一行上;
    boolean previous():把光标向上挪一行;
    boolean next():把光标向下挪一行;
    boolean relative(int row):相对位移,当row为正数时,表示向下移动row行,为负数时表示向上移动row行;
    boolean absolute(int row):绝对位移,把光标移动到指定的行上;
    int getRow():返回当前光标所有行。
  • con.createStatement():生成的结果集:不滚动、不敏感、不可更新!
    con.createStatement(int,int):
    第一个参数:
    ResultSet.TYPE_FORWARD_ONLY:不滚动结果集;
    ResultSet.TYPE_SCROLL_INSENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
    ResultSet.TYPE_SCROLL_SENSITIVE:滚动结果集,但结果集数据不会再跟随数据库而变化;
    第二个参数:
    CONCUR_READ_ONLY:结果集是只读的,不能通过修改结果集而反向影响数据库;
    CONCUR_UPDATABLE:结果集是可更新的,对结果集的更新可以反向影响数据库。
  • Statement createStatement(int resultSetType, int resultSetConcurrency)
  • PreparedStatement(它是Statement接口的子接口)
    作用:防SQL攻击;提高代码的可读性、可维护性、提高效率

    String sql = “select * from tab_student where s_number=?”;
    PreparedStatement pstmt = con.prepareStatement(sql);
    pstmt.setString(1, “S_1001”);
    ResultSet rs = pstmt.executeQuery();
    rs.close();
    pstmt.clearParameters();//每次执行需要清空的
    pstmt.setString(1, “S_1002”);
    rs = pstmt.executeQuery();

  • JdbcUtils工具类
  • public class JdbcUtils {    private static final String dbconfig = "dbconfig.properties";    static {        try {            InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(dbconfig);            private static Properties prop = new Properties();            prop.load(in);            Class.forName(prop.getProperty("driverClassName"));        } catch(IOException e) {            throw new RuntimeException(e);        }    }    public static Connection getConnection() {        try {            return DriverManager.getConnection(prop.getProperty("url"),                    prop.getProperty("username"), prop.getProperty("password"));        } catch (Exception e) {            throw new RuntimeException(e);        }    }}
    • 经过class.forName()得到Class之后,调用newInstance()的到对象

    时间类型

    • java.sql包下给出三个与数据库相关的日期时间类型,分别是:
      Date:表示日期,只有年月日,没有时分秒。会丢失时间;
      Time:表示时间,只有时分秒,没有年月日。会丢失日期;
      Timestamp:表示时间戳,有年月日时分秒,以及毫秒。
    • 数据库类型与java中类型的对应关系:
      DATE -> java.sql.Date
      TIME -> java.sql.Time
      TIMESTAMP -> java.sql.Timestamp
    • 时间类型的转换:
      java.util.Date 转换为 java.sql.Date、Time、Timestamp
      把util的Date转换成毫秒值
      使用毫秒值创建sql的Date、Time、Timestamp
    java.util.Date date = new java.util.Date();long l = date.getTime();java.sql.Date sqlDate = new java.sql.Date(l);

    大数据

    • 标准SQL中提供了如下类型来保存大数据类型:
      类型 长度
      tinyblob (256B)
      blob (64K)
      mediumblob(16M)
      longblob (4G)
      tinyclob (256B)
      clob (64K)
      mediumclob (16M)
      longclob(4G)
    • mysql中使用如下四种类型来处理文本大数据:
      类型 长度
      tinytext (256B)
      text (64K)
      mediumtext (16M)
      longtext (4G)

    装入

    con = JdbcUtils.getConnection();            String sql = "insert into tab_bin(filename,data) values(?, ?)";            pstmt = con.prepareStatement(sql);            pstmt.setString(1, "a.jpg");            InputStream in = new FileInputStream("f:\\a.jpg");[得到一个输入流对象]            pstmt.setBinaryStream(2, in);[为第二个参数赋值为流对象]            pstmt.executeUpdate();

    取出:

    con = JdbcUtils.getConnection();            String sql = "select filename,data from tab_bin where id=?";            pstmt = con.prepareStatement(sql);            pstmt.setInt(1, 1);            rs = pstmt.executeQuery();            rs.next();            String filename = rs.getString("filename");            OutputStream out = new FileOutputStream("F:\\" + filename)[使用文件名来创建输出流对象。];            InputStream in = rs.getBinaryStream("data")[读取输入流对象];            IOUtils.copy(in, out)[把in中的数据写入到out中。];            out.close();

    批处理

    • 批处理只针对更新(增、删、改)语句
    • 可以多次调用Statement类的addBatch(String sql)方法,把需要执行的所有SQL语句添加到一个“批”中,然后调用Statement类的executeBatch()方法来执行当前“批”中的语句。
      • void addBatch(String sql):添加
      • int[] executeBatch():执行所有
      • void clearBatch():清除
    • 当执行了“批”之后,“批”中的SQL语句就会被清空!

     PreparedStatement批处理

    PreparedStatement的批处理有所不同,因为每个PreparedStatement对象都绑定一条SQL模板。所以向PreparedStatement中添加的不是SQL语句,而是给“?”赋值。

        con = JdbcUtils.getConnection();            String sql = "insert into stu values(?,?,?,?)";            pstmt = con.prepareStatement(sql);            for(int i = 0; i < 10; i++) {                pstmt.setString(1, "S_10" + i);                pstmt.setString(2, "stu" + i);                pstmt.setInt(3, 20 + i);                pstmt.setString(4, i % 2 == 0 ? "male" : "female");                pstmt.addBatch()[PreparedStatement的addBatch()方法没有参数!];            }            pstmt.executeBatch[执行批]();
    0 0