JDBC(1)-- jdbc入門(mén)教程之增刪改查

1.jdbc是什么

  • JDBC(Java DataBase Connectivity,java數(shù)據(jù)庫(kù)連接)是一種用于執(zhí)行SQL語(yǔ)句的Java API辐益,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一訪(fǎng)問(wèn),它由一組用Java語(yǔ)言編寫(xiě)的類(lèi)和接口組成硝枉。JDBC提供了一種基準(zhǔn)抹估,據(jù)此可以構(gòu)建更高級(jí)的工具和接口缠黍,使數(shù)據(jù)庫(kù)開(kāi)發(fā)人員能夠編寫(xiě)數(shù)據(jù)庫(kù)應(yīng)用程序。(百度百科)

  • jdbc經(jīng)常用來(lái)連接數(shù)據(jù)庫(kù)药蜻,創(chuàng)建sql或者mysql語(yǔ)句瓷式,使用相關(guān)的api去執(zhí)行sql語(yǔ)句,從而操作數(shù)據(jù)庫(kù)语泽,達(dá)到查看或者修改數(shù)據(jù)庫(kù)的目的贸典。

  • 學(xué)習(xí)jbbc要求對(duì)java編程有一定了解,并了解一種數(shù)據(jù)庫(kù)系統(tǒng)以及sql語(yǔ)句踱卵。

  • 環(huán)境要求:
    1.本地裝好jdk廊驼,并且裝好mysql數(shù)據(jù)庫(kù),我是直接裝過(guò)wamp帶有mysql數(shù)據(jù)庫(kù)/docker中安裝的mysql。
    2.使用IDEA開(kāi)發(fā)

2.使用IDEA開(kāi)發(fā)

2.1 創(chuàng)建數(shù)據(jù)庫(kù)惋砂,數(shù)據(jù)表

我的mysql是使用docker創(chuàng)建的妒挎,如果是windows環(huán)境可以使用wamp較為方便。

數(shù)據(jù)庫(kù)名字是test,數(shù)據(jù)表的名字是student西饵,里面有四個(gè)字段酝掩,一個(gè)是id,也就是主鍵(自動(dòng)遞增)眷柔,還有名字期虾,年齡,成績(jī)驯嘱。最后先使用sql語(yǔ)句插入六個(gè)測(cè)試記錄镶苞。

CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

USE test;

CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , 
`age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM; 

INSERT INTO `student` VALUES (1, '小紅', 26, 83);
INSERT INTO `student` VALUES (2, '小白', 23, 93);
INSERT INTO `student` VALUES (3, '小明', 34, 45);
INSERT INTO `student` VALUES (4, '張三', 12, 78);
INSERT INTO `student` VALUES (5, '李四', 33, 96);
INSERT INTO `student` VALUES (6, '魏紅', 23, 46);
2.2 使用IDEA創(chuàng)建項(xiàng)目

我使用maven工程方式,項(xiàng)目目錄:


image

Student.class

package model;

/**
 * student類(lèi)鞠评,字段包括id,name,age,score
 * 實(shí)現(xiàn)無(wú)參構(gòu)造茂蚓,帶參構(gòu)造,toString方法,以及get煌贴,set方法
 */
public class Student {
    private int id;
    private String name;
    private int age;
    private double score;
    
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int age, double score) {
        super();
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age
                + ", score=" + score + "]";
    }
    
}

DBUtil.class

package db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
 * 工具類(lèi)御板,獲取數(shù)據(jù)庫(kù)的連接
 * @author 秦懷
 *
 */
public class DBUtil {
    private static String URL="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf-8&serverTimezone=UTC";
    private static String USER="root";
    private static String PASSWROD ="123456";
    private static Connection connection=null;
    static{
        try {
            Class.forName("com.mysql.jdbc.Driver");
            // 獲取數(shù)據(jù)庫(kù)連接
            connection=DriverManager.getConnection(URL,USER,PASSWROD);
            System.out.println("連接成功");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    // 返回?cái)?shù)據(jù)庫(kù)連接
    public static Connection getConnection(){
        return connection;
    }
}

StudentDao.class

package dao;

import model.Student;

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

import db.DBUtil;
/**
 * 操作學(xué)生表的dao類(lèi)
 * @author 秦懷
 * 下面均使用預(yù)編譯的方法
 */
public class StudentDao {
    //將連接定義為單例
    private static Connection connection = DBUtil.getConnection();
    // 添加新的學(xué)生
    public void addStudent(Student student){
        String sql ="insert into student(name,age,score) "+
                    "values(?,?,?)";
        boolean result = false;
        try {
            // 將sql傳進(jìn)去預(yù)編譯
            PreparedStatement preparedstatement = connection.prepareStatement(sql);
            // 下面把參數(shù)傳進(jìn)去
            preparedstatement.setString(1, student.getName());
            preparedstatement.setInt(2, student.getAge());
            preparedstatement.setDouble(3, student.getScore());
            preparedstatement.execute();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("創(chuàng)建數(shù)據(jù)庫(kù)連接失敗");
        }
    }
    // 更新學(xué)生信息
    public void updateStudent(Student student){
        String sql = "update student set name = ? ,age =?,score = ? where id = ? ";
        boolean result = false;
        try {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, student.getName());
            preparedStatement.setInt(2, student.getAge());
            preparedStatement.setDouble(3, student.getScore());
            preparedStatement.setInt(4, student.getId());
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("連接數(shù)據(jù)庫(kù)失敗");
        }
    }
    // 根據(jù)id刪除一個(gè)學(xué)生
    public void deleteStudent(int id){
        String sql = "delete from student where id = ?";
        boolean result = false;
        try {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, id);
            result=preparedStatement.execute();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    // 根據(jù)id查詢(xún)學(xué)生
    public Student selectStudent(int id){
        String sql ="select * from student where id =?";
        try {
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, id);
            ResultSet resultSet = preparedStatement.executeQuery();
            Student student = new Student();
            // 一條也只能使用resultset來(lái)接收
            while(resultSet.next()){
                student.setId(resultSet.getInt("id"));
                student.setName(resultSet.getString("name"));
                student.setAge(resultSet.getInt("age"));
                student.setScore(resultSet.getDouble("score"));
            }
            return student;
        } catch (SQLException e) {
            // TODO: handle exception
        }
        return null;
    }
    // 查詢(xún)所有學(xué)生锥忿,返回List
    public List<Student> selectStudentList(){
        List<Student>students  = new ArrayList<Student>(); 
        String sql ="select * from student ";
        try {
            PreparedStatement preparedStatement = DBUtil.getConnection().prepareStatement(sql);
            ResultSet resultSet = preparedStatement.executeQuery();
            // 不能把student在循環(huán)外面創(chuàng)建牛郑,要不list里面六個(gè)對(duì)象都是一樣的,都是最后一個(gè)的值敬鬓,
            // 因?yàn)閘ist add進(jìn)去的都是引用
            // Student student = new Student();
            while(resultSet.next()){
                Student student = new Student();
                student.setId(resultSet.getInt(1));
                student.setName(resultSet.getString(2));
                student.setAge(resultSet.getInt(3));
                student.setScore(resultSet.getDouble(4));
                students.add(student);

            }
        } catch (SQLException e) {
            // TODO: handle exception
        }
        return students;
    }
}

StudentAction.class

package action;

import java.util.List;

import dao.StudentDao;

import model.Student;

public class StudentAction {

    /**
     * @param args
     */
    public static void main(String[] args) {
        StudentDao studentDao = new StudentDao();
        // TODO Auto-generated method stub
        System.out.println("========================查詢(xún)所有學(xué)生========================");
        List<Student> students =studentDao.selectStudentList();
        for(int i=0;i<students.size();i++){
            System.out.println(students.get(i).toString());
        }
        System.out.println("========================修改學(xué)生信息========================");
        Student stu2 = new Student("Jam",20,98.4);
        stu2.setId(2);
        studentDao.updateStudent(stu2);
        System.out.println("========================通過(guò)id查詢(xún)學(xué)生========================");
        Student student = studentDao.selectStudent(2);
        System.out.println(student.toString());
        System.out.println("========================增加學(xué)生========================");
        Student stu = new Student("new name",20,98.4);
        studentDao.addStudent(stu);
        System.out.println("========================刪除學(xué)生信息========================");
        studentDao.deleteStudent(4);
        System.out.println("========================查詢(xún)所有學(xué)生========================");
        students =studentDao.selectStudentList();
        for(int i=0;i<students.size();i++){
            System.out.println(students.get(i).toString());
        }
    }

}

執(zhí)行的結(jié)果:


image

需要注意的點(diǎn):

  1. 創(chuàng)建數(shù)據(jù)庫(kù)之后需要賦予用戶(hù)增刪改查的權(quán)限
  2. 如果不是使用maven方式導(dǎo)入包淹朋,需要將依賴(lài)的包復(fù)制進(jìn)來(lái),并且add to path
  3. 以上代碼使用的是預(yù)編譯的方式钉答,這樣可以提高代碼的可讀性與維護(hù)性础芍,還有就是很大程度上防止了sql注入的問(wèn)題
  4. 如果不是用預(yù)編譯,那么就需要拼接sql語(yǔ)句数尿,很容易出錯(cuò)仑性,而且預(yù)編譯的作用是sql編譯過(guò)后,放在緩存中右蹦,這樣速度會(huì)更快诊杆。
  5. 使用拼接方式參考下面這段代碼:
sql = "select * from table where name= '" + name + "' and password= '" + password+"'";
Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery(sql);

pom文件使用到的依賴(lài),必須和自己的數(shù)據(jù)庫(kù)版本匹配,要不會(huì)連接失敗

    <dependencies>
        <!-- mysql驅(qū)動(dòng)包 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.21</version>
        </dependency>
    </dependencies>

【作者簡(jiǎn)介】
秦懷何陆,公眾號(hào)【秦懷雜貨店】作者晨汹,技術(shù)之路不在一時(shí),山高水長(zhǎng)贷盲,縱使緩慢淘这,馳而不息。這個(gè)世界希望一切都很快巩剖,更快铝穷,但是我希望自己能走好每一步,寫(xiě)好每一篇文章佳魔,期待和你們一起交流曙聂。

此文章僅代表自己(本菜鳥(niǎo))學(xué)習(xí)積累記錄,或者學(xué)習(xí)筆記吃引,如有侵權(quán)筹陵,請(qǐng)聯(lián)系作者核實(shí)刪除。人無(wú)完人镊尺,文章也一樣朦佩,文筆稚嫩,在下不才庐氮,勿噴语稠,如果有錯(cuò)誤之處,還望指出,感激不盡~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仙畦,一起剝皮案震驚了整個(gè)濱河市输涕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慨畸,老刑警劉巖莱坎,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異寸士,居然都是意外死亡檐什,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)弱卡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乃正,“玉大人,你說(shuō)我怎么就攤上這事婶博∥途撸” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵凡人,是天一觀(guān)的道長(zhǎng)名党。 經(jīng)常有香客問(wèn)我,道長(zhǎng)划栓,這世上最難降的妖魔是什么兑巾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮忠荞,結(jié)果婚禮上蒋歌,老公的妹妹穿的比我還像新娘。我一直安慰自己委煤,他們只是感情好堂油,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著碧绞,像睡著了一般府框。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讥邻,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天迫靖,我揣著相機(jī)與錄音,去河邊找鬼兴使。 笑死系宜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的发魄。 我是一名探鬼主播盹牧,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼俩垃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了汰寓?” 一聲冷哼從身側(cè)響起口柳,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎有滑,沒(méi)想到半個(gè)月后跃闹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俺孙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年辣卒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掷贾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片睛榄。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖想帅,靈堂內(nèi)的尸體忽然破棺而出场靴,到底是詐尸還是另有隱情,我是刑警寧澤港准,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布旨剥,位于F島的核電站,受9級(jí)特大地震影響浅缸,放射性物質(zhì)發(fā)生泄漏轨帜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一衩椒、第九天 我趴在偏房一處隱蔽的房頂上張望蚌父。 院中可真熱鬧,春花似錦毛萌、人聲如沸苟弛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膏秫。三九已至,卻和暖如春做盅,著一層夾襖步出監(jiān)牢的瞬間缤削,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工吹榴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亭敢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓腊尚,卻偏偏與公主長(zhǎng)得像吨拗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容