hello我是bigsai,今天我們進行JDBC+MySQL實戰,很是適合初入門的小夥伴打開新的世界。實現一個增刪改查(curd)的例子。先點贊再觀看、帥哥靚女養成好習慣!html
在這個案例進行以前,你要確保本身電腦上擁有MySQL和IDEA編譯器,另外還要安裝MySQL數據庫鏈接管理工具Navicat。方能進行如下的操做。java
若是之前沒見過或者使用過也沒關係,本課程提供傻瓜式教學你只需跟着個人要求來包成功包會。mysql
經過本翩你能夠掌握如下內容:web
本次案例究竟是個什麼結果呢?本案例實現一個學生信息的管理,即學生我的信息的增刪改查。sql
咱們該如何設計這個項目呢?數據庫
別急別急,聽我慢慢說道。對於本案例的實戰,旨在實現用Java語言(JDBC)操做MySQL,核心的主軸是MySQL的數據,因此咱們從MySQL爲起始點入手,整個案例實現的流程大體能夠分爲:編程
而對於JDBC編程來講,它須要與MySQL進行鏈接交互,它也有必定流程順序須要遵照,一般爲如下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:
我想如今你對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>
而後項目就成功建立啦,緊接着建立如下類:
有了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…
其中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(); }
其中:
接着在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()); }
能夠看到數據被成功查詢:
對某個肯定的記錄修改,咱們通常根據這條信息的主鍵做爲條件進行修改。而修改通常都須要條件語句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編程的流程了,掌握其方法,若是有所遺忘還得多多回顧。
MySQL本案例只使用了四種基本操做對應的sql語句:insert(插入),select(查詢),update(修改),delete(刪除)。若是須要深刻學習MySQL的話不少方面須要深刻挖掘,從sql語句上你還須要去學習MySQL複雜查詢例如關聯查詢、分組、排序等。從性能上要關注MySQL索引類型以及瞭解其底層數據結構與優點。從安全性和數據一致性你要去了解學習MySQL髒讀、幻讀等以及各類鎖的使用……
而JDBC算是在Java中一種很原生處理MySQL的方式了,而到後面隨着學習的深刻你會接觸兩個ORM框架—Mybatis和Hibernate,固然在國內Mybatis要更流行一些。這兩個框架是對JDBC的封裝,讓開發者可以更容易的在應用中使用MySQL等關係數據庫,在Web項目有着普遍的應用,不管是之前的SSH(Spring,Strus2,Hibernate)和如今流行的SSM(Spring,SpringMVC,Mybatis),其做爲持久層的框架都是基於對JDBC的封裝處理。因此往後在學習新框架同時要記得回顧JDBC的內容,多掌握JDBC底層原理!
好啦,下課!我們後會有期!
最後,本文收錄在公衆號:bigsai
中,更多精彩與資料與您分享,歡迎mark與您一塊兒成長!同時也收錄在博學谷以關卡的新形式展示,歡迎嘗試!