欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

JDBC(JavaDataBaseConnectivity)

1.JDBC快速入門

一、JDBC(Java Data Base Connectivity)

從事成都天府聯(lián)通服務(wù)器托管,服務(wù)器租用,云主機(jī),虛擬空間,空間域名,CDN,網(wǎng)絡(luò)代維等服務(wù)。

1、數(shù)據(jù)庫(kù)驅(qū)動(dòng):

數(shù)據(jù)庫(kù)廠商為了方便開(kāi)發(fā)人員從程序中操作數(shù)據(jù)庫(kù)而提供的一套jar包,通過(guò)導(dǎo)入這個(gè)jar包就可以調(diào)用其中的方法操作數(shù)據(jù)庫(kù),這樣的jar包就叫做數(shù)據(jù)庫(kù)驅(qū)動(dòng)

2、JDBC:

sun定義的一套標(biāo)準(zhǔn),本質(zhì)上是一大堆的操作數(shù)據(jù)庫(kù)的接口,所有數(shù)據(jù)庫(kù)廠商為java設(shè)計(jì)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)都實(shí)現(xiàn)過(guò)這套接口,這樣一來(lái),統(tǒng)一了不同數(shù)據(jù)庫(kù)驅(qū)動(dòng)的方法,開(kāi)發(fā)人員只需要學(xué)習(xí)JDBC就會(huì)使用任意數(shù)據(jù)庫(kù)驅(qū)動(dòng)了。

 

六個(gè)步驟實(shí)現(xiàn)JDBC:

//1.注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)

--由于MySQL在Driver類的實(shí)現(xiàn)中自己注冊(cè)了一次,而我們又注冊(cè)了一次,于是會(huì)導(dǎo)致MySql驅(qū)動(dòng)被注冊(cè)兩次。

--創(chuàng)建MySql的Driver對(duì)象時(shí),導(dǎo)致了程序和具體的Mysql驅(qū)動(dòng)綁死在了一起,在切換數(shù)據(jù)庫(kù)時(shí)需要改動(dòng)java代碼。

//DriverManager.registerDriver(new Driver());

Class.forName("com.mysql.jdbc.Driver");

//2.從客戶端發(fā)出一個(gè)和數(shù)據(jù)庫(kù)服務(wù)端的連接,url=哪臺(tái)主機(jī)哪個(gè)端口哪個(gè)數(shù)據(jù)庫(kù)

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day10", "root", "root");

//3.獲取傳輸器對(duì)象。連接=路;傳輸器=卡車,載數(shù)據(jù)。

Statement stat = conn.createStatement();

//4.利用傳輸器傳輸sql語(yǔ)句到數(shù)據(jù)庫(kù)中執(zhí)行,獲取結(jié)果集對(duì)象

ResultSet rs = stat.executeQuery("select * from user");

//5.遍歷結(jié)果集獲取查詢結(jié)果

//有一個(gè)小游標(biāo)一行一行的指向結(jié)果集,最后一行沒(méi)東西了返回false

//ResultSet用于代表Sql語(yǔ)句的執(zhí)行結(jié)果。封裝執(zhí)行結(jié)果采用的類似于表格的方式。ResultSet對(duì)象維護(hù)了一個(gè)指向表格數(shù)據(jù)行的游標(biāo),初始的時(shí)候,游標(biāo)在第一行之前,第一次調(diào)用ResultSet.next()方法,游標(biāo)指向第一行數(shù)據(jù),再次調(diào)用ResultSet.next()方法,指向下一行,也就是第二行數(shù)據(jù)。

while(rs.next()){ String name = rs.getString("name");

System.out.println(name);

}

//6.關(guān)閉資源

rs.close();

stat.close();

conn.close();

 

2.JDBC細(xì)節(jié)

Connection對(duì)象,它是非常稀有的資源,用完后必須馬上釋放,如果Connection不能及時(shí)、正確的關(guān)閉,極易導(dǎo)致系統(tǒng)宕機(jī)。

為確保資源釋放代碼能運(yùn)行,資源釋放代碼也一定要放在finally語(yǔ)句中。

 Connection conn = null;

     Statement stat = null;

     ResultSet rs = null;

     try{...... .......

      }catch (Exception e) {

           e.printStackTrace();

       }finally{

//6.關(guān)閉資源

    if(rs!=null){

        try {

            rs.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            rs = null;

        }

    }

    if(stat!=null){

        try {

            stat.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            stat = null;

        }

    }

    if(conn!=null){

        try {

            conn.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }finally{

            conn = null;

        }

    }

  }

3.JDBC增刪改查

config.properties

driver=com.mysql.jdbc.Driver

url=jdbc:mysql:///day10

user=root

password=root

 

JDBCUtils.java

 public class JDBCUtils {

      private staticProperties prop = null;

          private JDBCUtils() {

            }

    static{

     try{

        prop = new Properties();

        prop.load(new                             FileReader(JDBCUtils.class.getClassLoader().getResource("config.properties").getPath()));

     }catch (Exception e) {

        e.printStackTrace();

        throw new RuntimeException(e);

     }

    }

    //連接

        public static ConnectiongetConn()throws ClassNotFoundException, SQLException{

    // 1.注冊(cè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)

        Class.forName(prop.getProperty("driver"));

    // 2.獲取連接

        return DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("user"),     prop.getProperty("password"));

    //關(guān)閉

        public static voidclose(ResultSet rs, Statement stat,Connection conn)  {.......}

 

JDBCDemo2.java

@Test

    public void update() {

        Connection conn = null;

        Statement stat = null;

        try{

            conn = JDBCUtils.getConn();

            stat =  conn.createStatement();

            stat.executeUpdate("update user set password=999 where name='zhaoliu'");

        }catch (Exception e) {

            e.printStackTrace();

        }finally{

            JDBCUtils.close(null, stat, conn);

        }

    }

 

4.改造User案例

層與層耦合的概念,利用工廠類解耦,service如何用dao?DaoFactory.getFactory().getDao();

 public class DaoFactory {

    private staticDaoFactory factory = new DaoFactory();

    private staticProperties prop = null;

    static{   try{

    prop = new Properties();

    prop.load(new     FileReader(DaoFactory.class.getClassLoader().getResource("config.properties").getPath()));

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

       throw new RuntimeException(e);  }  }

     

    privateDaoFactory(){   }

     

    public staticDaoFactorygetFactory(){

        return factory; }

     

    public UserDaogetDao(){

    try{

        String clazz = prop.getProperty("UserDao");

        return  (UserDao) Class.forName(clazz).newInstance();

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

        throw new RuntimeException(e); }  }  }

5.PreparedStatement防止sql注入

SQL注入***:

由于dao中執(zhí)行的SQL語(yǔ)句是拼接出來(lái)的,其中有一部分內(nèi)容是由用戶從客戶端傳入,所以當(dāng)用戶傳入的數(shù)據(jù)中包含sql關(guān)鍵字時(shí),就有可能通過(guò)這些關(guān)鍵字改變sql語(yǔ)句的語(yǔ)義,從而執(zhí)行一些特殊的操作,這樣的***方式就叫做sql注入***

PreparedStatement:

利用預(yù)編譯的機(jī)制將sql語(yǔ)句的主干和參數(shù)分別傳輸給數(shù)據(jù)庫(kù)服務(wù)器,從而使數(shù)據(jù)庫(kù)分辨的出哪些是sql語(yǔ)句的主干哪些是參數(shù),這樣一來(lái)即使參數(shù)中帶了sql的關(guān)鍵字,數(shù)據(jù)庫(kù)服務(wù)器也僅僅將他當(dāng)作參數(shù)值使用,關(guān)鍵字不會(huì)起作用,從而從原理上防止了sql注入的問(wèn)題

 

PreparedStatement主要有如下的三個(gè)優(yōu)點(diǎn):

1.可以防止sql注入

2.由于使用了預(yù)編譯機(jī)制,執(zhí)行的效率要高于Statement

3.sql語(yǔ)句使用?形式替代參數(shù),然后再用方法設(shè)置?的值,比起拼接字符串,代碼更加優(yōu)雅.

6.大文本大二進(jìn)制

數(shù)據(jù)庫(kù)中存儲(chǔ)的是大數(shù)據(jù)的路徑,大數(shù)據(jù)存在硬盤上,從數(shù)據(jù)庫(kù)讀大數(shù)據(jù)費(fèi)時(shí)費(fèi)力。

了解即可

*JDBC大數(shù)據(jù)

Text Blob

 

1.1設(shè)置Text類型

 PreparedStatement.setCharacterStream(index, reader, length);

 //注意length長(zhǎng)度須設(shè)置,并且設(shè)置為int型

 //當(dāng)包過(guò)大時(shí)修改配置:[mysqld] max_allowed_packet=64M

1.2獲取Text類型

reader = resultSet. getCharacterStream(i);

2.1設(shè)置BLOB數(shù)據(jù)類型

PreparedStatement. setBinaryStream(i, inputStream, length);

2.1獲取BLOB類型

InputStream in  = resultSet.getBinaryStream(i);

InputStream in  = resultSet.getBlob(i).getBinaryStream();

 

public class BlobDemo1 {

@Test

public void findBlob(){

    Connection conn = null;

        PreparedStatement ps = null;

        ResultSet rs = null;

try{

conn = JDBCUtils.getConn();

ps = conn.prepareStatement("select * from blobdemo");

rs = ps.executeQuery();

 while(rs.next()){

    String name = rs.getString("name");

     InputStream in = rs.getBinaryStream("content");

     OutputStream out = new FileOutputStream(name);

    

    byte [] bs = new byte[1024];

    int i = 0;

    while((i=in.read(bs))!=-1){

    out.write(bs,0,i);

    }

    in.close();

    out.close();

    }

    }catch (Exception e) {

    e.printStackTrace();

    }finally{

    JDBCUtils.close(rs, ps, conn);

    }

}

@Test

public void addBlob(){

Connection conn = null;

PreparedStatement ps = null;

ResultSet rs = null;

try{

    conn = JDBCUtils.getConn();

    ps = conn.prepareStatement("insert into blobdemo values (null,?,?)");

    ps.setString(1, "洛天依.mp3");

    File file = new File("1.mp3");

    ps.setBinaryStream(2, new FileInputStream(file),(int)file.length());

    ps.executeUpdate();

}catch (Exception e) {

    e.printStackTrace();

}finally{

    JDBCUtils.close(rs, ps, conn);

}

}

}

 

 

7.批處理機(jī)制

業(yè)務(wù)場(chǎng)景:當(dāng)需要向數(shù)據(jù)庫(kù)發(fā)送一批SQL語(yǔ)句執(zhí)行時(shí),應(yīng)避免向數(shù)據(jù)庫(kù)一條條的發(fā)送執(zhí)行,而應(yīng)采用JDBC的批處理機(jī)制,以提升執(zhí)行效率。

實(shí)現(xiàn)批處理有兩種方式,第一種方式:

Statement.addBatch(sql) 執(zhí)行批處理SQL語(yǔ)句

executeBatch()方法:執(zhí)行批處理命令

clearBatch()方法:清除批處理命令

    Connection conn = null;

    Statement st = null;

    ResultSet rs = null;

    try {

    conn = JdbcUtil.getConnection();

    String sql1 = "insert into person(name,password,email,birthday)

    values('kkk','123','abc@sina.com','1978-08-08')";

    String sql2 = "update user set password='123456' where id=3";

    st = conn.createStatement();

    st.addBatch(sql1);  //把SQL語(yǔ)句加入到批命令中

    st.addBatch(sql2);  //把SQL語(yǔ)句加入到批命令中

    st.executeBatch();

    } finally{

    JdbcUtil.free(conn, st, rs);

    }

采用Statement.addBatch(sql)方式實(shí)現(xiàn)批處理:

優(yōu)點(diǎn):可以向數(shù)據(jù)庫(kù)發(fā)送多條不同的SQL語(yǔ)句。

缺點(diǎn):

SQL語(yǔ)句沒(méi)有預(yù)編譯。

當(dāng)向數(shù)據(jù)庫(kù)發(fā)送多條語(yǔ)句相同,但僅參數(shù)不同的SQL語(yǔ)句時(shí),需重復(fù)寫(xiě)上很多條SQL語(yǔ)句。

 

 

實(shí)現(xiàn)批處理的第二種方式:

PreparedStatement.addBatch()

conn = JdbcUtil.getConnection();

String sql = "insert into person(name,password,email,birthday) values(?,?,?,?)";

st = conn.prepareStatement(sql);

for(int i=0;i<50000;i++){

st.setString(1, "aaa" + i);

st.setString(2, "123" + i);

st.setString(3, "aaa" + i + "@sina.com");

st.setDate(4,new Date(1980, 10, 10));

 

st.addBatch();

if(i%1000==0){

st.executeBatch();

st.clearBatch();

}

}

st.executeBatch();


    采用PreparedStatement.addBatch()實(shí)現(xiàn)批處理

    優(yōu)點(diǎn):發(fā)送的是預(yù)編譯后的SQL語(yǔ)句,執(zhí)行效率高。

    缺點(diǎn):只能應(yīng)用在SQL語(yǔ)句相同,但參數(shù)不同的批處理中。因此此種形式的批處理經(jīng)常用于在同一個(gè)表中批量插入數(shù)據(jù),或批量更新表的數(shù)據(jù)。

分享文章:JDBC(JavaDataBaseConnectivity)
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article26/peggcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、域名注冊(cè)、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站收錄、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
国产中文字幕有码视频| 亚洲精品国产熟女高潮| 91精品国产人妻女教师| 国产亚洲欧美久久精品| 一级黄片一区二区三区| 日韩高清av一区二区三区| 久久精品一区欧美成人| 夜色一区二区av人片| 欧美一区二区三区四区久久| 在线中文字幕日韩有码| 夫妻性生活在线视频一级片| 青青草原一区在线观看| 久久三级中文欧大战字幕| 国产又粗又长又爽网站| 91麻豆精品一二三区在线| 久久国产精品午夜亚洲欧美| 精品人妻在线中文字幕| 国产精品一区二区日韩新区| 日韩黄国产一区二区三| 成人av资源在线观看| 免费在线免费观看av| 欧美日韩一区二区三区色拉拉| 熟妇一区二区在线播放| 一区二区三区日韩激情| 熟女少妇精品一区二区三区| 国产成人大片中文字幕在线| 亚洲男人天堂最新地址| 天堂中文在线免费观看av| 人妻人人澡人人添人人爽桃色| 97色伦97色伦国产在线| 久久五月精品综网中文字幕| 亚洲欧洲日本在线天堂| 门国产av一区二区三区| 亭亭丁香激情五月涩久久| 欧美日韩黄色在线观看| 深夜三级福利在线观看| 日韩一区二区三区免费播放| 国产男女免费视频观看| av免费观看男人的天堂| 国产亚洲精品精品国产亚洲| 开心五月婷婷六月丁香|