JDBC+MySQL入門實戰(實現CURD的例子)

前言

hello我是bigsai,今天我們進行JDBC+MySQL實戰,很是適合初入門的小夥伴打開新的世界。實現一個增刪改查(curd)的例子。先點贊再觀看、帥哥靚女養成好習慣!html

在這個案例進行以前,你要確保本身電腦上擁有MySQL和IDEA編譯器,另外還要安裝MySQL數據庫鏈接管理工具Navicat。方能進行如下的操做。java

若是之前沒見過或者使用過也沒關係,本課程提供傻瓜式教學你只需跟着個人要求來包成功包會。mysql

經過本翩你能夠掌握如下內容:web

  • MySQL數據庫的建立
  • JDBC+MySQL項目的建立
  • JDBC成功對MySQL增刪改查

案例分析

本次案例究竟是個什麼結果呢?本案例實現一個學生信息的管理,即學生我的信息的增刪改查。sql

核心思路拆解

咱們該如何設計這個項目呢?數據庫

別急別急,聽我慢慢說道。對於本案例的實戰,旨在實現用Java語言(JDBC)操做MySQL,核心的主軸是MySQL的數據,因此咱們從MySQL爲起始點入手,整個案例實現的流程大體能夠分爲:編程

  • 分析設計需求、建立MySQL數據庫和表
  • 建立Java項目,添加JDBC以及Junit單元測試的依賴
  • 編寫項目代碼,實現JDBC增刪改查案例
  • 單元測試

而對於JDBC編程來講,它須要與MySQL進行鏈接交互,它也有必定流程順序須要遵照,一般爲如下6個流程:安全

  •  1:註冊驅動 (僅僅作一次)
  •  2:創建鏈接(Connection)
  •  3:建立運行SQL的語句(Statement)
  •  4:運行語句
  •  5:處理運行結果(ResultSet)
  •  6:釋放資源

案例涉及知識點

本案例主要涉及的知識點爲MySQL和JDBC。而這兩個知識點是Java Web開發很是經常使用的技術,下面我就給你介紹一番。服務器

MySQL
MySQL是當前很是流行的數據庫之一,且免費開源,數據庫是用來儲存數據的,就數據格式而言,有關係型數據和非關係型數據,MySQL是一種關係型數據庫。就web方面,MySQL是最好的RDBMS(關係數據庫管理系統:Relational Database Management System)之一:MySQL的sql語句是經常使用關係數據庫的標準之一,具備速度快、體積小、成本低等優點,是中小企業以及學習使用的最好方式之一。數據結構

在Java中利用JDBC能夠快速在應用中使用MySQL。除了DDL(數據庫模式定義語言:Data Definition Language)和DML(數據操縱語言:Data Manipulation Language)等傳統操做外,你能夠經過JDBC使用MySQL的大部分功能。而且MySQL提供索引優化查詢速度,利用B+樹或哈希方式的索引知足不一樣場景查詢性能的要求。還提供視圖、函數、約束、觸發器等功能可以使得數據庫知足更多的場景使用。而MySQL提供的事務、回滾等機制可以使得數據在安全性一致性方面有更大的保證。

JDBC

Java數據庫鏈接,(Java Database Connectivity,簡稱JDBC)是Java語言中用來規範客戶端程序如何來訪問數據庫的應用程序接口(位於jdk的java.sql中)。咱們一般說的JDBC是面向關係型數據庫的,提供了諸如查詢、更新、刪除、增長數據庫中數據的方法。在使用時候須要導入具體的jar包,不一樣數據庫須要導入的jar包不一樣。

而JDBC主要有如下API:

  • DriverManager:負責加載不一樣驅動程序(Driver),並根據不一樣的請求,向調用者返回相應的數據庫鏈接(Connection)。
  • Driver:驅動程序,會將自身加載到DriverManager中去,並處理相應的請求並返回相應的數據庫鏈接(Connection)。
  • Connection:數據庫鏈接,負責與數據庫進行通信,SQL執行以及事務處理都是在某個特定Connection環境中進行的。能夠產生用以執行SQL的Statement、PreparedStatement等。
  • Statement:用以執行SQL查詢和更新(針對靜態SQL語句和單次執行)。
  • PreparedStatement:用以執行包含動態參數的SQL查詢和更新(在服務器端編譯,容許重複執行以提升效率)繼承Statement,本案例使用PreparedStatement。
  • CallableStatement:用以調用數據庫中的存儲過程。
  • SQLException:表明在數據庫鏈接的創建和關閉和SQL語句的執行過程當中發生了例外狀況(即錯誤)。

我想如今你對MySQL和JDBC有了更清楚的認識吧,MySQL就是一個數據庫供咱們使用,而JDBC就是Java使用MySQL的一個工具和橋樑,結合上面知識,下面咱們就開始實戰吧!

第一關 建立數據庫和項目

在實戰以前,須要把數據庫和項目建立好才能進行JDBC的增刪改查。

建立數據庫

咱們使用Navicat建立數據庫,你可能好奇Navicat究竟是個什麼樣的工具,有何做用?

其實Navicat是一個數據庫管理工具,它並不能直接修改MySQL的數據和結構,而是通過你的可視化界面操做它幫你執行sql代碼,由於考慮到若是直接讓你用sql操做數據庫,可能不太直觀而且上手難度挺大的,經過Navicat管理數據庫能夠清晰看到數據庫結構、數據、設置狀況也可以很容易的進行更改,大大提高開發效率必定程度減小錯誤。能夠參考下圖:

打開Navicat鏈接數據庫,鏈接成功的數據庫右擊建立數據庫,數據庫名稱爲:boxuegu,字符集和排序規則使用其默認便可。


而後打開boxuegu數據庫,在表的欄目右擊新建表,設置id,name,age,high四個字段,其中id設爲主鍵且自增。

保存時候把這張表命名爲student,代指學生表。這樣,學生表就添加完成了。其中id爲自增主鍵,插入的時候不插入id會自動遞增插入,name就是學生的姓名,age表示學生年齡。high表示學生身高,咱們用這幾個字段表示一個學生信息狀況。

固然,若是你不喜歡使用數據庫管理工具進行這樣操做,更喜歡控制檯或者命令行建立數據庫以及表格,固然也是能夠的:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for students
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `students` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `high` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這樣咱們數據庫以及表就建立完成啦,咱們下面就要用JDBC對MySQL的這張表進行增刪改查實戰。讓你動手操做數據。

建立項目

咱們建立java項目要引入JDBC的依賴,這裏我爲了更簡單不讓你去本身找JDBC的jar包,使用Maven的方式引入jar包,因此咱們使用IDEA建立Maven項目。

首先打開IDEA,建立Maven項目,點擊next。

接着填寫GroupId和ArtifactId能夠自行填寫,本案例填寫com和JDBCTest,點擊next。

緊接着選擇磁盤中一個文件夾做爲項目的路徑,點擊finish項目即建立成功。接着咱們須要添加MySQL的JDBC依賴以及Junit單元測試依賴,在項目pom.xml文件中添加如下內容:

<dependencies>
   <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
   <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.49</version>
   </dependency>
   <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
</dependencies>

而後項目就成功建立啦,緊接着建立如下類:

  • main的java目錄下:sqlmanage類,用於編寫sql相關語句
  • main的java目錄下:student類,表示student實體與MySQL的student
  • test的java目錄下:test類,用於編寫單元測試。

有了JDBC的環境只需編寫正確的代碼便可運行!對於項目最終的目錄是這樣的:

第二關 JDBC插入和查詢

咱們上面有講過進行JDBC操做的6個步驟,但有些步驟不須要重複進行,好比加載驅動、創建鏈接、關閉等能夠複用。此外,咱們在項目中將MySQL中的數據和Java中的對象進行映射(即MySQL表中每一條記錄能夠生成一個Java對象),項目中函數的設計基於Java對象而非MySQL中數據字段,下降項目中各模塊的耦合性。

預備工做

首先在student 類中編寫如下內容,該類與MySQL數據庫的student表對應。

public class student {
    private int id;//與student表得id對應
    private  String name;//與student表得name對應
    private int age;//年齡與student表得age對應
    private  int high;//身高與student表high對應
    //帶id構造方法(查詢時使用)
    public student(int id, String name, int age, int high) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.high = high;
    }
    //不帶id得構造方法(插入時候使用)
    public student(String name, int age, int high) {
        this.name = name;
        this.age = age;
        this.high = high;
    }
    //toString()方法,控制檯打印測試使用 
      @Override
    public String toString() {
        return "student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", high=" + high +
                "}\n";
    }
    //get set 方法,設置值,取值使用
    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 int getHigh() {
        return high;
    }
    public void setHigh(int high) {
        this.high = high;
    }
}

緊接着處理sqlmanage類,咱們將JDBC的一些操做封裝到這裏面。在初始化函數中進行註冊驅動、創建鏈接的操做。在sqlmanage中編寫如下內容:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class sqlmanage {
    private Connection con=null;//數據庫鏈接,從DriverManager的方法得到,用以產生執行sql的PreparedStatement
    public sqlmanage() throws SQLException, ClassNotFoundException {
        //step1 加載數據庫驅動
        Class.forName("com.mysql.jdbc.Driver");
        System.out.println("數據庫驅動加載成功");
        //step2 鏈接數據庫
        this.con =  DriverManager.getConnection("jdbc:mysql://localhost:3306/boxuegu?useSSL=false","root","bigsai66");
        System.out.println("數據庫鏈接成功");
    }
    public void close() throws SQLException {
        this.con.close();;
    }
}

其中經過Connection創建鏈接,Connection是一個接口類。其功能是與數據庫進行鏈接(會話)。創建Connection接口類對象:
Connection conn =DriverManager.getConnection(url, user, password);
其中url的格式要求爲:

  • jdbc:mysql://<host>:<port>/<database_name>?property1=value1&property2=value2…
  • host爲主機地址或者域名,本地能夠用localhost或127.0.0.1.
  • database_name爲MySQL中建立數據庫名,本案例中數據庫名爲boxuegu。
  • property用來配置一些例如編碼、時區等屬性。

其中user爲MySQL登陸用戶名,password爲MySQL登陸密碼。

單個插入

MySQL插入的sql語句很簡單:

insert into  表名
( 字段1, 字段2,...字段n)
value
( 值1, 值2,...值n );

咱們JDBC中進行插入操做使用的sql知足上述規範,在sqlmanage中編寫insertStudent(student student)函數用來插入單個學生記錄,具體函數以下:

public  void insertStudent(student student) throws SQLException {
        //建立sql語句
        String sql="insert into student(name,age,high)value(?,?,?)";
        //PreparedStatement可以對SQL語句進行預編譯,這樣防止了   SQL注入 提升了安全性。
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setString(1,student.getName());
        ps.setInt(2,student.getAge());
        ps.setInt(3,student.getHigh());
        //執行 sql 由於這裏插入操做就不對結處理
        ps.executeUpdate();
        ps.close();
    }

在test類中的編寫insertTest()函數,用來測試插入三條學生的記錄:

@Test
public void insertTest() throws SQLException, ClassNotFoundException {
      sqlmanage sqlmanage=new sqlmanage();
      sqlmanage.insertStudent(new student("bigsai",22,180));
      sqlmanage.insertStudent(new student("bigpian",21,165));
      sqlmanage.insertStudent(new student("doudou",20,160));
  }

執行完畢刷新navicat中student表你會發現數據被成功插入了:

批量插入

若是同時有100組數據或者更多若干組數據讓你插入你會怎麼操做?

  • 循環一個一個的插入

  • 批處理一次插入多個

    批量處理相比循環的單個單個處理起來省了不少時間,提升了系統效率。因此當遇到較多數據時能夠選擇多個插入。

批量插入實現也很容易,在sqlmanage中編寫insertStudents(student students[])函數用來批量插入學生記錄:

public void insertStudents(student students[]) throws SQLException {
        this.con.setAutoCommit(false);//不自動提交
        String sql="insert into student(name,age,high)value(?,?,?)";
        PreparedStatement ps =con.prepareStatement(sql);
        for(int i=0;i<students.length;i++)
        {
            ps.setString(1,students[i].getName());
            ps.setInt(2,students[i].getAge());
            ps.setInt(3,students[i].getHigh());
            ps.addBatch();
            if(i%1000==0)
            {
                ps.executeBatch();
            }
        }
        ps.executeBatch();
        con.commit();
        ps.close();
    }

其中:

  • con.setAutoCommit(false)意爲不自動提交,由於咱們在批量處理的時候通常手動提交提升效率。
  • 主要經過PreparedStatement對象的addBatch()進行多組插入而未提交。
  • 若是爲設置不自動提交當執行executeBatch()時就會提交,但爲了減少提交次數已經設置不自動提交。當且僅當con.commit()執行纔會真的提交到MySQL中。

接着在test單元測試中編寫insertStudentsTest()函數進行測試批量插入:

@Test
public void insertStudentsTest() throws SQLException, ClassNotFoundException {
    sqlmanage sqlmanage=new sqlmanage();
    student students[]=new student[5];
    for(int i=0;i<students.length;i++)
    {
        students[i]=new student("路人"+i,12,156);
    }
    sqlmanage.insertStudents(students);
}

執行完畢後你能夠看到數據被成功插入MySQL中:

查詢數據

查詢的使用頻率要遠比其餘的操做多,雖然有些複雜表的查詢可能會讓人比較頭疼,但基礎的sql查詢仍是比較簡單,其語法格式爲:

select 字段1,字段2,…… from 表名 [where 條件] //方式1
select * from 表名 [where 條件] //方式2

其中若是沒有where條件那麼就默認查詢整張表的內容,咱們在這裏根據此條件查詢全部記錄:查詢返回年齡小於21歲的全部學生

首先在sqlmanage中編寫getallstudent()函數,用來查詢student表中全部age小於21的記錄,並把查詢的數據最終以List<studnet>類型返回:

public List<student> getallstudent() throws SQLException {
        List<student>list=new ArrayList<student>();//返回的結果
        String sql = "select * from student  where age < 21";
        PreparedStatement ps = con.prepareStatement(sql);
        ResultSet resultSet=ps.executeQuery();//結果集
        while(resultSet.next())//遍歷
        {
            int id=resultSet.getInt(1);
            String name=resultSet.getString(2);
            int age=resultSet.getInt(3);
            int high=resultSet.getInt(4);
           list.add(new student(id,name,age,high));
        }
        ps.close();
        return list;
    }

在前面講的插入的過程返回值其實不須要特別處理,由於返回是插入成功與否的消息,而在查詢的步驟就要嚴格的跟着JDBC的6個步驟來—由於須要對返回的數據進行處理。咱們主要經過ResultSet處理返回的數據。

在對ResultSet進行迭代遍歷取值的過程當中,經過getXXX(int index)的方法取值並自動轉換爲java對應的數據類型。而index爲MySQL數據庫表格列的編號,也是數據在ResultSet中的對應序列號。

經過上面的函數在test單元測試中編寫selectTest() 測試函數在控制檯打印從數據庫中查詢全部age小於21的記錄:

@Test
public  void selectTest() throws SQLException, ClassNotFoundException {
    sqlmanage sqlmanage=new sqlmanage();
    List<student>list=sqlmanage.getallstudent();
    System.out.println(list.toString());
}

能夠看到數據被成功查詢:

JDBC修改和刪除

修改數據

對某個肯定的記錄修改,咱們通常根據這條信息的主鍵做爲條件進行修改。而修改通常都須要條件語句where,不然修改整個表的內容。修改的MySQL語句爲:

update 表名 set 字段 = 值 [where條件]; -- 建議都有where: 否則的話會修改每一條數據

這裏咱們假設將上述student表中全部age爲12的記錄的name設置爲xiaoming。在sqlmanage中編寫update()函數用來進行修改:

public void update() throws SQLException {
       String sql = "update student set name='xiaoming' where age=12";
       PreparedStatement ps = con.prepareStatement(sql);
       ps.executeUpdate();
       ps.close();
   }

在tes單元測試中編寫updateTest()函數調用sqlmanage類的update()方法,將student表中全部age爲12的記錄的name設爲xiaoming。

@Test
    public void updateTest() throws SQLException, ClassNotFoundException {
        sqlmanage sqlmanage=new sqlmanage();
        sqlmanage.update();
    }

刷新Navicat 你會發現數據被成功更新了:

刪除數據

JDBC刪除也是經常使用的一種操做,但刪除的操做必定要謹慎,謹防誤刪、多刪等操做。刪除的語句通常都有where條件,不然會刪除全部記錄。刪除的sql語句爲:

delete from 表名 [where條件];

咱們編寫一個按照id刪除記錄的函數,在sqlmanage中編寫deletebyid(int id),該函數意爲根據id刪除student表中對應id的一條記錄:

public  void deletebyid(int id) throws SQLException {
        String sql = "delete from student where id = ?";
        PreparedStatement ps = con.prepareStatement(sql);
        ps.setInt(1,id);
        ps.executeUpdate();
        ps.close();
    }

這麼一個根據id刪除的函數就寫好了,咱們在test單元測試中編寫deleteTest()測試函數刪除student表中id爲1的那條記錄。:

@Test
public  void deleteTest() throws SQLException, ClassNotFoundException {
    sqlmanage sqlmanage=new sqlmanage();
    sqlmanage.deletebyid(1);
}

執行完成查看數據庫發現id爲1的記錄(name爲bigsai的記錄)被成功刪除:

總結與拓展

總結

好了,本次JDBC+MySQL的增刪改查的案例就到這裏了。回顧本課程你是否是以爲一切好像沒那麼難,只須要循序漸進就能夠完成整個案例。咱們回顧一下整個流程:

  • 建立數據庫和表
  • 建立項目添加JDBC和Junit單元測試依賴
  • 編寫項目代碼(JDBC 6個步驟)
  • 單元測試

每一個流程表明一個知識點,其中最重要的就是要熟練掌握JDBC編程的流程了,掌握其方法,若是有所遺忘還得多多回顧。

拓展

MySQL本案例只使用了四種基本操做對應的sql語句:insert(插入),select(查詢),update(修改),delete(刪除)。若是須要深刻學習MySQL的話不少方面須要深刻挖掘,從sql語句上你還須要去學習MySQL複雜查詢例如關聯查詢、分組、排序等。從性能上要關注MySQL索引類型以及瞭解其底層數據結構與優點。從安全性和數據一致性你要去了解學習MySQL髒讀、幻讀等以及各類鎖的使用……

而JDBC算是在Java中一種很原生處理MySQL的方式了,而到後面隨着學習的深刻你會接觸兩個ORM框架—MybatisHibernate,固然在國內Mybatis要更流行一些。這兩個框架是對JDBC的封裝,讓開發者可以更容易的在應用中使用MySQL等關係數據庫,在Web項目有着普遍的應用,不管是之前的SSH(Spring,Strus2,Hibernate)和如今流行的SSM(Spring,SpringMVC,Mybatis),其做爲持久層的框架都是基於對JDBC的封裝處理。因此往後在學習新框架同時要記得回顧JDBC的內容,多掌握JDBC底層原理!

好啦,下課!我們後會有期!

最後,本文收錄在公衆號:bigsai 中,更多精彩與資料與您分享,歡迎mark與您一塊兒成長!同時也收錄在博學谷以關卡的新形式展示,歡迎嘗試!

相關文章
相關標籤/搜索