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

如何使用JDBC

本篇文章為大家展示了如何使用JDBC,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

目前成都創(chuàng)新互聯(lián)已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、烏爾禾網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

什么是JDBC

JDBC(Java Database Connectivity),即Java數(shù)據(jù)庫連接,是一種用于執(zhí)行SQL語句的Java API,可以為多種關(guān)系數(shù)據(jù)庫提供同一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準(zhǔn),根據(jù)這種基準(zhǔn)可以構(gòu)建更高級的工具和接口,使數(shù)據(jù)庫開發(fā)人員能夠編寫數(shù)據(jù)庫應(yīng)用程序??偠灾琂DBC做了三件事:

  1. 與數(shù)據(jù)庫建立連接

  2. 發(fā)送操作數(shù)據(jù)庫的語句

  3. 處理結(jié)果

JDBC簡單示例

下面的代碼演示了如何利用JDBC從數(shù)據(jù)庫中查詢?nèi)舾蓷l符合要求的數(shù)據(jù)出來,使用的數(shù)據(jù)庫是MySQL。

1、建立一個數(shù)據(jù)庫和一張表,我的習(xí)慣是在CLASSPATH底下建立一個.sql的文件用于存放sql語句

create database school;

use school;

create table student
(
    studentId            int                 primary key    auto_increment    not null,
    studentName        varchar(10)                                                            not null,
    studentAge        int,
    studentPhone    varchar(15)
)

insert into student values(null,'Betty', '20', '00000000');
insert into student values(null,'Jerry', '18', '11111111');
insert into student values(null,'Betty', '21', '22222222');
insert into student values(null,'Steve', '27', '33333333');
insert into student values(null,'James', '22', '44444444');
commit;

2、建立一個.properties文件用于存儲MySql連接的幾個屬性。為什么要建立.properties而不在代碼里面寫死,由于這個并不是Java設(shè)計模式的分類,就不細(xì)講了,只需要記?。?strong>從設(shè)計的角度看,把內(nèi)容寫在配置文件中永遠(yuǎn)好過把內(nèi)容寫死在代碼中。

mysqlpackage=com.mysql.jdbc.Driver
mysqlurl=jdbc:mysql://localhost:3306/school?useUnicode=true&characterEncoding=utf-8
mysqlname=root
mysqlpassword=root

3、根據(jù)表字段建立實體類

public class Student
{
    private int        studentId;
    private String    studentName;
    private int        studentAge;
    private String    studentPhone;
    
    public Student(int studentId, String studentName, int studentAge,
            String studentPhone)
    {
        this.studentId = studentId;
        this.studentName = studentName;
        this.studentAge = studentAge;
        this.studentPhone = studentPhone;
    }
    
    public int getStudentId()
    {
        return studentId;
    }

    public String getStudentName()
    {
        return studentName;
    }

    public int getStudentAge()
    {
        return studentAge;
    }

    public String getStudentPhone()
    {
        return studentPhone;
    }

    public String toString()
    {
        return "studentId = " + studentId + ", studentName = " + studentName + ", studentAge = " +
                studentAge + ", studentPhone = " + studentPhone;
    }
}

4、寫一個DBConnection類專門用于向外提供數(shù)據(jù)庫連接。我這里用了MySql,所以只有一個mysqlConnection,如果還用到了Oracle,當(dāng)然還可以向外提供一個oracleConnection。把這些連接設(shè)為全局的可能有人會想是否會有線程安全問題,這是一個很好的問題。那因為我們只從Connection里面讀取一個PreparedStatement出來,而不會去寫它,只讀不修改,是不會引發(fā)線程安全問題的。另外把Connection設(shè)置為static的保證了Connection在內(nèi)存中只有一份,不會占多大資源,每次使用完不調(diào)用close()方法去關(guān)閉它也沒事。

public class DBConnection
{    
    private static Properties properties = new Properties();
    
    static
    {
        /** 要從CLASSPATH下取.properties文件,因此要加"/" */
        InputStream is = DBConnection.class.getResourceAsStream("/db.properties");
        try
        {
            properties.load(is);
        } 
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
    
    /** 這個mysqlConnection只是為了用來從里面讀一個PreparedStatement,不會往里面寫數(shù)據(jù),因此沒有線程安全問題,可以作為一個全局變量 */
    public static Connection mysqlConnection = getConnection();
    
    public static Connection getConnection()
    {
        Connection con = null;
        try
        {
            Class.forName((String)properties.getProperty("mysqlpackage"));
            con = DriverManager.getConnection((String)properties.getProperty("mysqlurl"), 
                    (String)properties.getProperty("mysqlname"), 
                    (String)properties.getProperty("mysqlpassword"));
        } 
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        } 
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return con;
    }
}

5、建立一個工具類,用來寫各種方法,專門和數(shù)據(jù)庫進行交互。這種工具類最好搞成單例的,這樣就不用每次去new出來了(實際上new出來也沒看出來會有什么好處),節(jié)省資源

package com.xrq.test11;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class StudentManager
{
    private static StudentManager instance = new StudentManager();
    
    private StudentManager()
    {
        
    }
    
    public static StudentManager getInstance()
    {
        return instance;
    }
    
    public List<Student> querySomeStudents(String studentName) throws Exception
    {
        List<Student> studentList = new ArrayList<Student>();
        Connection connection = DBConnection.mysqlConnection;
        PreparedStatement ps = connection.prepareStatement("select * from student where studentName = ?");
        ps.setString(1, studentName);
        ResultSet rs = ps.executeQuery();
        
        Student student = null;
        while (rs.next())
        {
            student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4));
            studentList.add(student);
        }
        
        ps.close();
        rs.close();
        return studentList;
    }
}

6、寫個main函數(shù)去調(diào)用一下

List<Student> studentList = StudentManager.getInstance().querySomeStudents("Betty");
for (Student student : studentList) {
    System.out.println(student);
}

7、看一下運行結(jié)果,和數(shù)據(jù)庫里面的一樣,成功

studentId = 1, studentName = Betty, studentAge = 20, studentPhone = 00000000
studentId = 3, studentName = Betty, studentAge = 21, studentPhone = 22222222

為什么要使用占位符"?"

看一下第5點,大家一定注意到了,寫sql語句的時候用了"?"占位符,當(dāng)然有美化代碼的因素,不用占位符就要在括號里寫"+"來拼接參數(shù),如果要拼接的參數(shù)一多,代碼肯定不好看,可讀性不強。但是除了這個原因,還有另外一個重要的原因,就是避免一個安全問題。假設(shè)我們不用占位符寫sql語句,那"querySomeStudents(String name) throws Exception"方法就要這么寫:

public List<Student> querySomeStudents(String studentName) throws Exception
{
    List<Student> studentList = new ArrayList<Student>();
    Connection connection = DBConnection.mysqlConnection;
    PreparedStatement ps = connection.prepareStatement("select * from student where studentName = '" + studentName + "'");
    ResultSet rs = ps.executeQuery();
        
    Student student = null;
    while (rs.next())
    {
        student = new Student(rs.getInt(1), rs.getString(2), rs.getInt(3), rs.getString(4));
        studentList.add(student);
    }
        
    ps.close();
    rs.close();
    return studentList;
}

上面的main函數(shù)一樣可以獲取到兩條數(shù)據(jù),但是問題來了,如果我這么調(diào)用呢:

public static void main(String[] args) throws Exception
    {
        List<Student> studentList = new ArrayList<Student>();
        studentList = StudentManager.getInstance().querySomeStudents("' or '1' = '1");
        for (Student student : studentList)
            System.out.println(student);
    }

看下運行結(jié)果:

studentId = 1, studentName = Betty, studentAge = 20, studentPhone = 00000000
studentId = 2, studentName = Jerry, studentAge = 18, studentPhone = 11111111
studentId = 3, studentName = Betty, studentAge = 21, studentPhone = 22222222
studentId = 4, studentName = Steve, studentAge = 27, studentPhone = 33333333
studentId = 5, studentName = James, studentAge = 22, studentPhone = 44444444

為什么?看下拼接之后的sql語句就知道了:

select * from student where studentName = '' or '1' = '1'

'1'='1'永遠(yuǎn)成立,所以前面的查詢條件是什么都沒用。這種問題是有應(yīng)用場景的,不是隨便寫一下。Java越來越多的用在Web上,既然是Web,那么查詢的時候有一種情況就是用戶輸入一個條件,后臺獲取到查詢條件,拼接sql語句查數(shù)據(jù)庫,有經(jīng)驗的用戶完全可以輸入一個"‘'' or '1' = '1",這樣就拿到了庫里面的所有數(shù)據(jù)了。

Statement 和 PreparedStatement之間的關(guān)系和區(qū)別.

關(guān)系:PreparedStatement繼承自Statement,都是接口
區(qū)別:PreparedStatement可以使用占位符,是預(yù)編譯的,批處理比Statement效率高

JDBC事務(wù)

什么是事務(wù):事務(wù)就是操作一組數(shù)據(jù)庫的操作集合。如果一組處理步驟或者全部發(fā)生或者一步也不執(zhí)行,我們稱改組處理為一個事務(wù)。

事務(wù)的基本特性:原子性,一致性,隔離性,持久性。

原子性:原子性是指事務(wù)是一個不可再分割的工作單元,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

一致性:一致性是指在事務(wù)開始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫的完整性約束沒有被破壞。這是說數(shù)據(jù)庫事務(wù)不能破壞關(guān)系數(shù)據(jù)的完整性以及業(yè)務(wù)邏輯上的一致性。

如A給B轉(zhuǎn)賬,不論轉(zhuǎn)賬的事務(wù)操作是否成功,其兩者的存款總額不變。

隔離性:多個事務(wù)并發(fā)訪問時,事務(wù)之間是隔離的,一個事務(wù)不應(yīng)該影響其它事務(wù)運行效果。

在并發(fā)環(huán)境中,當(dāng)不同的事務(wù)同時操縱相同的數(shù)據(jù)時,每個事務(wù)都有各自的完整數(shù)據(jù)空間。由并發(fā)事務(wù)所做的修改必須與任何其他并發(fā)事務(wù)所做的修改隔離。事務(wù)查看數(shù)據(jù)更新時,數(shù)據(jù)所處的狀態(tài)要么是另一事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修改它之后的狀態(tài),事務(wù)不會查看到中間狀態(tài)的數(shù)據(jù)。

事務(wù)最復(fù)雜問題都是由事務(wù)隔離性引起的。完全的隔離性是不現(xiàn)實的,完全的隔離性要求數(shù)據(jù)庫同一時間只執(zhí)行一條事務(wù),這樣會嚴(yán)重影響性能。

持久性:意味著在事務(wù)完成以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便持久的保存在數(shù)據(jù)庫之中,并不會被回滾。

上述內(nèi)容就是如何使用JDBC,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當(dāng)前標(biāo)題:如何使用JDBC
當(dāng)前URL:http://aaarwkj.com/article18/jjhodp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、微信公眾號、外貿(mào)建站、電子商務(wù)品牌網(wǎng)站設(shè)計、ChatGPT

廣告

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

網(wǎng)站優(yōu)化排名
午夜福利主播一区二区| 区一区二区三视频日韩| 高潮内射主播自拍一区| 91在线视频欧美国产| 不卡一区二区黄色av| 天堂在线精品亚洲综合网| 一区二区三区国产欧美日本| 日本东京热二三四区不卡免费的| 日本一区二区手机在线| 在线看电影亚洲一区| 久久国产精品一品二品| 高潮内射主播自拍一区| 亭亭丁香激情五月涩久久| 热久久青草精品欧美一区| 国产精品三级av在线播放| 91欧美日韩中在线视频| 国产av一区二区三区久久| 日本道视频一区二区三区| 日本一区二区三级在线观看| av天堂资源地址在线观看| 欧美精品日韩中文字幕在| 无套内射精品一区二区| 97国产精品亚洲精品| 国产成人亚洲一区二区三区| 一区二区三区欧美日韩| 中文字幕人妻秘书社长| 天堂社区人妻在线亚洲| 久久五月精品综网中文字幕| 亚洲熟女少妇视频自拍| 国产夫妻性生活国产视频| 日韩欧美的一区二区三区| 国产一区二区av免费| 国产超码片内射在线| 两性色午夜视频免费网站| 久草视频免费福利观看| 久久综激情丁香开心婷婷| 韩国av高清在线观看| 亚洲第一中文字幕久久| 91九色在线精品人妻| av国语对白在线观看| 最新日本免费久久精品|