JDBC学习

1 什么是JDBC

JDBCJava DataBase Connectivity)就是Java数据库连接,说白了就是操作数据库的Java语言。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。

 

JDBC是接口,而JDBC驱动才是接口的实现,没有驱动无法完成数据库连接!每个数据库厂商都有自己的驱动,用来连接自己公司的数据库。

所以说你想连接什么数据库就得先导入该数据库的驱动

wKiom1Z3tciwcR39AAB-Q1kG0L4399.png

下面是jdbc操作oracle数据库的代码.

查询时executeQuery(),有结果集resultSet.其余操作时executeUpdate(),返回的数字.

package testJdbc;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 public class TestJdbc {
  public static void main(String[] args) {
   //先定义好三个对象
        Connection con=null;
        PreparedStatement pstmt=null;//防止sql注入,提高效率
        ResultSet rs=null;//执行查询需要结果集
       try {
        //加载oracle驱动
        Class.forName("oracle.jdbc.driver.OracleDriver");
        //oracle的url
        String url="jdbc:oracle:thin:@10.1.0.169:1521:orcl";
        //获得数据库连接
        con=DriverManager.getConnection(url, "CL", "123456");
        String sql="select producercode,producername from T_PRODUCER_INFO 
                 where telephone =?";
        pstmt=con.prepareStatement(sql);
        //设置参数,从1开始
        pstmt.setString(1, "110");
        rs=pstmt.executeQuery();
        while(rs.next()){
             //获取这一行的列数据.索引从1开始
             String code=rs.getString(1);
             String name=rs.getString(2);
             System.out.println("代码为"+code+"------"+"名称为"+name);
        } 
           } catch (Exception e) {
                throw new RuntimeException(e);
           }finally{
            //后使用的先关闭
            try {
             if(rs!=null){
              rs.close();
             }
             if(pstmt!=null){
              pstmt.close();
             }
             if(con!=null){
              con.close();
             }
            } catch (SQLException e) {
             e.printStackTrace();
            }
       }
    }
 }

wKioL1Z3vtuSR9Z-AABvNSju97U596.png

 

时间类型

领域对象(domain)中的所有属性不能出现java.sql包下的东西!即不能使用java.sql.Date

ResultSet#getDate()返回的是java.sql.Date()

PreparedStatement#setDate(int, Date),其中第二个参数也是java.sql.Date

 

时间类型的转换:

java.util.Date à java.sql.DateTimeTimestamp

  utilDate转换成毫秒值

  使用毫秒值创建sqlDateTimeTimestamp

java.sql.DateTimeTimestamp à java.util.Date

  这一步不需要处理了:因为java.sql.Datejava.util.Date的子类

 

 

java.sql包下给出三个与数据库相关的日期时间类型,分别是:

Date:表示日期,只有年月日,没有时分秒。会丢失时间;

Time:表示时间,只有时分秒,没有年月日。会丢失日期;

Timestamp:表示时间戳,有年月日时分秒,以及毫秒。

 

 

java.utl.Date d= new java.util.Date();

java.sql.Datedate = new java.sql.Date(d.getTime());//会丢失时分秒

Time time = newTime(d.getTime());//会丢失年月日

Timestamptimestamp = new Timestamp(d.getTime());

 

 

大数据(Blob,Clob)

 

类型

长度

tinyblob

28--1B256B

blob

216-1B64K

mediumblob

224-1B16M

longblob

232-1B4G

tinyclob

28--1B256B

clob

216-1B64K

mediumclob

224-1B16M

longclob

232-1B4G

大数据比如视频,歌曲,图片,文本子类的.将他们存入数据库是通过IO流(插入的是IO流对象,读取的也是IO流)

CREATE TABLE tab_bin(
         id    INT           PRIMARYKEY AUTO_INCREMENT,
         filename  VARCHAR(100),
         data        MEDIUMBLOB
);

插入数据库

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

 查询数据库

           con = JdbcUtils.getConnection();
           String sql = "selectfilename,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);
           out.close();

 

大批处理

批处理就是一批一批的处理,而不是一个一个的处理!

当你有10SQL语句要执行时,一次向服务器发送一条SQL语句,这么做效率上很差!处理的方案是使用批处理,即一次向服务器发送多条SQL语句,然后由服务器一次性处理。

    批处理只针对更新(增、删、改)语句

 

void addBatch(String sql):添加一条语句到“批”中;

int[] executeBatch():执行“批”中所有语句。返回值表示每条语句所影响的行数据;

void clearBatch():清空“批”中的所有语句。

           con = JdbcUtils.getConnection();
           String sql = "insertinto 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();
           }
           pstmt.executeBatch();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章